Sing-box:IPv6 优先出站与 Netflix 强制 IPv6 分流

4 mins to read

很多 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 规则。