NFS 坚持通过 MTU 发送数据包,nftables 可能是解决方案

NFS 坚持通过 MTU 发送数据包,nftables 可能是解决方案

我在 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 标志。

我现在能做什么?我想过以下事情,但不知道如何实施:

  1. 为 NFS 设置最大数据包大小,例如使用挂载选项,但我不认为有这样的设置,我已经搜索过它了。
  2. 配置 Strongswan 来处理这种情况,但我也没有找到这样的选项。
  3. 设置一个 nftables 规则,以某种方式通知 NFS 它应该生成较小的数据包。例如,当 NFS 查找时报告更低的 MTU – 不知道这是否可行。
  4. 从数据包中删除 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

相关内容