如何在 Hetzner VPS 上开启 IPv6 并配置 Nginx 反向代理

文章导读
在 Hetzner VPS 上开启 IPv6 通常只需在操作系统层面配置网卡,Nginx 反向代理则需监听 [::] 端口并在 upstream 中使用方括号包裹 IPv6 地址。适用场景为需要双栈访问或后端服务仅支持 IPv6 的环境,主要风险在于防火墙规则未放行 IPv6 流量导致连接超时。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

在 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 并重启实例。

第二步:配置操作系统网络

如何在 Hetzner VPS 上开启 IPv6 并配置 Nginx 反向代理

根据发行版配置静态 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 指令包含 [::]。

如何在 Hetzner VPS 上开启 IPv6 并配置 Nginx 反向代理

常见坑

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(保姆级教程)