Skip to content

bestZwei/ciao-cors

Repository files navigation

CIAO-CORS

高性能、功能完整的CORS代理服务,支持多种部署方式和丰富的配置选项。专为需要跨域资源访问的Web应用设计,提供了安全、可靠的代理解决方案。

🌐 在线演示: cors.ciao.su

感谢 DreamCloud 提供的高防服务器支持,为本项目提供稳定可靠的演示环境。

功能特性

核心功能

  • 🚀 高性能CORS代理:支持所有HTTP方法和内容类型,轻松解决跨域问题
  • 🔒 安全防护:IP/域名黑白名单、恶意URL检测、请求验证
  • 智能限流:动态请求频率限制和并发控制,防止资源滥用
  • 📊 实时监控:详细的请求统计、性能分析和状态监控
  • 🎯 智能缓存:GET请求响应缓存,大幅提升性能和减少外部请求
  • 📝 完整日志:支持控制台和Webhook日志,便于追踪和分析
  • 🤖 智能伪装:优先转发真实User-Agent,自动添加浏览器标准头部,降低被识别为爬虫的风险
  • 🔄 自动重试:智能重试机制,自动处理网络波动和临时错误,大幅提升请求成功率

配置选项

  • 黑白名单:支持IP和域名级别的访问控制,精确管理代理权限
  • 频率限制:可配置的滑动窗口请求限制,自动防御恶意流量
  • 并发控制:单IP和全局并发数限制,确保系统稳定
  • 统计监控:可选的请求统计和性能监控,实时了解系统状态
  • API管理:内置管理API,支持API密钥保护,安全管理系统

部署方式

  • Deno Deploy:一键部署到全球CDN网络,极速响应全球请求
  • VPS部署:完整的一键安装和管理脚本,轻松管理自己的实例
  • Docker容器:支持容器化部署,快速集成到现有基础设施

快速开始

Deno Deploy部署

  1. 克隆项目

    git clone https://github.com/bestZwei/ciao-cors.git
    cd ciao-cors
  2. 创建Deno Deploy项目

    • 访问 Deno Deploy
    • 创建新项目
    • 选择"从GitHub部署",选择您的仓库和server.ts文件
  3. 配置环境变量

    • 在Deno Deploy控制台中设置环境变量(可选)
    • 可以配置API_KEY、限流参数、域名黑白名单等
  4. 开始使用

    • 通过 https://your-project.deno.dev/example.com/api/endpoint 格式访问
    • 第一个路径段是您要请求的目标域名和路径

VPS部署

  1. 下载部署脚本

    curl -fsSL https://raw.githubusercontent.com/bestZwei/ciao-cors/main/deploy.sh -o deploy.sh
    chmod +x deploy.sh
  2. 运行安装脚本

    sudo ./deploy.sh
  3. 按照菜单提示操作

    • 自动检测和安装Deno
    • 配置服务参数(端口、API密钥等)
    • 设置防火墙规则
    • 创建系统服务

脚本功能特性

  • 🔒 安全性: 脚本锁定机制防止并发执行,完整的权限检查
  • 🌐 兼容性: 支持Ubuntu、Debian、CentOS、RHEL、Fedora等主流发行版
  • 🔧 智能安装: 自动检测系统架构,支持x86_64和ARM64
  • 📦 依赖管理: 自动安装必要依赖,智能包管理器检测
  • 🛡️ 防火墙: 支持firewalld、ufw、iptables多种防火墙
  • 📋 备份恢复: 自动备份配置和文件,支持一键恢复
  • 🔄 更新维护: 内置脚本更新、服务更新、系统优化功能
  • 📊 监控诊断: 健康检查、性能监控、日志分析
  • 🎯 用户友好: 彩色输出、详细提示、错误处理

高级配置

环境变量

