V2.0
设计上摆脱之前一个脚本全干的思路,单个natter服务对应单个脚本,多端口需要多个natter服务。
此次实现了动态式的跳转,能保留跳转后的路径和query字符串。
具体使用方式看几遍代码应该就能看懂了
Thought for 7 seconds
> 我们有一个shell脚本,它使用Natter V2协议,并利用Cloudflare API来更新动态重定向规则。脚本的目的是根据Natter给的外部IP和端口,更新Cloudflare上已有的重定向规则(规则名为test8089),使其目标URL中的端口更新为当前的公网端口。 > > 文档需要包含: > 1. 脚本功能说明 > 2. 环境变量配置说明 > 3. 使用步骤 > 4. 注意事项 > > 注意:脚本中使用了jq, sed, curl,因此需要确保这些工具已安装。 > > 下面开始编写使用文档:此脚本用于自动化更新 Cloudflare 规则集中动态重定向规则的目标端口。当使用 Natter V2 协议获得新的公网 IP 和端口时,脚本会将规则 test8089 的目标 URL 中的端口替换为当前获得的公网端口(如将 b.test.com:OLD_PORT 更新为 b.test.com:NEW_PORT)
# 必须提前安装
sudo apt-get install jq sed curl # Debian/Ubuntu
sudo yum install jq sed curl # CentOS编辑脚本文件顶部变量(必须填写):
CLOUDFLARE_ZONE_ID='你的区域ID' # Cloudflare 区域ID
CLOUDFLARE_AUTH_KEY='Bearer令牌' # API 认证密钥
# 可选自定义项(如需更改规则名/URL)
CLOUDFLARE_RULE_NAME='test8089' # 要修改的规则名
CLOUDFLARE_RULE_FORM_URL='http://a.test.com' # 原始URL
CLOUDFLARE_RULE_TARGET_URL='http://b.test.com/' # 目标URL基础-
赋予执行权限
chmod +x script_name.sh
-
通过 Natter 自动触发(推荐)
在 Natter 的配置中直接调用脚本(参数由 Natter V2 协议提供):./script_name.sh "$1" "$2" "$3" "$4" "$5"
参数说明:
$4= 公网IP (自动捕获)
$5= 公网端口 (自动捕获) -
手动执行(测试用)
./script_name.sh protocol private_ip private_port NEW_PUBLIC_IP NEW_PORT # 示例: ./script_name.sh tcp 192.168.1.100 80 203.0.113.5 51820
- 从 Natter 获取公网 IP 和端口
- 查询 Cloudflare 现有规则集 (
test8089) - 将目标URL中的
NEW_PORT替换为实际端口(如http://b.test.com:51820/$1) - 通过 Cloudflare API 更新规则集
-
规则预处理
- 确保已在 Cloudflare 创建名为
test8089的重定向规则 - 目标 URL 格式必须为:
http://b.test.com:NEW_PORT/${1}(脚本自动替换NEW_PORT)
- 确保已在 Cloudflare 创建名为
-
权限要求
API 令牌需包含以下权限:Zone.Rulesets: [Read, Edit] Zone.Page Rules: [Read, Edit] -
错误排查
- 调试文件:脚本生成的
1.json包含提交前的规则内容 - 关键命令检查:
# 验证工具安装 which jq && which sed && which curl # 测试API连接 curl -GET -H "Authorization: Bearer $CLOUDFLARE_AUTH_KEY" \ "https://api.cloudflare.com/client/v4/zones/$CLOUDFLARE_ZONE_ID/rulesets"
- 调试文件:脚本生成的
-
URL规范
- 使用完整的 URL(包含
http://) - 尾部斜杠处理:
目标URL会统一去除结尾/(b.test.com/→b.test.com)
- 使用完整的 URL(包含
当访问:
http://a.test.com/path?query=123
将被重定向至:
http://b.test.com:NEW_PORT/path?query=123
(其中 NEW_PORT 为 Natter 获取的最新端口)
💡 建议搭配 crontab 或 systemd 服务定期检查端口变更