# /etc/isp-split.conf # openwrt-isp-split 配置文件 # ---------------------------------------------------------------- 多线路 DNS # # 为什么需要:只做"按目标 IP 纠线路"治标不治本。如果 DNS 查询本身走的是 # 另一条线,CDN 会返回那条线的节点,你拿着电信节点走联通线,速度差 100 倍。 # 让"从哪条线出去,就用哪条线的 DNS",CDN 才会主动把本运营商节点给你。 # 这是商业方案(如爱快)分流效果更好的关键,原理见 docs/DESIGN.md 的 # 「与商业方案(iKuai)的对比」一节。 # # 每条线路对应的 DNS:: DNS_TABLE=" wan_only:223.5.5.5 wanb_only:119.29.29.29 " # 多线路 DNS 的「出线方式」 # bind = server=/域名/IP@接口,用 dnsmasq 的 SO_BINDTODEVICE 绑定出接口 # mark = server=/域名/IP + nft 给发往该 DNS 的 53 端口打上对应策略的标 # # 怎么选: # · 纯 dnsmasq 环境、没装 OpenClash → bind(更直接) # · OpenClash 接管了 DNS,或解析器不是 dnsmasq → mark # (mark 只看目标 IP,不关心是谁发的查询,抗干扰;也不依赖 @接口特性) DNS_MODE="bind" # 统计未命中任何运营商集合的兜底流量(status 里显示"兜底"行) # 规则插在本工具规则块之后,命中集合的流量不会经过它 # 口径:ct state new —— 只计每条连接的**首包**。不加这一条时,若某个流 # 最终没拿到 conntrack 标记(例如 mwan3 的 default_rule_v4 被 enabled=0 # 关闭),同一连接的每个包都会重复计数,数字会按包放大。 COUNT_FALLBACK="1" # 兜底计数是否排除 DNS(udp/tcp 任一侧端口 53) # 1 = 排除(默认;出向查询 dport=53 与入向响应 sport=53 都不计) # 0 = 不排除,保持旧行为 # # 为什么默认排除:DNS 查询/响应本身不是业务流量——到网关(如 192.168.10.1:53) # 的查询在本地就被应答,到运营商 DNS 的也只是解析开销。它们占兜底包数 # 比例很高,计进去只会稀释"未命中运营商集合的真实业务流量"这个口径。 # 排除按 UDP/TCP 源或目的端口 53 判断,不写死网关地址,所以无论查的是 # 本地网关还是运营商 DNS,查询和响应都不会被当成业务流量。 COUNT_FALLBACK_SKIP_DNS="1" # 域名分流:<域名后缀>:<策略> # 这些域名的解析会被强制从对应线路发出。 # 例如 B 站:联通自有 CDN(cn-*-cu-*)需要联通 DNS 才会解析出来。 DOMAIN_SPLIT=" bilivideo.com:wanb_only bilibili.com:wanb_only " # 可选:外部域名清单目录,$DOMAINDIR/<策略>.txt,每行一个域名。 # 也兼容 felixonmars/dnsmasq-china-list 的 server=/domain/1.2.3.4 格式。 DOMAIN_LIST_DIR="" # 运营商 IP 段数据源(单源兼容模式;ISP_SOURCES 为空时才用它) # # 这里保留 clang 的基址和 <源名>.txt 命名,是为了让 0.1.x 老配置在 # ISP_SOURCES 留空时逐字节保持原行为。默认多源配置见下面的 ISP_SOURCES。 ISP_MIRROR="https://ispip.clang.cn" # ---------------------------------------------------------------- 多数据源(0.2.1 默认双源) # # 格式:每行一条 <名字>:<角色>:<镜像基址> # 角色 primary 出数据(必须且只能有一个) # verify 只用来跑日 diff,不参与合成 # audit 低频审计源(同样只跑 diff) # # 0.2.1 默认:"主源 + 校验源"(方案 c) # · 主源换成 gaoyifan/china-operator-ip(MIT,BGP/AS_PATH 口径) # · clang 只做运行时校验源:默认每天下载、跑 Jaccard diff,不参与合成 # · 校验源连续失败 1-2 天只降级;达到 ISP_SOURCE_MAX_FAIL_DAYS 天则拒绝更新 # · 主源失败立即冻结(保留旧数据),绝不自动换源——换源=换口径 # # 留空 = 单源兼容模式:仍按上面的 ISP_MIRROR/<源名>.txt 拉取, # 行为与 0.1.x 完全一致。老配置不需要改任何东西。 # # 注意:升级时 opkg/apk 会保留用户已有的 /etc/isp-split.conf。这里改的只是 # 新安装的默认模板;已有配置里显式声明的 ISP_SOURCES 不会被覆盖。 ISP_SOURCES=" yfgao:primary:https://china-operator-ip.yfgao.com clang:verify:https://ispip.clang.cn " # 每个源的"文件名映射":<源名>:=<该源上的文件名>,... # # 必须显式声明:clang 的文件名是 chinatelecom.txt,yfgao 的同一个运营 # 商叫 chinanet.txt。按名字猜一定会错,所以这里只认声明。 # # 规则:某个源只要声明了任意一条映射,映射里没列出的运营商默认不下载; # 若该运营商已启用,主源会按历史命名 <源名>.txt 再试一次(兼容 0.2.0 老配置), # 文件不存在时 fetch 直接报错。校验源/审计源只认映射,绝不去猜。 # # yfgao 只有 chinanet/unicom/cmcc/cernet 四类运营商数据,没有 # chinabtn/gwbn/othernet/hk/mo/tw。所以 ISP_TABLE 里后六类默认保持 0(关闭); # 若要启用它们,需要把主源换成提供这些文件的源,或自行补映射。 ISP_SOURCE_FILES=" yfgao:chinatelecom=chinanet,unicom_cnc=unicom,cmcc=cmcc,cernet=cernet clang:chinatelecom=chinatelecom,unicom_cnc=unicom_cnc,cmcc=cmcc,cernet=cernet " # 是否启用校验源(0 = 不下载不校验;0.2.1 起默认 1) ISP_VERIFY_ENABLE=1 # 分歧阈值:某个运营商的 Jaccard 低于这个百分比就拒绝本次更新(退出码 3) # 实测正常值 95.7%-96.9%,口径切错时 64.6%-87.9%,90 是中间带 ISP_DIFF_MAX_JACCARD_DROP=90 # 单运营商地址数日变化上限(%),只在校验源启用时生效 ISP_DIFF_MAX_DELTA_PCT=3 # 校验源连续失败多少天后,从"降级继续"升级为"拒绝更新" ISP_SOURCE_MAX_FAIL_DAYS=3 # 运营商表,格式:<源文件名>:::<是否启用> # # 顺序即优先级:排在前面的运营商优先占有重叠地址。 # 同一个 IP 只会出现在一个集合里,所以调整这里的顺序会改变归属, # 但不会出现"规则先后决定归属"的隐性行为。 # # 集合名同时也是 mwan3 规则名,mwan3 限制规则名 <=15 字符, # 且不能以 mwan3_ 开头(该前缀为 mwan3 内部保留)。 # # 策略名必须已在 mwan3 中定义,可用 `mwan3 status` 或 # `uci show mwan3 | grep policy` 查看。 ISP_TABLE=" chinatelecom:isp_tel:wan_only:1 unicom_cnc:isp_uni:wanb_only:1 cmcc:isp_cmcc:wanb_only:1 cernet:isp_cernet:wan_only:1 chinabtn:isp_tietong:wanb_only:0 gwbn:isp_gwbn:balanced:0 othernet:isp_other:wanb_only:0 hk:isp_hk:wanb_only:0 mo:isp_mo:wanb_only:0 tw:isp_tw:wanb_only:0 " # 关于 othernet 默认关闭(实测教训): # othernet 是"三大运营商以外"的集合(华为云、腾讯云、各类 IDC、 # 以及**公共 DNS** 如 223.5.5.5 / 119.29.29.29 都可能落在这里)。 # 启用它之后,路由器自己的 DNS 查询会被分到这条线上——如果这条线 # 恰好不可用,整个域名解析就挂了(实测:启用后所有域名解析失败)。 # 要启用它,先确认你的 DNS 服务器不属于该集合,或者给策略配好备份成员。 # 关于 cmcc(移动)默认走联通的实测依据: # Steam 移动 CDN(39.134.x)实测 联通 22ms / 电信 72ms,联通明显更好, # 而 Steam 下载是典型大流量场景,故默认给联通。 # # 已知例外:B 站 PCDN(*mcdn.bilivideo.cn)虽然是移动段, # 实测 电信 12-22 MB/s 而联通只有 0.04-1 MB/s。若你常用 B 站且命中 mcdn, # 应改用域名/网段级覆盖,而不是把 cmcc 整体改回电信—— # B 站自有联通 CDN(cn-*-cu-*)恰恰需要走联通才快。 # 规则插入位置:在第一个匹配该正则的 mwan3 rule 之前插入运营商规则。 # 默认插在按端口/兜底规则之前、按设备/IP 的规则之后。 ISP_ANCHOR='dest_port|src_port|default_rule|https|internet' # 每日自动更新(crontab 时间) ISP_CRON="17 4 * * *" # 分线测速用的接口与探测目标 PROBE_IFACES="pppoe-wan1 pppoe-wan2" PROBE_BYTES=33554432 PROBE_TIME=25 PROBE_URLS=" https://mirrors.huaweicloud.com/ubuntu-releases/24.04/ubuntu-24.04.3-live-server-amd64.iso https://mirrors.aliyun.com/ubuntu-releases/24.04/ubuntu-24.04.3-live-server-amd64.iso " # lc:begin # ---------------------------------------------------------------- 线路体检(0.3.0) # # `isp-split linecheck` 对每条 WAN 做:本机口 IP 分类(公网/CGNAT/私网)、 # curl --interface 出口 IP、同运营商目标四段延迟、IP 归属地、双 STUN NAT 判定、 # 评分与一句话建议。结果缓存 LINE_CHECK_MIN_INTERVAL 秒,--force 可绕过。 # # 注意:NAT 只给「公网 / 锥形 / 对称或多出口 / CGNAT / 未知」五态, # 不做 NAT1-4 细分——公网 STUN 服务器基本不支持 CHANGE-REQUEST(见可行性报告)。 # 体检不会修改 mwan3/nft 规则;失败只降级单项,不影响上网。 # 总开关:0=完全不执行(LuCI 页面也会提示已关闭) LINE_CHECK_ENABLE=1 # 归属地隐私开关:1=允许向第三方查询出口 IP 归属地;0=只关闭归属地查询 # # 开启后,体检会把**每条 WAN 的出口公网 IP**发送给第三方(默认百度, # 默认只走百度 HTTPS)查询归属地。只发送出口 IP,不发送内网地址、设备名、 # MAC、流量内容。ip-api 是显式选项且使用 HTTP 明文,不是默认兜底;介意时 # 请设为 0,或把 LINE_CHECK_GEO_PROVIDER 固定为 baidu。 # 关闭后不发起任何归属地请求,卡片显示「归属地:未查询(隐私开关关闭)」。 # 省/市不可知,但仍可用本地 @isp_* 集合判断运营商大类,不需要外发。 # 注意:此开关只关归属地;出口 IP 回显、STUN 与延迟探测仍会外发。 # 要完全停止体检,请设 LINE_CHECK_ENABLE=0。 LINE_CHECK_GEO=1 # 归属地服务商:auto | baidu | ip-api | off # auto 只走百度(HTTPS、国内可达);ip-api 不再自动兜底 # baidu 只用百度;失败显示「归属地未知」,不会自动转 HTTP 源 # ip-api 只用 ip-api(HTTP,明文) # off 等同 LINE_CHECK_GEO=0 LINE_CHECK_GEO_PROVIDER="auto" # 归属地缓存有效期(秒)。同一个出口 IP 在有效期内只查一次。 LINE_CHECK_GEO_TTL=86400 # 手动触发的最小间隔(秒)。间隔内重复执行直接返回上次结果(缓存), # LuCI 的「立即体检」按钮也按这个值节流。范围 15-3600。 LINE_CHECK_MIN_INTERVAL=60 # 单次探测量(1-10 秒):curl --connect-timeout 与 socat -T 都用它。 # 宽带正常时 3 秒足够;线路很差可调到 5,但整次体检会更慢。 LINE_CHECK_TIMEOUT=3 # 单条 WAN 的探测预算(秒)。超过后跳过剩余的 STUN/归属地, # 只保留已完成的项目并在明细里标注,避免 LuCI/rpcd 超时(建议 15-25)。 LINE_CHECK_BUDGET=20 # 每条 WAN 的同运营商探测目标:<运营商源名>:<域名1>,<域名2> # 源名必须与 ISP_TABLE 第一列一致;域名运行时解析,再用对应 @isp_* 集合 # 校验归属(不随机抽集合 IP、不扫端口)。全部失败时用下面的跨网基线兜底, # 并在卡片上标注「跨网基线」,延迟项最多 15 分。 LINE_CHECK_TARGETS=" chinatelecom:www.chinatelecom.com.cn,www.21cn.com unicom_cnc:www.10010.com,www.chinaunicom.com.cn cmcc:www.migu.cn,www.10086.cn cernet:www.tsinghua.edu.cn,www.pku.edu.cn " # 跨网基线目标(仅用于判断“链路是否通”,不计入同网延迟分) LINE_CHECK_BASELINE="www.baidu.com,www.qq.com" # STUN 服务器:<域名或 IP>:<端口>,按顺序解析,取两个不同 IP 各探一次。 # 同一本地端口 + so-bindtodevice 锁线;失败自动换下一个/重试一次。 # 公网 STUN 可达性会波动,不要只写一个;UDP 3478 被阻断时只降级为“未知”。 # 可选:stun.chat.bilibili.com:3478(实测有时无 A 记录,按需加回列表) LINE_CHECK_STUN_SERVERS=" stun.miwifi.com:3478 stun.douyucdn.cn:18000 stun.freeswitch.org:3478 stun.cloudflare.com:3478 " # 出口 IP 回显服务(逗号分隔,按顺序尝试)。只用于拿公网出口 IP。 # F-23:默认回显源改为国内可达的 HTTPS 服务,按顺序尝试。允许返回裸 IP # 或含 IP 的文本(如 ipip.net 的“当前 IP:x.x.x.x”),取第一个合法 IPv4。 # 不要放境外 api.ipify.org / icanhazip.com:国内运营商网络经常 RST/超时。 LINE_CHECK_ECHO_URLS="https://ip.3322.net,https://myip.ipip.net,https://ddns.oray.com/checkip" # 体检请求的 User-Agent。部分运营商站点对默认 curl UA 返回 412/418, # 必须带浏览器 UA;不要改成空值。 LINE_CHECK_UA="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36" # lc:end