变量名 默认值 说明
PORT 3000 服务监听端口
RATE_LIMIT 2500 每个时间窗口的最大请求数
RATE_LIMIT_WINDOW 60000 限流时间窗口(毫秒)
CONCURRENT_LIMIT 10 单IP最大并发数
TOTAL_CONCURRENT_LIMIT 1000 全局最大并发数
MAX_URL_LENGTH 2048 最大URL长度
MAX_BODY_SIZE 10485760 最大请求体大小(字节,默认10MB)
TIMEOUT 30000 请求超时时间(毫秒)
ENABLE_STATS false 是否启用统计功能
ENABLE_LOGGING true 是否启用日志记录
API_KEY - 管理API密钥(可选)
LOG_WEBHOOK - 日志Webhook URL(可选)
ALLOWED_ORIGINS - 允许的来源域名列表(JSON或逗号分隔)
BLOCKED_IPS - 禁止的IP地址列表(JSON或逗号分隔)
BLOCKED_DOMAINS - 禁止的域名列表(JSON或逗号分隔)
ALLOWED_DOMAINS - 允许的域名列表(JSON或逗号分隔)
REQUIRE_HEADERS true 是否强制要求Origin或X-Requested-With头部

配置示例

基础配置

export PORT=3000
export RATE_LIMIT=100
export ENABLE_STATS=true
export API_KEY=your-secret-key

安全配置

export BLOCKED_IPS='["192.168.1.100", "10.0.0.5"]'
export ALLOWED_DOMAINS='["api.example.com", "data.example.org"]'
export BLOCKED_DOMAINS='["malicious.com", "spam.net"]'
export REQUIRE_HEADERS=true  # 强制要求Origin或X-Requested-With头部

性能配置

export CONCURRENT_LIMIT=20
export TOTAL_CONCURRENT_LIMIT=2000
export TIMEOUT=60000
export RATE_LIMIT_WINDOW=30000

API参考

代理使用

基本代理格式

https://your-domain.com/{target-url}

使用示例

# 代理GET请求(需要添加必需的头部)
curl -H "X-Requested-With: XMLHttpRequest" \
  https://your-domain.com/httpbin.org/get

# 代理POST请求
curl -X POST https://your-domain.com/jsonplaceholder.typicode.com/posts \
  -H "Content-Type: application/json" \
  -H "X-Requested-With: XMLHttpRequest" \
  -d '{"title": "test", "body": "content"}'

# 使用Origin头部(浏览器fetch会自动添加)
curl -H "Origin: https://your-app.com" \
  "https://your-domain.com/api.github.com/users/octocat"

JavaScript fetch示例

// fetch会自动添加Origin头部,无需手动设置
fetch('https://your-domain.com/httpbin.org/get')
  .then(response => response.json())
  .then(data => console.log(data));

// 或者手动添加X-Requested-With头部
fetch('https://your-domain.com/httpbin.org/get', {
  headers: {
    'X-Requested-With': 'XMLHttpRequest'
  }
})
  .then(response => response.json())
  .then(data => console.log(data));

管理API

需要设置API_KEY环境变量才能访问管理API。

健康检查

GET /_api/health?key=your-api-key

查看统计信息

GET /_api/stats?key=your-api-key

查看性能数据

GET /_api/performance?key=your-api-key

查看配置信息

GET /_api/config?key=your-api-key

查看版本信息

GET /_api/version?key=your-api-key

重置统计数据

GET /_api/reset-stats?key=your-api-key

清理缓存

GET /_api/clear-cache?key=your-api-key

热重载配置

GET /_api/reload-config?key=your-api-key

使用Bearer Token

curl -H "Authorization: Bearer your-api-key" \
  https://your-domain.com/_api/stats

安全最佳实践

🔐 基础安全配置

  1. 强制设置API密钥

    • 使用至少32位的复杂随机密钥
    • 包含大小写字母、数字和特殊字符
    • 定期轮换API密钥(建议每3-6个月)
    • 示例生成强密钥:openssl rand -base64 32
  2. 配置严格的访问控制

    • 使用域名白名单限制可代理的目标
    • 配置IP黑名单阻止恶意来源
    • 设置来源白名单控制CORS访问
    • 避免使用通配符(*)除非必要
  3. 实施多层限流保护

    • 请求频率限制:防止单IP过度请求
    • 并发连接限制:防止资源耗尽
    • 请求体大小限制:防止大文件攻击
    • 根据服务器性能调整参数

