在 Hetzner VPS 上开启 IPv6 通常只需在操作系统层面配置网卡,Nginx 反向代理则需监听 [::] 端口并在 upstream 中使用方括号包裹 IPv6 地址。适用场景为需要双栈访问或后端服务仅支持 IPv6 的环境,主要风险在于防火墙规则未放行 IPv6 流量导致连接超时。
先说结论:Hetzner 云实例默认分配 IPv6 子网,重点在于系统网络配置与 Nginx 语法兼容性,无需额外购买服务。
- 适合:Hetzner Cloud 实例及大多数现代 Linux 发行版
- 先准备:确认控制台已分配 IPv6 子网且 Nginx 编译包含 IPv6 模块
- 验收:通过 curl -6 测试连通性且日志无 connect() failed 报错
命令速用版
# 检查系统是否获取到 IPv6 地址
ip -6 addr
# 检查 Nginx 是否编译了 IPv6 支持
nginx -V | grep -i ipv6
# 放行 IPv6 流量(以 UFW 为例)
ufw allow ipv6
# 测试 IPv6 连通性
curl -6 https://ipv6.google.com为什么会这样
Nginx 区分 IPv4 和 IPv6 的监听指令格式,且 upstream 中 IPv6 地址必须加方括号以避免端口解析错误。Hetzner 网络层面已通,若系统未配置或 Nginx 未监听,流量无法到达后端。
IPv6 地址包含冒号,若在上游服务器配置中不加方括号(如 server 2001:db8::1:80),Nginx 会将冒号后的数字误判为端口或报错 invalid port。监听指令 listen [::]:80 表示监听所有 IPv6 接口的 80 端口,若仅写 listen 80 则仅监听 IPv4。
分步处理
第一步:确认 Hetzner 控制台网络设置
登录 Hetzner Cloud 控制台,进入 Project 选择对应 VPS,检查 Network 标签页是否显示 IPv6 子网(通常为/64)。若未显示,需在控制台启用 IPv6 并重启实例。
第二步:配置操作系统网络
根据发行版配置静态 IPv6 或确认 DHCPv6 已获取地址。Ubuntu 20.04+ 通常使用 Netplan,配置文件位于/etc/netplan/。确保配置中包含 IPv6 地址和网关,应用配置后运行 ip -6 addr 确认有 global 类型地址。
第三步:修改 Nginx 配置
在 server 块中添加 IPv6 监听指令,upstream 块中 IPv6 地址加方括号。示例配置如下:
upstream backend_v6 {
server [2001:db8::100]:3000;
}
server {
listen 80;
listen [::]:80;
server_name app.example.com;
location / {
proxy_pass http://backend_v6;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}第四步:配置防火墙
检查系统防火墙(如 ufw、firewalld)是否允许 IPv6 流量。同时检查 Hetzner 云防火墙(Cloud Firewall)规则,确保入站规则允许 TCP 80/443 且协议族包含 IPv6。
怎么验证是否生效
使用 curl -6 命令从外部 IPv6 环境访问域名,观察返回状态码。检查 Nginx 错误日志/var/log/nginx/error.log,确认无 connect() failed (101: Network is unreachable) 报错。运行 nginx -T 确认配置中 listen 指令包含 [::]。
常见坑
Upstream 地址缺少方括号:直接写 IPv6 地址会导致 Nginx 启动失败或解析错误,必须使用 [IP]:Port 格式。
ipv6only 参数冲突:在 listen [::]:80 中若添加 ipv6only=on,则该 socket 仅处理 IPv6,若需双栈兼容且系统支持双栈绑定,可 omit 该参数或设为 off,但需注意不同操作系统内核默认行为差异。
云防火墙拦截:系统内部防火墙放行但 Hetzner 控制台防火墙未放行 IPv6 段,导致外部无法连接。
常见问题
Nginx 启动报错 invalid port while resolving hostname 怎么办?
检查 upstream 块中的 IPv6 地址是否缺少方括号,必须写成 [2001:db8::1]:80 格式。
后端仅支持 IPv6 但客户端是 IPv4 能访问吗?
可以,Nginx 服务器本身需同时拥有 IPv4 和 IPv6 地址,Nginx 会作为网关进行协议转换,前提是 Nginx 主机路由可达。
如何确认 Nginx 是否支持 IPv6 模块?
运行 nginx -V 命令,查看输出参数中是否包含 `--with-ipv6` 或默认编译信息中显示支持,现代发行版默认通常已启用。
参考来源
- 技术知识库:如何配置 Nginx 代理支持后端服务器的 IPv6 环境
- 技术知识库:Nginx 反向代理解决 IPv6 报错与跨网段访问的详细步骤
- 技术知识库:【服务器知识】nginx 配置 ipv6 支持
- 技术知识库:Nginx 配置 HTTPS 和 IPV6(保姆级教程)