OpenWRT基于目标IP所属国家的多WAN端口路由配置问题(附异常脚本)
OpenWRT基于目标IP所属国家的多WAN端口路由配置问题(附异常脚本)
嘿,我太懂这种按国家分流多WAN的需求了——比如国内IP走专线、境外IP走另一条线路,体验直接拉满!不过你说PBR模块不稳定,手里的脚本还跑不起来,这俩问题咱们一个个捋清楚。
先说说PBR模块“不稳定”可能的诱因:
- 是不是IP地址库没及时更新?PBR里的国家IP段如果是旧的,就会出现部分IP路由错误的情况
- 规则优先级搞反了没?要是默认路由的优先级比PBR规则还高,那PBR的分流规则根本不会生效
- 有没有给PBR规则绑定正确的“目标IP组”?要是组里的IP段不完整,也会显得整个模块“不稳定”
再看你贴的这个脚本,一眼能看到几个致命问题:
- 脚本里的转义字符乱套了——比如
TARGET_URL="http://www.ipdeny.com/ipblocks/data/countries/cn.zone"这里的"是HTML转义后的双引号,在shell脚本里必须换成正常的",不然脚本根本识别不了这个URL参数 - 脚本是截断的,到
if awk -v...就没下文了,这部分本来是要把下载的IP段转换成ipset或nftables能识别的格式,缺了核心处理逻辑,脚本肯定跑不起来 - 脚本混用了
ipset和nft命令,要是你的OpenWRT版本比较新(比如21.02之后),默认用nftables替代了iptables,ipset的命令可能会出现兼容性问题
给你两个可行的解决方向:
方向一:抢救现有脚本
- 先全局替换脚本里的所有
"为正常双引号,把所有HTML转义的符号修正 - 补全截断的awk处理逻辑,举个例子,这部分应该是把下载的每行CIDR格式的IP段,转换成nftables能导入的命令:
awk -v set="$TARGET_IPSET" '{print "add element inet fw4 " set " " $0}' "$TARGET_DL_FILE" > "$TARGET_NFT_FILE" - 先分步测试脚本的单步命令:比如手动跑
uclient-fetch --no-check-certificate -qO- 目标IP段URL > /etc/pbr_tmp_cn_ip_ranges,看看能不能正常下载IP段文件;再检查ipset list $TARGET_IPSET能不能正常调用,排除命令不存在的问题
方向二:换更稳妥的官方工具流
要是不想折腾脚本,直接用OpenWRT自带的工具组合实现:
- 手动下载对应国家的IP段文件,转换成ipset格式的IP组
- 打开PBR模块,新建路由规则:目标IP属于这个IP组的流量,指定走对应WAN口
- 给这个规则设置最高优先级,再添加一个定时任务(比如每周一次),自动下载最新的IP段文件并更新ipset,保证IP段的时效性
要是你能把脚本的完整内容贴出来,还能帮你揪出更多细节上的问题哦~
备注:内容来源于stack exchange,提问作者Damien




