我们在同一个主机上有 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
设置可以启用此行为。我说得对吗?这个设置在哪里?
我在服务器 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 连接无法正确计算哈希值并因此在接收方被拒绝。