开启 3 天免费试用
注册即可免费体验全部高级功能。
*仅限新用户;每位用户只能获得一次试用。


要让自建代理走 VPS IPv6 出站,服务器需要一个可用的全局 IPv6 地址和默认路由,代理本身也要知道解析目标时优先使用哪个地址族。先确认服务商的分配方式,再依次配置系统、防火墙和 sing-box,并保留经过测试的 IPv4 作为回退。本文依据文末列出的官方来源整理,未完成完整端到端实测。
关键要点
- 能配置什么取决于服务商的分配方式,动手修改前先把它弄清楚。
- 邻居发现(Neighbor Discovery)依赖 ICMPv6,全部拦截可能让 IPv6 路径失效。
- 在 sing-box 1.12 及以后版本中,IPv6 优先设置写在
domain_resolver里,而不是已弃用的domain_strategy。- 本文只使用一个固定 IPv6 地址,不涉及轮换地址来规避封禁或限速。
代理服务器会代表客户端,向每个目标新建一条连接。客户端发来域名时,由代理解析并选择 IPv4 或 IPv6 地址;客户端直接发来 IP 时,地址族已经确定。在 sing-box 中,这个选择由拨号字段(dial fields)控制,它们还能把出站连接绑定到指定的本机 IPv6 地址。[1]
所以服务器需要两样东西:在操作系统层面可用的 IPv6 路径,以及会使用这条路径的代理设置。更完整的运维责任可参考自建服务规划指南。如果你对地址族还不熟悉,建议先读IPv4 与 IPv6 寻址方式的差异,因为下面的检查默认你能看懂 IPv6 前缀。
这是服务器端的改动。客户端设备让 IPv6 绕过隧道发出,是另一个问题,详见IPv6 泄露的原理说明。
服务商通常采用几种常见的分配方式,每种方式下“添加一个地址”的含义都不一样。如果是链路内(on-link)前缀,上游路由器会通过邻居发现找到你的地址:它发出邻居请求(Neighbor Solicitation),只有真正配置在你网卡上的地址才会应答。[2] 如果是路由前缀,服务商会把整个前缀转发到你已经持有的某一个地址。
| 分配方式 | 路由器的预期 | 需要配置什么 | 主要风险 |
|---|---|---|---|
| 单个 /128 | 一个地址应答 ND | 该地址和指定网关 | 地址或网关写错 |
| 链路内 /64 | 链路上的地址应答 ND | 从前缀中选定的一个地址 | 使用了从未配置的地址 |
| 路由 /64 | 前缀转发到链路地址 | 链路地址加前缀用法 | 漏掉单独的链路地址 |
| 通过 RA 的 SLAAC | 链路上的路由器通告 | 接受 RA,避免静态重复 | 开启转发后 RA 被忽略 |
准确的地址、前缀长度和网关请以服务商控制面板或文档为准;有些服务商使用 fe80::1 这样的链路本地网关。本文其余部分只使用一个固定地址。为了绕过平台封锁或限制而按连接轮换大量地址,不在本文范围内,还可能违反服务商或目标服务的条款。
先通过 IPv4 登录,这样 IPv6 配置出错也不会把你锁在外面。记录当前状态:
ip -6 addr show scope global
ip -6 route show default
sysctl net.ipv6.conf.all.forwarding
sysctl net.ipv6.conf.eth0.accept_ra
curl -6 -sS -o /dev/null -w '%{http_code}\n' https://example.com
把 eth0 换成你的网卡名。如果有全局地址、有默认路由,且 curl -6 成功,说明系统层面的路径已经可用,可以直接跳到步骤 3。有全局地址但没有默认路由,或者根本没有全局地址,就需要做步骤 2。
accept_ra 的取值对同时转发流量的代理服务器(例如 VPN 端点)很重要。accept_ra 为 1 时,内核只在转发关闭的情况下接受路由器通告;为 2 时,即使开启转发也会接受。[3] 如果服务商依赖 RA 而你开启了转发,默认路由可能会悄无声息地消失。
在使用 Netplan 的 Ubuntu 服务器上,新增一个单独的文件,不要直接改服务商生成的文件,并备份 /etc/netplan/ 下的每个现有文件。下面的示例设置一个地址和一条 Netplan IPv6 默认路由,使用文档专用前缀 2001:db8::/32;请把地址、前缀长度、网关和网卡替换成服务商给出的值。
network:
version: 2
ethernets:
eth0:
addresses:
- "2001:db8:1234:5678::10/64"
routes:
- to: "::/0"
via: "fe80::1"
on-link: true
Netplan 的 addresses 会在 DHCP 或 RA 获得的地址之外追加静态地址,routes 至少要写 to,而且每个地址族、每张路由表只能定义一次默认路由。[4] on-link: true 告诉系统网关是直连的,当网关不在你的前缀范围内时尤其重要。如果服务商用的是 RA,就设置 accept-ra: true 并省略静态路由,避免出现两条相互竞争的默认路由。[4]
用带安全计时的方式应用:
sudo netplan try
netplan try 会先应用配置,如果你没有在默认 120 秒内确认,就自动回滚;超时或取消后,要检查旧状态是否真的恢复了。[5] 确认之前,再执行一遍步骤 1 的命令。
邻居发现运行在 ICMPv6 之上,所以拦截全部 ICMPv6 的防火墙,可能让配置正确的地址也无法访问。[2] 请放行防火墙工具标注为 IPv6 必需的 ICMPv6 类型,而不是写一条一刀切的拒绝规则。
接着检查暴露面。监听在 [::] 上的代理会接受 IPv6 连接,所以你为 IPv4 写的入站规则也需要对应的 IPv6 规则。把 ss -lntup 的输出和防火墙的 IPv6 规则列表对照,确认管理端口和只供本机使用的监听在两个地址族上都没有对公网开放。
从 sing-box 1.12.0 起,拨号字段 domain_strategy 已被弃用,计划在 1.14.0 移除;替代方案是一个指定 DNS 服务器和策略的 domain_resolver 对象。[1][6] 策略可选值为 prefer_ipv4、prefer_ipv6、ipv4_only 和 ipv6_only。[7]
下面的片段只保留关键部分:一个通过宿主系统解析的 local DNS 服务器、一个优先 IPv6 的直连出站,以及一个绑定在回环地址上的测试入站,这样就能实现 sing-box IPv6 优先。[8] 请把它合并进现有配置,不要替换你真正在用的入站。
{
"dns": {
"servers": [{ "type": "local", "tag": "local" }]
},
"inbounds": [
{ "type": "mixed", "tag": "test-in", "listen": "127.0.0.1", "listen_port": 2080 }
],
"outbounds": [
{
"type": "direct",
"tag": "direct-out",
"inet6_bind_address": "2001:db8:1234:5678::10",
"domain_resolver": { "server": "local", "strategy": "prefer_ipv6" }
}
],
"route": { "final": "direct-out" }
}
inet6_bind_address 会把 IPv6 连接固定到你在步骤 2 配置的地址;如果只有一个全局地址,可以省略。[1] 执行 sing-box check -c /etc/sing-box/config.json,检查通过后再重启服务。
| 策略 | 目标同时有 A 和 AAAA | 仅有 IPv4 的目标 | 适用场景 |
|---|---|---|---|
prefer_ipv4 | 使用 IPv4 | 使用 IPv4 | IPv6 刚配置、尚未测试 |
prefer_ipv6 | 使用 IPv6 | 回退到 IPv4 | 希望有 IPv6 时就用 IPv6 |
ipv6_only | 使用 IPv6 | 连接失败 | 单独测试 IPv6 路径 |
ipv4_only | 使用 IPv4 | 使用 IPv4 | 快速回滚 |
在服务器本机通过回环入站测试。--socks5-hostname 会把域名交给代理,由 sing-box 完成解析并应用策略。
curl -sS --socks5-hostname 127.0.0.1:2080 -o /dev/null -w '%{remote_ip}\n' https://example.com
下表是预期现象,实际结果请自行记录。
| 检查方法 | 预期现象 | 失败时处理 |
|---|---|---|
| 经测试入站访问双栈网站 | 通过 IPv6 建立连接 | 复查步骤 1 和绑定地址 |
prefer_ipv6 下访问仅 IPv4 网站 | 连接回退到 IPv4 | 确认没有设成 ipv6_only |
| 客户端设备经真实入站访问 | IP 检测显示服务器的 IPv6(走 IPv6 路径时) | 对比客户端 DNS 和代理规则 |
| 扫描 IPv6 上的公网端口 | 只有预期端口应答 | 补上缺失的 IPv6 规则 |
在连接到你代理的客户端上,查看外部看到的是哪个地址。结果是 IPv6,说明网页请求走了新路径;结果是 IPv4 也可能是正常的,因为网站本身或客户端自己的解析选择了 IPv4。测试结束后删除测试入站。
回滚期间保持 IPv4 会话不断开。删除或移走你新增的 Netplan 文件,执行 sudo netplan apply,确认 ip -6 route show default 与步骤 1 的记录一致。在 sing-box 中把策略改为 prefer_ipv4 或 ipv4_only,删除 inet6_bind_address,执行配置检查后重启。
如果服务器无法访问,用服务商的网页控制台删除新增的文件。不要一上来就在内核层面整体禁用 IPv6;ip-sysctl 文档指出,写入 disable_ipv6 的 all 值会一次性改动所有网卡。[3]
IPv6 出站改变的是服务器走的路径,而不是你的身份。目标看到的仍然是一个与你的 VPS 绑定的固定地址。如果你的目的是不想承担运营者的责任,托管服务可能比自己维护的服务器更合适。
当目标没有 IPv6、服务商的 IPv6 路径不稳定,或者你需要按用户分配地址时,它同样不是合适的工具。这些情况下保持 prefer_ipv4,等服务商修好路径后再评估。家用路由器获取委派前缀则是另一套流程,见OpenWrt 前缀委派指南。
netplan try 添加一个地址和一条默认路由,同时保持 IPv4 访问。prefer_ipv6 的 domain_resolver,再同时测试 IPv6 和 IPv4 回退。不需要。一个可用的全局地址加一条默认路由,就足以让代理访问 IPv6 目标。/64 只是给你更多可选的地址而已。
通常是默认路由缺失,或者指向了错误的网关。把 ip -6 route show default 和服务商给出的网关对照,并检查防火墙是否在丢弃 ICMPv6。
1.12 及以后版本不应再用。该字段在这些版本中已被弃用,计划在 1.14.0 移除,请把优先设置迁移到带策略值的 domain_resolver 对象中。
不会。使用 prefer_ipv6 时,没有 AAAA 记录的目标仍会通过 IPv4 访问;只有 ipv6_only 才会让这类连接失败。
accept_ra 为 1 时,一旦开启转发,内核就会忽略路由器通告。请在该网卡上把 accept_ra 设为 2,或者改为配置静态默认路由。
本文不涉及这种做法。为绕过封锁或限制而轮换地址,可能违反服务商和网站的条款,本文的流程始终只使用一个固定地址。
不会。它只改变承载流量的地址族。目标看到的仍是登记在你 VPS 名下的地址,隐私程度仍取决于原先的运营者和日志选择。
免责声明: 本文仅供一般信息参考,不构成法律、技术或其他专业建议。我们不保证内容的准确性、完整性或时效性。请遵守托管服务商的可接受使用政策以及你所连接服务的条款。
来源:
Sources checked 2026 年 10 月 14 日。
延伸阅读:
注册即可免费体验全部高级功能。
*仅限新用户;每位用户只能获得一次试用。