MTU와 패킷 삭제의 놀라운 점은 무엇입니까?

MTU와 패킷 삭제의 놀라운 점은 무엇입니까?

아래와 같이 기본 MTU를 사용합니다.

hosta$ ifconfig eth0 | grep mtu
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

1500 페이로드를 사용하여 다른 서버에서 핑을 보낼 수 있습니다

hostb$ ping -s 1500 -c 2 hosta
PING hosta (hosta) 1500(1528) bytes of data.
1508 bytes from hosta: icmp_seq=1 ttl=64 time=0.273 ms
1508 bytes from hosta: icmp_seq=2 ttl=64 time=0.314 ms

--- 호스타 핑 통계 ---

2 packets transmitted, 2 received, 0% packet loss, time 1025ms
rtt min/avg/max/mdev = 0.273/0.293/0.314/0.020 ms

Hosta의 tcpdump는 모두 괜찮습니다.

12:01:40.237047 IP hostb > hosta: ICMP echo request, id 3052, seq 1, length 1480
12:01:40.237048 IP hostb  > hosta: icmp
12:01:40.237116 IP hosta > hostb: ICMP echo reply, id 3052, seq 1, length 1480

Hosta의 MTU를 최대 1488까지 낮출 수 있으며 1500 페이로드 핑이 작동합니다.

매직 넘버는 MTU=1487입니다.

hosta $ ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1487
<snip>

1500바이트 ping을 보내면(조각화 플래그를 건드리지 않음) 응답이 없습니다.

hosb $ ping -s 1500 -c 2 hosta
PING hosta (hosta) 1500(1528) bytes of data.

--- hosta ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1032ms

Hosta의 tcpdump는 다음과 같습니다.

12:01:07.421196 IP hostb > hosta: icmp
12:01:08.443698 IP hostb > hosta: icmp

호스타 쇼

net.ipv4.ip_forward_use_pmtu = 0
net.ipv4.ip_no_pmtu_disc = 0
net.ipv4.route.min_pmtu = 552
net.ipv4.route.mtu_expires = 600
net.ipv4.tcp_mtu_probe_floor = 48
net.ipv4.tcp_mtu_probing = 0
net.ipv4.icmp_echo_ignore_all = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_errors_use_inbound_ifaddr = 0
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.icmp_msgs_burst = 50
net.ipv4.icmp_msgs_per_sec = 1000
net.ipv4.icmp_ratelimit = 1000
net.ipv4.icmp_ratemask = 6168

참고 출력이 약간 이상해 보이면 IP 주소를 올바른 호스트 이름으로 바꿨습니다.

MTU를 특정 임계값 아래로 낮추면 핑이 아무런 응답도 받지 못하는 이유를 이해하려고 노력하는 것이 더 어렵습니다. 조각화 비트를 건드리지 않은 나에게도 영감을 얻었습니다.

1500바이트 패킷에 대해 do/want/dont의 -M 옵션을 사용하면 Hosta MTU가 1488 이상으로 유지될 때까지 응답을 받지만 일단 1487 이하로 설정되면 do/want/dont 모두 응답을 받지 못합니다.

이에 대해 좀 더 자세히 설명합니다. 해당 호스트(=10.50.107.129)에서 MTU=1487 tcpdump를 사용하면 들어오는 1개의 IP 패킷이 표시됩니다.

1   2023-02-15 22:40:24.095129  10.50.107.83    10.50.107.129   IPv4    562 Fragmented IP protocol (proto=ICMP 1, off=1480, ID=1fb9)

그게 유일한 줄이에요. 조각화되어 있지만 아래 #3에 표시된 길이와 동일한 길이로 562바이트를 표시합니다.

다음으로 MTU=1500을 변경하여 아래와 같이 페이로드가 조각화되고 승인된 것을 볼 수 있습니다.

2   2023-02-15 22:40:42.093639  10.50.107.83    10.50.107.129   IPv4    1514    Fragmented IP protocol (proto=ICMP 1, off=0, ID=2c62) [Reassembled in #3]
3   2023-02-15 22:40:42.093639  10.50.107.83    10.50.107.129   ICMP    562 Echo (ping) request  id=0x1004, seq=1/256, ttl=64 (reply in 5)
4   2023-02-15 22:40:42.093698  10.50.107.129   10.50.107.83    IPv4    1514    Fragmented IP protocol (proto=ICMP 1, off=0, ID=fe1a) [Reassembled in #5]
5   2023-02-15 22:40:42.093717  10.50.107.129   10.50.107.83    ICMP    562 Echo (ping) reply    id=0x1004, seq=1/256, ttl=64 (request in 3)

#1의 데이터를 확인하고 #4의 데이터와 비교했을 때 +/- 3바이트가 아닙니다(핑은 페이로드로 16진수 00부터 ff까지를 입력함). 따라서 발신자가 첫 번째 조각을 보내지 않았거나 수신자가 첫 번째 조각을 읽지 않았거나 다른 일이 진행되고 있는 것입니다.

두 서버 모두 vm이 Ubuntu를 실행하는 것과 동일하게 구축되었습니다. 그래서 한쪽을 제거했습니다.

vpn/firewall/etc/etc를 통해 내 노트북에서 ping을 실행하면 MTU=1487로 호스트에 ping을 보낼 수 있습니다.

난처한 상황에 처해 있으며 누군가 제안 사항이 있으면 감사하겠습니다.

관련 정보