很多人买 VPS 的时候会看到一行“IPv6 /64 Included”,心想:爽了,白嫖一堆地址。
结果真用起来:
ping6不通- 你域名只有 A 记录,AAAA 一直空
- Nginx 只监听 IPv4,IPv6 访问直接超时
这篇就干一件事:把 IPv6 从“摆设”变成“能用”,并且尽量别把你现有的 IPv4 配置搞炸。
先在 VPS 上看一眼:
ip -6 addr
ip -6 route
你想看到的结果通常是:
- 网卡上有一个公网 IPv6(一般是
2a01:、2400:这种开头) - 有默认路由
default via ... dev eth0
如果你只看到 fe80:: 这种链路本地地址,那基本等于“没配”。
最简单的连通性自测:
ping -6 -c 3 2606:4700:4700::1111
curl -6 -s https://api64.ipify.org && echo
ping -6通:至少路由没死curl -6能返回一个 IPv6:说明你出站 IPv6 正常
如果你这一步就不通,先别急着改 Nginx,99% 是:商家没给你开、你没加网关、或者防火墙把 v6 出站/入站搞没了。
不同发行版的差异主要在“网络配置文件放哪”。我把最常见的三类放一起,你挑你那一类就行。
先确认网卡名:
ip link
然后看一下现有 netplan 配置:
ls -l /etc/netplan/
cat /etc/netplan/*.yaml
示例(你要把 addresses/gateway6/nameservers 改成商家给你的):
network:
version: 2
ethernets:
eth0:
dhcp4: true
dhcp6: false
addresses:
- 2001:db8:1234:5678::2/64
gateway6: 2001:db8:1234:5678::1
nameservers:
addresses:
- 1.1.1.1
- 2606:4700:4700::1111
应用配置:
sudo netplan apply
看一下 /etc/network/interfaces:
cat /etc/network/interfaces
示例:
auto eth0
iface eth0 inet dhcp
iface eth0 inet6 static
address 2001:db8:1234:5678::2
netmask 64
gateway 2001:db8:1234:5678::1
重启网络(不同系统命令可能略有区别):
sudo systemctl restart networking
nmcli con show
nmcli con mod "System eth0" ipv6.method manual \
ipv6.addresses "2001:db8:1234:5678::2/64" \
ipv6.gateway "2001:db8:1234:5678::1" \
ipv6.dns "2606:4700:4700::1111 2001:4860:4860::8888"
nmcli con up "System eth0"
注意:上面的
2001:db8::是文档示例前缀,你必须换成你真实的 IPv6。
很多人“以为 IPv6 不通”,其实只是 DNS 没配。
- IPv4:A 记录
- IPv6:AAAA 记录
你可以用这两条查:
# 本机或 VPS 都行
nslookup -type=A yourdomain.com
nslookup -type=AAAA yourdomain.com
如果 AAAA 是空的,你用 curl https://yourdomain.com 时,浏览器当然只能走 IPv4。
坑点:你上了 Cloudflare 代理以后,就算源站没 IPv6,Cloudflare 也可能给你“前端 IPv6”。
- 这不代表你的 VPS IPv6 配好了
- 只是 Cloudflare 边缘节点在替你“撑门面”
想验证源站是否真的能用 IPv6,请用“直连源站”的方式测(例如直接访问 VPS 的 IPv6 或者临时把 DNS 代理关掉)。
最常见的情况:Nginx 只写了 listen 80;,没有 listen [::]:80;。
在你的站点配置里补上(示例):
server {
listen 80;
listen [::]:80;
server_name example.com;
location / {
return 200 "ok\n";
}
}
然后:
sudo nginx -t
sudo systemctl reload nginx
你可以用 IPv6 直接测:
# 用你的域名
curl -6 -I http://example.com
# 或者直接用 IPv6(注意要用中括号)
curl -I "http://[2001:db8:1234:5678::2]/"
先确认 UFW 有没有启用 IPv6:
sudo grep -n '^IPV6=' /etc/default/ufw
你希望看到:
IPV6=yes
放行端口(示例:SSH/HTTP/HTTPS):
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw reload
sudo ufw status verbose
很多人只配了 iptables,结果 IPv6 全裸奔/全被挡。
sudo ip6tables -S
sudo ip6tables -L -n -v
你要的基本规则(示例,只演示思路):
sudo ip6tables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo ip6tables -A INPUT -p tcp --dport 443 -j ACCEPT
sudo ip6tables -A INPUT -j DROP
典型原因:防火墙/安全组没开(尤其是你只开了 IPv4 规则)。
你可以在 VPS 上临时开个监听测试:
sudo python3 -m http.server 8000 --bind ::
然后从你本地:
curl -6 "http://[你的VPS_IPV6]:8000/"
这类问题一般是“路由质量”:有些网络的 IPv6 出口绕路,或者运营商对 IPv6 质量没那么上心。
处理思路很简单:
- 先用
curl -6和curl -4对比 - 如果 v6 明显不稳,可以考虑先不加 AAAA(或者让 Cloudflare 代管)
需要更细的网络定位,直接看这篇:
优先检查:
- Nginx 有没有
listen [::]:80/listen [::]:443 ssl - 后端服务(比如 Node/Go)有没有监听在
0.0.0.0但没监听::
如果你本质上是“站点打不开”,可以先走这条排查路线:
