Проблемы PMTUD и TCP-mss для ipv6 через туннель 6to4

Еще пару моментов, до которых все никак не доходили руки.
В старой заметке я писал про 6to4 и раздаче ipv6-адресов в локалку, недописал еще некоторые моменты про mtu и mss. Посмотрим что с этим можно сделать на freebsd, linux и cisco.

Хоть в ipv6 нас вроде как и избавили от необходимости фрагментации на рутерах, но проблемы с mtu никуда не делись, они лишь перешли в новое русло – раньше с этим боролись на рутерах, теперь это ляжет на плечи конечных хостов.
В целом PMTUD для ipv6 работает при соблюдении тех же условий что и для ip4 – хосты должны беспрепятственно обмениваться служебными icmp-пакетами. Но даже в случае успешного отрабатывания pmtud проблемы остаются – пакеты будут фрагментироваться и собираться конечными хостами. А фрагментированные пакеты никто не любит – ни роутеры, ни фаерволы ни сетевики :) Вот наткнулся на замечательную видюшку по этому поводу.
Возмем конкретный случай с 6to4 туннелем и pppoe-аплинком – MTU туннельного интерфейса pppoe 1492, туннель 6to4 требует на инкапсуляцию еще 20 байт на ip-заголовок, игото mtu для ipv6 на роутере будет 1472. А в локалке хосты имеют стандартные 1500 для эзернета или более в случае с jumbo.

Если все оставить как есть оно даже работает, но работает просто ужасно. PMTUD отработывает очень медленно и постоянно отваливается. В смысле что route cache конечных хостов постоянно забывает результаты discovery и все повторяется снова и снова. В Windows 7 routecache для ipv6 вообще ведет себя довольно странно – это повод для отдельного разбирательства, но мне лень… Но по факту с большими пакетами постоянные проблемы и тормоза. То картинки не грузятся то ssh который только что работал – замирает и впадает в нирвану.
Вариантов решения проблем тут два – исправлением MTU для конечных хостов или врезкой в tcp-трафик и испралением tcp-mss (MSS clamping). Т.е. по сути те же приемы что применяются в ip4 теперь перекочевывают в ipv6 – за что боролись на то и напоролись.

Посмотрим что с MTU.

Резать MTU на конечных хостах совсем не выход, никто этим заниматься не будет – ни пользователи ни сетевики. Но для ipv6 есть компромис – размер mtu можно анонсировать в “Router Advertisement” сообщениях протокола NDP. Если эти сообщения будет рассылать роутер то конечные хосты сами подстроят mtu для ipv6 на интерфейсе который будет принимать эти сообщения. Минус в том что для связи по локалке также будет использоваться урезаный mtu, но это лучше чем постоянные тормоза с pmtud. А плюс в том что это будет работать не только для tcp.
Чтож попробуем…

Во фре stf интерфейс по-умолчанию настраивается на минимиально возможный mtu для ipv6 – 1280.

Понятно что для перестраховки всего и вся со стороны ip4 транспорта, но раз уж я туда лезу то подниму его до нормального рабочего значения.

Почему 1460 а не 1472? Ну просто число “круглое”, совпадает с mss для ip4 в нормальном случае :) Эту команду я запихал в скрипт mpd который поднимает pppoe, мне кажется там ей самое место.

Теперь надо сделать так чтобы “mtu 1460″ анонсировалось radvd демоном. Прописывается это в файле /usr/local/etc/radvd.conf в секции interface.

После перезапуска radvd можно пойти на клиентские машинки и поглядеть что там получилось.
Возмем Win7, попингаем гуглю и глянем в route cache

Уже лучше. Теперь по крайней по умолчанию для каждого нового соединения размер пакетов будет таким чтобы они без проблем пролезли в 6to4 туннель на рутере.

Теперь про MSS.
Более гибкий вариант для tcp протокола, но со своими исключениями.
Во freebsd я нашел 3 способа управлять mss clamping – tcpmssd из портов, через netgraph ноду ng_tcpmss и через функцию фаервола pf scrub. Первые два, судя по исходникам, не работают с ipv6, а pf я не пробовал, т.к. у меня работает ipfw (надо будет как-нибудь проверить в виртуалке). Пичалька…

Ладно, посмотрим что есть в соседнем стане…
У циски широко известная функция “ip tcp adjust-mss” для интерфейса раньше работала только для ip4. Но судя по информации в сети это дело довели до ума и начиная с IOS 15.2(4)M “ip tcp adjust-mss” так же работает и для ipv6 трафика. Можно это дело прописать на “своем” роутере и терминировать на него туннель 6to4. Допишу если как-нибудь так и придется сделать.

В linux все необходимое умеет iptables
Включается как-то так…

и даже неплохо работает. Вместо –clamp-mss-to-pmtu можно руками выставить нужное значение через “–set-mss value”.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">