我在 Strongswan IPSec 隧道上挂载了 NFS,该隧道封装在 6to4 隧道中。使用 IPSec 是因为我需要对 NFS 流量进行加密,使用 6to4 是因为 VPS 提供商不会为我的服务器分配本机 IPv6 前缀。由于 6to4 隧道存在 MTU 问题,因此我不得不将隧道接口上的 MTU 降低到最低限度(1280 - 如果我尝试设置更低的值,我会收到“错误:mtu 小于设备最低限度。”消息)。
NFS 仍然希望通过 MTU 发送数据包。我知道这一点,因为我有一个 nftables 规则来记录 ESP 数据包:
chain output {
type filter hook output priority filter; policy accept;
ip6 nexthdr esp counter packets 303367 bytes 323173696 log accept
}
因此我看到这些数据包记录在 syslog/journal 中:
Jan 29 21:41:18 nfsclient kernel: IN= OUT=he-ipv6 SRC=fd48:2b50:6a95:a6db:0000:0000:0000:0004 DST=fdc8:d5f9:cbbf:b206:0000:0000:0000:2001 LEN=1316 TC=0 HOPLIMIT=64 FLOWLBL=155038
(出于隐私原因,IP 地址更改为私有。)
现在我看不到记录的数据包,tcpdump
因为据说它们由于超过 MTU 而被内核丢弃。我假设 NFS 尝试遵守 MTU 设置,但它不知道其包将封装在 IPSec 中。因此,即使 NFS 生成小于 1280 字节的数据包,添加到其中的 ESP 标头也会使其超过设置的 MTU。我还怀疑 NFS 在其数据包上设置了 DF 标志,因为否则碎片会起作用。(我用它测试了它,ping6 -M want
碎片数据包通过了。)所以我不能降低 MTU,NFS 坚持发送加密时超过 MTU 的数据包,甚至设置了 DF 标志。
我现在能做什么?我想过以下事情,但不知道如何实施:
- 为 NFS 设置最大数据包大小,例如使用挂载选项,但我不认为有这样的设置,我已经搜索过它了。
- 配置 Strongswan 来处理这种情况,但我也没有找到这样的选项。
- 设置一个 nftables 规则,以某种方式通知 NFS 它应该生成较小的数据包。例如,当 NFS 查找时报告更低的 MTU – 不知道这是否可行。
- 从数据包中删除 DF 标志以强制进行分片。我也不知道该怎么做,也不知道是否可行。
我认为 nftables 是可行的方法,但如果可以在 NFS 级别解决,那就更好了。我也希望有 iptables 解决方案,我可以查找 nftables 的等效解决方案。
因为评论中询问过,所以我提供了有关我的界面的信息。
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether aa:00:11:4d:f7:01 brd ff:ff:ff:ff:ff:ff
4: he-ipv6@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1280 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/sit 192.168.32.84 peer 216.66.84.42
以下是隧道(ip tunnel
):
sit0: ipv6/ip remote any local any ttl 64 nopmtudisc 6rd-prefix 2002::/16
he-ipv6: ipv6/ip remote 216.66.84.42 local 192.168.32.84 ttl 255 6rd-prefix 2002::/16
(将我的公共 IPv4 更改为私有地址,但实际上我有一个全局可路由的地址local
;216.66.84.42 是 HE 6to4 隧道网关,它是众所周知的,所以留在这里。)
以下是适用于流量的默认路由:
default via fd48:2b50:6a95:a6db::1 dev he-ipv6 metric 1024 onlink pref medium
因此应用程序认为它们的数据包将通过 MTU 为 1280 的 发出。he-ipv6
但它们的数据包首先封装在 IPSec ESP 中,然后通过隧道发送。结果是封装在 6to4 数据包中的 IPSec 加密 NFS 数据包,该数据包本身通过接口向 216.66.84.42(HE 网关)he-ipv6
发出。eth0