很多 VPS 的 IPv4 出口因为被滥用、共享 NAT 或者 IP 段"脏",导致访问某些服务时体验不佳。相比之下,IPv6 出口往往更干净——毕竟 IPv6 地址段大、用的人少、很多服务商对 IPv6 的风控也没那么严格。
本文记录如何在 sing-box 上实现:
- 全局 IPv6 优先:所有出站流量优先走 IPv6,IPv6 不可用时自动回退 IPv4
- Netflix 强制 IPv6:针对 Netflix 这类对 IP 质量敏感的服务,强制只走 IPv6(不回退)
前置检查
确认宿主机 IPv6 可用
在配置 sing-box 之前,先确保系统网络层的 IPv6 是通的:
# 查看 IPv6 地址(需要看到 scope global 的地址)
ip -6 addr show
# 查看 IPv6 默认路由
ip -6 route show
# 测试 IPv6 连通性
ping6 -c 4 2001:4860:4860::8888
# 测试 IPv6 HTTPS
curl -6 -I https://www.google.com
如果上述命令不通,先解决网络层问题(检查 VPS 控制台是否开启 IPv6、路由配置、防火墙规则等),否则后面配置再多也没用。
检测流媒体解锁状态
使用一键脚本检测当前 IP 的流媒体解锁情况:
bash <(curl -L -s check.unlock.media)
这个脚本会分别测试 IPv4 和 IPv6 出口对各大流媒体平台的解锁状态。如果你发现 IPv6 的解锁结果明显优于 IPv4,那就更有理由把流量往 IPv6 上引。
核心概念:domain_strategy
sing-box 的出站(outbound)支持 domain_strategy 参数,用于控制域名解析策略:
| 策略 | 行为 |
|---|---|
prefer_ipv4 | 优先 A 记录,失败回退 AAAA |
prefer_ipv6 | 优先 AAAA 记录,失败回退 A |
ipv4_only | 只用 A 记录,无 A 则失败 |
ipv6_only | 只用 AAAA 记录,无 AAAA 则失败 |
- 默认出站设置
prefer_ipv6:大部分流量优先走 IPv6,保留 IPv4 作为兜底 - Netflix 专用出站设置
ipv6_only:强制走 IPv6,不回退
配置:全局 IPv6 优先
最简单的做法是在默认的 direct 出站上加一个 domain_strategy:
{
"outbounds": [
{
"type": "direct",
"tag": "direct",
"domain_strategy": "prefer_ipv6"
}
],
"route": {
"auto_detect_interface": true,
"final": "direct"
}
}
这样所有走 direct 出站的流量都会优先尝试 IPv6。如果目标域名没有 AAAA 记录或 IPv6 不通,会自动回退到 IPv4,不影响正常使用。
进阶:Netflix 强制 IPv6
如果想对 Netflix 更激进一点——强制只走 IPv6,不要回退——可以单独定义一个出站,并用规则集把 Netflix 流量指过去。
新增 IPv6 专用出站
{
"outbounds": [
{
"type": "direct",
"tag": "IPv6-only",
"domain_strategy": "ipv6_only"
},
{
"type": "direct",
"tag": "direct",
"domain_strategy": "prefer_ipv6"
}
]
}
配置 Netflix 规则集
{
"route": {
"rules": [
{
"rule_set": [
"geoip-netflix",
"geosite-netflix"
],
"outbound": "IPv6-only"
}
],
"rule_set": [
{
"tag": "geoip-netflix",
"type": "remote",
"format": "binary",
"url": "https://github.com/MetaCubeX/meta-rules-dat/raw/refs/heads/sing/geo/geoip/netflix.srs",
"download_detour": "direct",
"update_interval": "1d"
},
{
"tag": "geosite-netflix",
"type": "remote",
"format": "binary",
"url": "https://github.com/MetaCubeX/meta-rules-dat/raw/refs/heads/sing/geo/geosite/netflix.srs",
"download_detour": "direct",
"update_interval": "1d"
}
],
"auto_detect_interface": true,
"final": "direct"
}
}
说明:
- 双规则集:
geoip-netflix匹配 Netflix 服务器 IP 段,geosite-netflix匹配 Netflix 相关域名,双保险。 - 规则集来源:使用 MetaCubeX 维护的规则集,
.srs是 sing-box 专用的二进制格式,体积小、加载快。 download_detour:规则集下载走direct,避免下载本身被绕来绕去。update_interval:每天自动更新一次规则集。
重启 sing-box 并检查状态:
systemctl restart sing-box
systemctl status sing-box
注意事项
Outbound Tag 不能重复
sing-box 启动时会校验所有 outbound 的 tag 必须唯一。如果你用的是一键脚本安装(如 233boy),可能存在"主配置 + 子配置合并"的机制,需要注意:
- 不要在多个配置文件里定义同名的
tag - 典型报错:
duplicate outbound/endpoint tag: direct - 解决:统一在主配置里定义,子配置里不要重复
ipv6_only 的风险
ipv6_only 意味着"没有 AAAA 记录就直接失败",不会回退 IPv4。如果 Netflix 某些边缘节点或 CDN 在你的网络环境下拿不到 AAAA,访问就会中断。
如果遇到问题,可以把 Netflix 的出站策略从 ipv6_only 改回 prefer_ipv6。
客户端配置(Clash/Mihomo)
如果你的客户端使用 Clash 或 Mihomo,需要确保域名是在远端(服务器侧)解析,而不是在本地解析。否则 domain_strategy 就失效了——因为流量到达 sing-box 时已经是 IP 地址,服务器无法再根据域名决定走 IPv4 还是 IPv6。
| 客户端模式 | 域名解析位置 | 客户端是否需要配置 |
|---|---|---|
| Fake-IP | 远端 | 无需额外配置 |
| Real-IP | 本地 | 需开启 sniffer + override-destination |
Fake-IP 模式(推荐)
如果客户端使用 Fake-IP 模式,域名天然就是在远端解析的:
- 客户端 DNS 返回一个假的 IP(如
198.18.x.x) - 实际域名随连接一起发送到服务器
- 服务器侧的 sing-box 拿到的是域名,
domain_strategy正常生效
Fake-IP 模式下无需额外配置,开箱即用。
dns:
enable: true
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
# ...
Real-IP 模式(需开启嗅探)
如果客户端使用 Real-IP(redir-host)模式,DNS 查询会在本地完成,流量到达服务器时已经是 IP 地址。这种情况下需要在 Mihomo 客户端开启流量嗅探(sniffer),从流量中还原出域名并覆盖目标地址。
在 Mihomo 配置中添加:
sniffer:
enable: true
override-destination: true
sniff:
HTTP:
ports: [80, 8080-8880]
TLS:
ports: [443, 8443]
QUIC:
ports: [443, 8443]
关键参数:
enable: true:开启流量嗅探override-destination: true:用嗅探到的域名覆盖原始目标地址,这样服务端的domain_strategy才能基于域名工作
注意:
override-destination会改变连接的目标地址。如果你的规则依赖 IP 匹配(如 GEOIP),需要确保规则顺序正确,或者同时配置 GEOSITE 规则。