尽管设置了“不分段”标志,转发的 TCP 流量在 Linux 上仍被重新分段

尽管设置了“不分段”标志,转发的 TCP 流量在 Linux 上仍被重新分段

我们在同一个主机上有 2 个 VPN 服务器。这些服务器是虚拟的,并且有不同的 Linux 发行版。VPN 客户端与同一个 Amazon EC2 服务器建立 https 连接。来自 EC2 的 TCP 数据包始终设置有“不分段”标志。

尽管两个 VPN 服务器的物理接口和 tun 接口上的 MTU 都是 1500,但它们通常会从 EC2 接收更大的数据包。我不确定这是怎么可能的,但也许与 Virtio 有关。

无论如何,当 TCP 流量转发到 tun 接口时,服务器的行为会有所不同:

  • 在“服务器 1”上,大数据包按预期被丢弃,并且 ICMP“需要分片”被发送回 EC2。
  • 在“服务器 2”上,TCP 流量被重新分片,但这不是 IP 分片,而是一个全新的 TCP 流,就像 VPN 服务器上有一个带有两个套接字的应用程序一样。DF 标志被保留。

因此,我假设“服务器 2”上有一些sysctl设置可以启用此行为。我说得对吗?这个设置在哪里?

wireshark 截图

我在服务器 2 上配置了转发,纯粹使用firewall-cmd以下防火墙配置:

external (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources: 10.8.0.0/24 10.8.1.0/24
  services: dhcpv6-client http https irc ircs openvpn smtp ssh
  ports: 1398/tcp 1194/tcp 1401/tcp 1402/tcp 65213/tcp 500/udp 501/udp
  protocols:
  forward: yes
  masquerade: yes
  forward-ports:
        port=1500:proto=tcp:toport=1500:toaddr=10.8.1.32
        port=1501:proto=tcp:toport=1501:toaddr=10.8.1.32
  source-ports:
  icmp-blocks:
  rich rules:
        rule family="ipv4" source address="10.8.1.0/24" port port="3128" protocol="tcp" accept

ethtool 输出

localhost:~ # ethtool -k eth0
Features for eth0:
rx-checksumming: on [fixed]
tx-checksumming: on
        tx-checksum-ipv4: off [fixed]
        tx-checksum-ip-generic: on
        tx-checksum-ipv6: off [fixed]
        tx-checksum-fcoe-crc: off [fixed]
        tx-checksum-sctp: off [fixed]
scatter-gather: on
        tx-scatter-gather: on
        tx-scatter-gather-fraglist: off [fixed]
tcp-segmentation-offload: on
        tx-tcp-segmentation: on
        tx-tcp-ecn-segmentation: on
        tx-tcp-mangleid-segmentation: off
        tx-tcp6-segmentation: on
generic-segmentation-offload: on
generic-receive-offload: on
large-receive-offload: off [fixed]
rx-vlan-offload: off [fixed]
tx-vlan-offload: off [fixed]
ntuple-filters: off [fixed]
receive-hashing: off [fixed]
highdma: on [fixed]
rx-vlan-filter: on [fixed]
vlan-challenged: off [fixed]
tx-lockless: off [fixed]
netns-local: off [fixed]
tx-gso-robust: on [fixed]
tx-fcoe-segmentation: off [fixed]
tx-gre-segmentation: off [fixed]
tx-gre-csum-segmentation: off [fixed]
tx-ipxip4-segmentation: off [fixed]
tx-ipxip6-segmentation: off [fixed]
tx-udp_tnl-segmentation: off [fixed]
tx-udp_tnl-csum-segmentation: off [fixed]
tx-gso-partial: off [fixed]
tx-tunnel-remcsum-segmentation: off [fixed]
tx-sctp-segmentation: off [fixed]
tx-esp-segmentation: off [fixed]
tx-udp-segmentation: off [fixed]
tx-gso-list: off [fixed]
fcoe-mtu: off [fixed]
tx-nocache-copy: off
loopback: off [fixed]
rx-fcs: off [fixed]
rx-all: off [fixed]
tx-vlan-stag-hw-insert: off [fixed]
rx-vlan-stag-hw-parse: off [fixed]
rx-vlan-stag-filter: off [fixed]
l2-fwd-offload: off [fixed]
hw-tc-offload: off [fixed]
esp-hw-offload: off [fixed]
esp-tx-csum-hw-offload: off [fixed]
rx-udp_tunnel-port-offload: off [fixed]
tls-hw-tx-offload: off [fixed]
tls-hw-rx-offload: off [fixed]
rx-gro-hw: on
tls-hw-record: off [fixed]
rx-gro-list: off
macsec-hw-offload: off [fixed]
rx-udp-gro-forwarding: off
hsr-tag-ins-offload: off [fixed]
hsr-tag-rm-offload: off [fixed]
hsr-fwd-offload: off [fixed]
hsr-dup-offload: off [fixed]
localhost:~ #```

答案1

很确定这将与 TCP 分段卸载有关,它允许内核将比 MTU 大得多的数据包填充到以太网驱动程序的环形缓冲区上,然后驱动程序本身让设备写出 IP 头并在数据包离开设备之前为您划分数据包。

因此,实际离开设备的内容将遵守任何 MTU,但从主机发送到设备的内容在数据包嗅探器中没有任何意义,因为(如您所提到的)数据包大小似乎不符合您期望看到的 MTU。

如果您使用数据包嗅探器检查这些数据包的接收器,则所有 MTU 都应该排列整齐并设置了 DF 标志。

您可以在 ethtool 中关闭 TSO - 一般来说这不是一个好主意,但有时关闭它会更好 - 我以前遇到过问题,TLS 连接无法正确计算哈希值并因此在接收方被拒绝。

相关内容