🛡️ 系统安全加固

  1. 服务运行安全

    • 使用专用非特权用户运行服务
    • 启用systemd安全特性(已内置)
    • 配置适当的文件权限(600用于配置文件)
    • 定期检查服务运行状态
  2. 网络安全配置

    • 配置防火墙只开放必要端口
    • 使用HTTPS反向代理(推荐nginx/Apache)
    • 考虑使用VPN或内网部署
    • 监控异常网络连接
  3. 日志和监控

    • 启用详细日志记录
    • 配置日志轮转防止磁盘满
    • 设置异常告警(可用Webhook)
    • 定期分析访问模式

🔄 维护和更新

  1. 定期安全维护

    • 及时更新系统和Deno运行时
    • 使用管理脚本检查服务状态
    • 定期备份配置文件
    • 运行安全检查脚本
  2. 安全检查工具

    # 运行安全配置检查
    curl -fsSL https://raw.githubusercontent.com/bestZwei/ciao-cors/main/security-check.sh | sudo bash
    
    # 或下载后运行
    wget https://raw.githubusercontent.com/bestZwei/ciao-cors/main/security-check.sh
    chmod +x security-check.sh
    sudo ./security-check.sh

⚠️ 安全警告

  • 永远不要在生产环境中禁用所有安全限制
  • 永远不要使用弱密码或默认密钥
  • 永远不要允许代理访问内网地址(已内置保护)
  • 永远不要忽略异常的流量模式
  • 定期检查是否有未授权的配置更改

性能优化

推荐配置

  • 小型站点:并发限制10,频率限制60/分钟
  • 中型站点:并发限制50,频率限制300/分钟
  • 大型站点:并发限制100,频率限制1000/分钟

优化技巧

  1. 增加缓存时间

    • 对于不经常变化的内容,可以延长缓存TTL
    • 添加自定义缓存控制头
  2. 调整并发限制

    • 对于强CPU服务器,可以增加并发限制
    • 监控系统负载,避免过载
  3. 使用VPS部署脚本的系统优化功能

    • 优化系统限制(文件描述符、连接数)
    • 调整网络参数提高吞吐量
    • 添加SWAP空间(低内存服务器)

监控指标

  • 平均响应时间(目标:<500ms)
  • 错误率(目标:<1%)
  • 并发连接数
  • 缓存命中率(目标:>70%)

故障排除

部署脚本问题

Q: 脚本提示"网络连接失败"

# 检查网络连接
ping github.com
ping deno.land

# 检查DNS设置
cat /etc/resolv.conf

# 临时使用其他DNS
echo "nameserver 8.8.8.8" > /etc/resolv.conf

Q: 健康检查显示"端口未监听"但服务在运行

# 安装网络工具
sudo apt install net-tools iproute2 lsof  # Ubuntu/Debian
sudo yum install net-tools iproute lsof   # CentOS/RHEL

# 手动检查端口
sudo ss -tuln | grep :3000
sudo netstat -tuln | grep :3000
sudo lsof -i :3000

# 检查服务日志
sudo journalctl -u ciao-cors -f

Q: 性能监控显示"netstat: command not found"

# 现代Linux系统推荐使用ss命令
sudo apt install iproute2  # Ubuntu/Debian
sudo yum install iproute   # CentOS/RHEL

# 或安装传统的net-tools
sudo apt install net-tools  # Ubuntu/Debian
sudo yum install net-tools  # CentOS/RHEL

Q: Deno安装失败

# 手动安装Deno
curl -fsSL https://deno.land/x/install/install.sh | sh
export PATH="$HOME/.deno/bin:$PATH"
sudo ln -sf $HOME/.deno/bin/deno /usr/local/bin/deno

# 验证安装
deno --version

Q: 防火墙配置失败

# 检查防火墙状态
sudo systemctl status firewalld
sudo systemctl status ufw

# 手动开放端口
sudo firewall-cmd --permanent --add-port=3000/tcp
sudo firewall-cmd --reload

# 或使用ufw
sudo ufw allow 3000/tcp

Q: 服务创建失败

# 检查systemd
sudo systemctl --version

# 手动重载systemd
sudo systemctl daemon-reload

