path mtu discovery — механизм, благодаря которому роутеры могут вычисляют оптимальный размер пакета для сегмента сети.
path mtu discovery в IP сетях
Маршрутизация в IP сетях осуществляется с учетом MTU — максимального размера пакета, который может приниматься определенным хостом. Значение задается для каждого интерфейса.
Пакеты разбиваются и передаются по сети. Получатель собирает их.
Для Ethernet стандартное значение MTU — 1500 байт.
При этом MTU может изменяться на сетевом оборудовании его администратором.
path mtu discovery — механизм, благодаря которому роутеры могут вычисляют оптимальный размер пакета для сегмента сети.
Заранее MTU для интерфейсов всех маршрутизаторов, которые задействуются при доставке пакета с хоста A до хоста B, неизвестен.
Он установлен в 1500 байт, отправка осуществляется пакетами такого размера. Если на одном из роутеров используется меньшее значение он возвращает соответствующее ICMP сообщение. Пакет он не перенаправляет. ICMP ответ получает начальный отправитель, он уменьшает размер пакета и отправляет данные повторно. Так процесс повторяется пока не будет найден наибольший размер пакета, который может быть передан всеми роутерами на пути.
ICMP ответ имеет вид: ICMP 172.16.5.3 unreachable — need to frag (mtu 1400). Он отправляется если узел не может фрагментировать пакет (установлен флаг DF — don't fragment)
Увидеть процесс обмена пакетами можно записав трафик при помощи какого-либо анализатора пакетов — например, tcpdump
Если на одном из роутеров запретить ICMP трафик (что часто делают провайдеры) — система перестанет работать. Возникнет Path MTU Discovery Black Hole. Отправитель перестанет получать обратную связь и будет продолжать слать пакеты стандартного размера, которые один из узлов обработать не в состоянии.
Задание значения в iptables
Чтобы исправить ситуацию без участия провайдера можно задать на роутере опцию, благодаря которой будет автоматически подбираться размер MSS
iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN \-j TCPMSS --clamp-mss-to-pmtu
Также его можно задавать вручную вычисляя нужное значение подбором
iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS –set-mss 1360
Вместо MTU здесь используется MSS.