URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 93152
[ Назад ]

Исходное сообщение
"FreeBSD баг или фича при использовании gif/gre ?"

Отправлено oser , 16-Мрт-12 07:32 
Доброго времени всем!

Столкнулся с интересным поведением физического устройства при создании на нём туннелей 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) данного эффекта не наблюдается.


Содержание

Сообщения в этом обсуждении
"FreeBSD баг или фича при использовании gif/gre ?"
Отправлено Felixz , 16-Мрт-12 09:18 
> Доброго времени всем!
> Столкнулся с интересным поведением физического устройства при создании на нём туннелей
> 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 тунель?


"FreeBSD баг или фича при использовании gif/gre ?"
Отправлено oser , 16-Мрт-12 09:32 
> Физический интерфейс работает с 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, то отрабатывает всё как надо


"FreeBSD баг или фича при использовании gif/gre ?"
Отправлено Felixz , 16-Мрт-12 11:30 
Занятно. А на uname -a & ifconfig & netstat -rn дадите посмотреть?

Чем создаёте тунели?


"FreeBSD баг или фича при использовании gif/gre ?"
Отправлено oser , 16-Мрт-12 12:24 
> Занятно. А на 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


"FreeBSD баг или фича при использовании gif/gre ?"
Отправлено Felixz , 16-Мрт-12 14:21 
Очень похоже на баг (ИМХО), т.к. судя по исходникам 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 какой максимальной величины пакеты пролезают?


"FreeBSD баг или фича при использовании gif/gre ?"
Отправлено oser , 16-Мрт-12 14:29 
> Очень похоже на баг (ИМХО), т.к. судя по исходникам if_tun и if_gre
> процедуры инициализации практически идентичны:
>...

Исходничек я тоже глянул, с тем же результатом.

> Остаётся интересен момент, после создании gre0 какой максимальной величины пакеты пролезают?

Логично, что 1476 - 28, т.е. максимально ping -D -s 1448, при этом, если я удалил все туннели, то это значение так и остается максимальным.


"FreeBSD баг или фича при использовании gif/gre ?"
Отправлено Felixz , 16-Мрт-12 14:43 
> Логично, что 1476 - 28, т.е. максимально ping -D -s 1448, при
> этом, если я удалил все туннели, то это значение так и
> остается максимальным.

Если принудительно выставить мту на rl0 обратно в 1500 эффект есть?
З.Ы. Надеюсь, нетграф в этот момент не задействован?


"FreeBSD баг или фича при использовании gif/gre ?"
Отправлено oser , 16-Мрт-12 14:55 
> Если принудительно выставить мту на rl0 обратно в 1500 эффект есть?

При понижении mtu до 1476 на rl0 и обратно - всё остаётся по прежнему. Пробовать опустить mtu на rl0 ниже 1476 (при отсутствии gre) нет желания - сервачки боевые.

> З.Ы. Надеюсь, нетграф в этот момент не задействован?

netgraph не пользуется, вообще левого ничего не пользуется, кроме кваги (ospf) и pf

P.S. Сам жду выходных, чтоб таки выяснить что же это за фигня такая..


"FreeBSD баг или фича при использовании gif/gre ?"
Отправлено Felixz , 16-Мрт-12 15:12 
> P.S. Сам жду выходных, чтоб таки выяснить что же это за фигня
> такая..

Удачи! Если получится победить - хочется узать как.


"FreeBSD баг или фича при использовании gif/gre ?"
Отправлено oser , 17-Мрт-12 07:38 
Виновником сего буйства оказался ospfd из пакета quagga

# pkg_info -x quag
Information for quagga-0.99.20_3

Причем, после останова кваги, интерфейс не восстанавливается (down up, настройка mtu - не помогают), единственным надежным выходом остается перезагрузка.


"FreeBSD баг или фича при использовании gif/gre ?"
Отправлено lavr , 17-Мрт-12 23:55 
> Виновником сего буйства оказался ospfd из пакета quagga
> # pkg_info -x quag
> Information for quagga-0.99.20_3
> Причем, после останова кваги, интерфейс не восстанавливается (down up, настройка mtu -
> не помогают), единственным надежным выходом остается перезагрузка.

send-pr обязательно


"FreeBSD баг или фича при использовании gif/gre ?"
Отправлено oser , 19-Мрт-12 15:39 
> send-pr обязательно

Как-то не приходилось оформлять PR, и особого желания разбираться чего там и как нет..

Проверял на 8.1 и 8.2 GENERIC (+модуль if_gre/if_gif) - проблема себя проявляет.
На 8.3-RC1 всё работает как и полагается, без неожиданных эффектов, на том же самом пакете quagga.