# 检查服务文件
sudo systemctl cat ciao-cors

服务运行问题

Q: 服务启动失败,提示端口被占用

# 检查端口占用
sudo netstat -tlnp | grep :3000
sudo lsof -i :3000

# 或使用其他端口
sudo ./deploy.sh  # 选择修改配置 -> 端口号

Q: 请求被拒绝,提示Rate limit exceeded

# 调整限流配置
export RATE_LIMIT=200
export RATE_LIMIT_WINDOW=60000

Q: 代理请求超时

# 增加超时时间
export TIMEOUT=60000

Q: 统计数据不显示

# 检查统计功能是否启用
curl http://localhost:3000/_api/config?key=your-api-key

# 启用统计功能
export ENABLE_STATS=true

# 或修改配置文件
sudo sed -i 's/^ENABLE_STATS=.*/ENABLE_STATS=true/' /etc/ciao-cors/config.env
sudo systemctl restart ciao-cors

# 测试统计功能
curl https://raw.githubusercontent.com/bestZwei/ciao-cors/main/test-stats.sh | bash

Q: 客户端收到CORS错误

# 检查允许的来源设置
export ALLOWED_ORIGINS='["*"]'
# 或者指定特定域名
export ALLOWED_ORIGINS='["https://your-app.com"]'

Q: 收到"Missing required request header"错误

# 这是新的安全功能,需要添加必需的头部
# 方法1:在请求中添加X-Requested-With头部
curl -H "X-Requested-With: XMLHttpRequest" https://your-domain.com/target-url

# 方法2:在请求中添加Origin头部
curl -H "Origin: https://your-app.com" https://your-domain.com/target-url

# 方法3:如果需要禁用此功能(不推荐)
export REQUIRE_HEADERS=false
sudo systemctl restart ciao-cors

快速诊断

使用诊断脚本

# 下载诊断脚本
curl -fsSL https://raw.githubusercontent.com/bestZwei/ciao-cors/main/diagnose.sh -o diagnose.sh
chmod +x diagnose.sh

# 运行诊断
sudo ./diagnose.sh

诊断脚本会自动检查:

  • 系统状态和资源
  • 服务运行状态
  • 配置文件有效性
  • 网络连接和端口监听
  • 错误日志分析
  • 提供自动修复建议

调试技巧

查看实时日志

# systemd服务日志
sudo journalctl -f -u ciao-cors

# 或者直接运行
deno run --allow-net --allow-env server.ts

API调试

# 健康检查
curl http://localhost:3000/_api/health

# 测试代理
curl http://localhost:3000/httpbin.org/ip

# 性能数据
curl -H "Authorization: Bearer your-api-key" \
  http://localhost:3000/_api/performance

技术架构

CIAO-CORS 采用现代化的架构设计,确保高性能和可靠性:

  • 运行时环境:使用Deno运行时,获得原生TypeScript支持和安全沙箱
  • 无依赖设计:不依赖外部npm包,减少安全风险和部署复杂性
  • 内存优化:智能缓存管理和资源清理,避免内存泄漏
  • 并发控制:多级限流策略,确保系统稳定性
  • 安全增强:全面的请求验证和过滤,防止恶意请求

许可证

MIT License - 详见 LICENSE 文件

贡献指南

欢迎提交Issue和Pull Request!

  1. Fork本项目
  2. 创建功能分支 (git checkout -b feature/AmazingFeature)
  3. 提交更改 (git commit -m 'Add some AmazingFeature')
  4. 推送到分支 (git push origin feature/AmazingFeature)
  5. 开启Pull Request

开发环境设置

# 安装Deno
curl -fsSL https://deno.land/x/install/install.sh | sh

# 本地运行
deno run --allow-net --allow-env server.ts

# 类型检查
deno check server.ts

# 代码格式化
deno fmt server.ts

# 代码lint
deno lint server.ts

支持

如果这个项目对你有帮助,请给个⭐️!

联系方式


Made with ❤️ by bestZwei

About

Ciao ~ CORS ^v^: This is a Deno reverse proxy which adds CORS headers to the proxied request.

Topics

Resources

License

Stars

Watchers

Forks