前情提要:两个机子,一个是美西线路机(sing-box运行机器),一个是家宽(图便宜买的 ipv6 AT&T 家宽的 NAT,机器的 ipv4是 idc出口),机器内存128M,开了个 socks5 代理。由于内存较低,且为alpine系统所以暂不考虑在这个家宽NAT里直接运行warp。
机制
所有流量
↓ rule[0] action=resolve + strategy=prefer_ipv6
把域名目标在本地解析成 1 个确定的 IP:
有 AAAA → IPv6(优先);只有 A → IPv4;本来就是 IP → 跳过
↓ rule[1] ip_cidr ::/0 → warp-ipv6 (<家宽IP>:<socks端口>)
↓ rule[2] ip_cidr 0.0.0.0/0 → warp-ipv4 (127.0.0.1:40001)
↓ final=block(解析失败/兜底一律丢弃,不串出口)flowchart TD
A["入站连接<br/>(目标 = 域名 或 IP)"] --> B{"目标是域名?"}
B -- "是" --> C["rule0: action=resolve<br/>strategy=prefer_ipv6<br/>用本地 DNS 解析"]
B -- "否:本来就是 IP" --> D["resolve 跳过"]
C --> E{"该域名有 AAAA?"}
E -- "有" --> F["解析为 IPv6"]
E -- "无,仅 A" --> G["解析为 IPv4"]
F --> H{"最终目标 family"}
G --> H
D --> H
H -- "IPv6" --> I["rule1: ip_cidr ::/0"]
H -- "IPv4" --> J["rule2: ip_cidr 0.0.0.0/0"]
I --> K["outbound: warp-ipv6<br/>家宽NAT<br/>AT&T Residential IPv6"]
J --> L["outbound: warp-ipv4<br/>127.0.0.1:40000<br/>Cloudflare WARP IPv4"]
K --> M["落地"]
L --> M
N["解析失败 / 未匹配任何规则"] --> O["route.final = block<br/>(直接丢弃)"]配置文件示例
{
"dns": {
"servers": [
{
"tag": "dns_google",
"address": "8.8.8.8",
"detour": "direct"
},
{
"tag": "dns_cloudflare",
"address": "1.1.1.1",
"detour": "direct"
}
],
"final": "dns_google",
"strategy": "prefer_ipv6"
},
"outbounds": [
{
"type": "socks",
"tag": "warp-ipv6",
"server": "<家宽NAT的IP地址>",
"server_port": <socks5的端口>,
"version": "5",
"username": "<账号>",
"password": "<密码>",
"network": [
"tcp",
"udp"
]
},
{
"type": "socks",
"tag": "warp-ipv4",
"server": "127.0.0.1",
"server_port": 40000,
"version": "5",
"network": [
"tcp",
"udp"
]
},
{
"type": "direct",
"tag": "direct"
},
{
"type": "block",
"tag": "block"
}
],
"route": {
"rules": [
{
"action": "resolve",
"strategy": "prefer_ipv6"
},
{
"ip_cidr": [
"::/0"
],
"action": "route",
"outbound": "warp-ipv6"
},
{
"ip_cidr": [
"0.0.0.0/0"
],
"action": "route",
"outbound": "warp-ipv4"
}
],
"final": "block"
}
}经过测试,只有在分流前直接进行DNS解析才能有效的分流,否则会出现问题。
本文章采用 CC BY-NC-SA 4.0 协议授权,转载请注明来源。
文章名称:sing-box ipv4与ipv6分流
文章链接:https://blog.lhl.one/artical/1339.html