要实现 IPv6-only 的 VPS(我们称之为 VPS6)通过另一台双栈或具有 IPv4 出口的 VPS(我们称之为 VPS4)访问仅有 IPv4 地址的 NFS 服务器,最稳妥的办法是利用 WireGuard 构建一个隧道。

在这个模型中,VPS4 充当“网关”或“中转站”。

以下是具体的配置步骤:

1. 架构逻辑

  • VPS4 (中转端):拥有 IPv6(用于和 VPS6 握手)和 IPv4(用于连接 NFS)。
  • VPS6 (客户端):IPv6-only,通过 WireGuard 隧道获得一个私有 IPv4 地址。
  • 隧道内网段:假设为 10.8.0.0/24。

2. VPS4 侧配置 (作为服务端)

在 VPS4 上编辑 /etc/wireguard/wg0.conf:

Ini, TOML

[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = <VPS4_私钥>

# 开启转发(非常重要,否则流量出不去)
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
# VPS6 的信息
PublicKey = <VPS6_公钥>
AllowedIPs = 10.8.0.6/32

注意:eth0 是 VPS4 连接公网/NFS 服务器的网卡名称,请根据 ip route 实际结果修改。


3. VPS6 侧配置 (IPv6-only 客户端)

在 VPS6 上编辑 /etc/wireguard/wg0.conf:

Ini, TOML

[Interface]
# 即使物理网卡只有 v6,这里也要分配 v4 地址
Address = 10.8.0.6/24
PrivateKey = <VPS6_私钥>
MTU = 1280  # IPv6 环境下建议降低 MTU 防止分片导致 NFS 卡死

[Peer]
PublicKey = <VPS4_公钥>
# 重点:指定 VPS4 的公网 IPv6 地址
Endpoint = [VPS4_公网_IPv6_地址]:51820
# 重点:允许隧道通过 NFS 所在的 IPv4 网段(或者全量 0.0.0.0/0)
AllowedIPs = 10.8.0.0/24, <NFS服务器的IPv4地址>/32
PersistentKeepalive = 25

4. 开启内核转发 (在 VPS4 上操作)

为了让 VPS4 能把来自隧道的 IPv4 流量转发到外部的 NFS 服务器,必须开启系统转发:

Bash

echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p

5. 挂载 NFS (在 VPS6 上操作)

当 wg-quick up wg0 启动后,你应该能从 VPS6 ping 10.8.0.1。

此时,你访问 NFS 应该像访问本地网络一样。

挂载命令建议:

由于是通过隧道挂载,务必使用 IPv4 地址并显式指定参数:

Bash

mount -t nfs -o "vers=4.2,nolock,proto=tcp,timeo=150,retrans=2" <NFS服务器实际IPv4地址>:/共享路径 /data/nfs

关键细节提醒:

  1. NFS 服务器的白名单:

    由于你使用了 MASQUERADE(地址伪装),NFS 服务器看到的访问者 IP 将是 VPS4 的公网 IPv4 地址。请确保 NFS 服务器的 /etc/exports 允许 VPS4 的 IP 访问。

  2. 路由冲突:

    如果 AllowedIPs 写了 0.0.0.0/0,VPS6 的所有 IPv4 流量都会走 VPS4。如果你只想让 NFS 流量走隧道,AllowedIPs 请仅填写 NFS 服务器的特定 IP。

  3. MTU 设置:

    由于物理层是 IPv6,它比 IPv4 多了 20 字节头部。如果保持默认 MTU 1420,NFS 的大块数据传输(通常是 32KB 或 64KB 的包)可能会因为分片在隧道中丢包。设置 MTU = 1280 是在 IPv6 网络环境中最保险的做法。

如果无法连接,请检查:

  • 在 VPS6 上执行 ip route,确认前往 NFS 服务器 IP 的路由是否指向了 wg0 设备。
  • 在 VPS4 上执行 iptables -L -n -v 查看转发规则是否有流量经过。