要实现 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 = 254. 开启内核转发 (在 VPS4 上操作)
为了让 VPS4 能把来自隧道的 IPv4 流量转发到外部的 NFS 服务器,必须开启系统转发:
Bash
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p5. 挂载 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关键细节提醒:
NFS 服务器的白名单:
由于你使用了
MASQUERADE(地址伪装),NFS 服务器看到的访问者 IP 将是 VPS4 的公网 IPv4 地址。请确保 NFS 服务器的/etc/exports允许 VPS4 的 IP 访问。路由冲突:
如果
AllowedIPs写了0.0.0.0/0,VPS6 的所有 IPv4 流量都会走 VPS4。如果你只想让 NFS 流量走隧道,AllowedIPs请仅填写 NFS 服务器的特定 IP。MTU 设置:
由于物理层是 IPv6,它比 IPv4 多了 20 字节头部。如果保持默认 MTU 1420,NFS 的大块数据传输(通常是 32KB 或 64KB 的包)可能会因为分片在隧道中丢包。设置
MTU = 1280是在 IPv6 网络环境中最保险的做法。
如果无法连接,请检查:
- 在 VPS6 上执行
ip route,确认前往 NFS 服务器 IP 的路由是否指向了wg0设备。 - 在 VPS4 上执行
iptables -L -n -v查看转发规则是否有流量经过。