Назад | Перейти на главную страницу

Linux MTU и UDP

Может кто-нибудь объяснить мне это поведение. У меня есть несколько VMS (centos), работающих на облачном провайдере. Интерфейс установлен на стандартный 1500 MTU

pining с большими пакетами ICMP работает нормально:

# ping -s 1600 10.132.6.3
PING 10.132.6.3 (10.132.6.3) 1600(1628) bytes of data.
1608 bytes from 10.132.6.3: icmp_seq=1 ttl=64 time=1.16 ms
1608 bytes from 10.132.6.3: icmp_seq=2 ttl=64 time=1.09 ms
1608 bytes from 10.132.6.3: icmp_seq=3 ttl=64 time=1.04 ms
^C
--- 10.132.6.3 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2207ms
rtt min/avg/max/mdev = 1.044/1.101/1.168/0.063 ms

Кажется, что-то фрагментирует ICMP-трафик

Но большого UDP-трафика не бывает:

]# nping --udp -p 111 -data-length 1600 10.132.6.3
WARNING: Payload exceeds maximum recommended payload (1400)

Starting Nping 0.5.51 ( http://nmap.org/nping ) at 2015-08-10 18:06 EDT
sendto in send_ip_packet_sd: sendto(3, packet, 1628, 0, 10.132.40.29, 16)   => Message too long
Offending packet: UDP 10.132.6.3:53 > 10.132.40.29:111 ttl=64 id=17499   iplen=1628
SENT (0.0082s) UDP 10.132.6.3:53 > 10.132.40.29:111 ttl=64 id=17499 iplen=1628
sendto in send_ip_packet_sd: sendto(3, packet, 1628, 0, 10.132.40.29, 16) => Message too long
Offending packet: UDP 10.132.6.3:53 > 10.132.40.29:111 ttl=64 id=17499  iplen=1628
SENT (1.0086s) UDP10.132.6.3:53 > 10.132.40.29:111 ttl=64 id=17499  iplen=1628
sendto in send_ip_packet_sd: sendto(3, packet, 1628, 0, 10.132.40.29, 16) => Message too long
Offending packet: UDP 10.132.6.3:53 > 10.132.40.29:111 ttl=64 id=17499 iplen=1628
SENT (2.0097s) UDP 10.132.6.3:53 > 10.132.40.29:111 ttl=64 id=17499 iplen=1628

Max rtt: N/A | Min rtt: N/A | Avg rtt: N/A
Raw packets sent: 3 (4.884KB) | Rcvd: 0 (0B) | Lost: 3 (100.00%)
Tx time: 2.34513s | Tx bytes/s: 2082.61 | Tx pkts/s: 1.28
Rx time: 2.34513s | Rx bytes/s: 0.00 | Rx pkts/s: 0.00
Nping done: 1 IP address pinged in 2.35 seconds

Есть мысли, почему трафик UDP не фрагментируется?

В sendto ошибка исходит из nping, который получает его обратно из библиотеки сокетов ОС (т. е. локально, а не откуда-то в сети). Так nping просто пытается отправить 1600-байтовые UDP-пакеты, но ОС не может их отправить.

OTOH, если вы используете --mtu возможность nping, он фрагментирует пакеты. По-видимому, он не считает IP-заголовок в его MTU, потому что наибольшее значение MTU, которое я могу установить, составляет 1480.

nping --udp -p 111 -data-length 1600 --mtu 1480 some-host
WARNING: Payload exceeds maximum recommended payload (1400)

Starting Nping 0.5.51 ( http://nmap.org/nping ) at 2015-08-11 10:29 EDT
SENT (0.0056s) UDP 192.168.1.40:53 > 192.168.1.14:111 ttl=64 id=58221 iplen=1628
RCVD (0.0068s) ICMP 192.168.1.14 > 192.168.1.40 Destination host 192.168.1.14 administratively prohibited (type=3/code=10) ttl=64 id=33478 iplen=576

OTOH, ping должны фрагментировать пакеты перед их передачей в ОС.

Хороший метод исследования такого рода вещей - использовать tcpdump чтобы понюхать, что на самом деле происходит в сети.

tcpdump -s0 -w /tmp/tcpdump.out host 192.168.1.1

затем вы можете загрузить tcpdump.out и проверить его содержимое с помощью wirehark.

если вы опустите -s0, он будет захватывать только первые 64 (я думаю) байта каждого пакета. В этом случае этого было бы достаточно.