Доброго времени всем!Столкнулся с интересным поведением физического устройства при создании на нём туннелей gif/gre.
Имеем физическое устройство rl0, являющееся default gateway.
Создаем туннель gre0, который будет устанавливаться через rl0.Здесь уже можем наблюдать занимательный эффект - mtu rl0 будет фактически установлено как и у gre0. Например rl0: mtu 1500, gre0: mtu 1476, то rl0 фактически будет работать с mtu 1476.
И даже удалив gre0 (ifconfig gre0 destroy), rl0 останется работать с mtu 1476. Сколько отсюда косяков вылазит думаю рассказывать не стоит.Собственно вопрос это таки БАГ или ФИЧА?
PS. При использовании PPPoE (через tun) данного эффекта не наблюдается.
> Доброго времени всем!
> Столкнулся с интересным поведением физического устройства при создании на нём туннелей
> gif/gre.
> Имеем физическое устройство rl0, являющееся default gateway.
> Создаем туннель gre0, который будет устанавливаться через rl0.
> Здесь уже можем наблюдать занимательный эффект - mtu rl0 будет фактически установлено
> как и у gre0. Например rl0: mtu 1500, gre0: mtu 1476,
> то rl0 фактически будет работать с mtu 1476.
> И даже удалив gre0 (ifconfig gre0 destroy), rl0 останется работать с mtu
> 1476. Сколько отсюда косяков вылазит думаю рассказывать не стоит.Физический интерфейс работает с MTU 1500 в любом случае, установка тунелей на него не влияет. А вот gif интерфейсы работают с MTU 1500 за вычетом GRE оверхеда (1476). И как бе одно другому не мешает.
Как проверяли rl0 на предмет MTU и чем создавали GRE тунель?
> Физический интерфейс работает с MTU 1500 в любом случае, установка тунелей на
> него не влияет. А вот gif интерфейсы работают с MTU 1500
> за вычетом GRE оверхеда (1476). И как бе одно другому не
> мешает.
> Как проверяли rl0 на предмет MTU и чем создавали GRE тунель?Это всё теория..
По факту
- до создания туннеля
#ping -D -s 1472 ya.ru
PING ya.ru (87.250.250.203): 1472 data bytes
1480 bytes from 87.250.250.203: icmp_seq=0 ttl=57 time=154.727 ms- создали туннель gre0, маршрут до ya.ru никоим образом не идёт через gre0, а всё также через rl0
#ping -D -s 1472 ya.ru
PING ya.ru (87.250.250.203): 1472 data bytes
ping: sendto: Message too longКак???
Если вместо rl0 будет tun0, то отрабатывает всё как надо
Занятно. А на uname -a & ifconfig & netstat -rn дадите посмотреть?Чем создаёте тунели?
> Занятно. А на uname -a & ifconfig & netstat -rn дадите посмотреть?#uname -sr
FreeBSD 8.2-RELEASE-p6#ifconfig
rl0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
gre0: flags=9051<UP,POINTOPOINT,RUNNING,LINK0,MULTICAST> metric 0 mtu 1476# traceroute -n ya.ru
traceroute: Warning: ya.ru has multiple addresses; using 87.250.250.3
traceroute to ya.ru (87.250.250.3), 64 hops max, 40 byte packets
1 X.X.X.X 8.520 ms 7.456 ms 6.739 ms
...
т.е. полетел именно через дефолтный маршрут rl0
> Чем создаёте тунели?ifconfig gre0 create
ifconfig gre0 inet L.L.L.b/30 L.L.L.a tunnel X.X.X.X Y.Y.Y.Y
Очень похоже на баг (ИМХО), т.к. судя по исходникам if_tun и if_gre процедуры инициализации практически идентичны:tun
case SIOCSIFMTU:
ifp->if_mtu = ifr->ifr_mtu;
TUNDEBUG(ifp, "mtu set\n");
break;
gre
case SIOCSIFMTU:
/*
* XXXRW: Isn't this priv_check() redundant to the ifnet
* layer check?
*/
if ((error = priv_check(curthread, PRIV_NET_SETIFMTU)) != 0)
break;
if (ifr->ifr_mtu < 576) {
error = EINVAL;
break;
}
ifp->if_mtu = ifr->ifr_mtu;
break;Остаётся интересен момент, после создании gre0 какой максимальной величины пакеты пролезают?
> Очень похоже на баг (ИМХО), т.к. судя по исходникам if_tun и if_gre
> процедуры инициализации практически идентичны:
>...Исходничек я тоже глянул, с тем же результатом.
> Остаётся интересен момент, после создании gre0 какой максимальной величины пакеты пролезают?
Логично, что 1476 - 28, т.е. максимально ping -D -s 1448, при этом, если я удалил все туннели, то это значение так и остается максимальным.
> Логично, что 1476 - 28, т.е. максимально ping -D -s 1448, при
> этом, если я удалил все туннели, то это значение так и
> остается максимальным.Если принудительно выставить мту на rl0 обратно в 1500 эффект есть?
З.Ы. Надеюсь, нетграф в этот момент не задействован?
> Если принудительно выставить мту на rl0 обратно в 1500 эффект есть?При понижении mtu до 1476 на rl0 и обратно - всё остаётся по прежнему. Пробовать опустить mtu на rl0 ниже 1476 (при отсутствии gre) нет желания - сервачки боевые.
> З.Ы. Надеюсь, нетграф в этот момент не задействован?
netgraph не пользуется, вообще левого ничего не пользуется, кроме кваги (ospf) и pf
P.S. Сам жду выходных, чтоб таки выяснить что же это за фигня такая..
> P.S. Сам жду выходных, чтоб таки выяснить что же это за фигня
> такая..Удачи! Если получится победить - хочется узать как.
Виновником сего буйства оказался ospfd из пакета quagga# pkg_info -x quag
Information for quagga-0.99.20_3Причем, после останова кваги, интерфейс не восстанавливается (down up, настройка mtu - не помогают), единственным надежным выходом остается перезагрузка.
> Виновником сего буйства оказался ospfd из пакета quagga
> # pkg_info -x quag
> Information for quagga-0.99.20_3
> Причем, после останова кваги, интерфейс не восстанавливается (down up, настройка mtu -
> не помогают), единственным надежным выходом остается перезагрузка.send-pr обязательно
> send-pr обязательноКак-то не приходилось оформлять PR, и особого желания разбираться чего там и как нет..
Проверял на 8.1 и 8.2 GENERIC (+модуль if_gre/if_gif) - проблема себя проявляет.
На 8.3-RC1 всё работает как и полагается, без неожиданных эффектов, на том же самом пакете quagga.