null

О вреде RTFM: как правильно настраивать link aggregation в FreeBSD

Век живи, век RTFM и все равно LMD
Народная мудрость

В официальной документации на сайте FreeBSD для настройки link aggregation в rc.conf рекомендуется указать следующее:

ifconfig_fxp0="up"
ifconfig_fxp1="up"
cloned_interfaces="lagg0"
ifconfig_lagg0="laggproto lacp laggport fxp0 laggport fxp1 10.0.0.15/24"

Но правильно ли это? Если Вы не планируете использовать 802.1q на агрегированном интерфейсе, то Вам должно быть всё равно и дальше можно не читать.

А если всё же надо?

Тогда, следуя авторской логике, в rc.conf надо будет написать что-то типа:

ifconfig_fxp0="up"
ifconfig_fxp1="up"
cloned_interfaces="lagg0 lagg0.2 lagg0.4"
ifconfig_lagg0="laggproto lacp laggport fxp0 laggport fxp1 up"
ifconfig_lagg0_2="inet 10.0.2.15/24"
ifconfig_lagg0_4="inet 10.0.4.16/24"

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

Но, если внимательно посмотреть, то можно заметить одну маленькую проблему: на тэгированных интерфейсах MTU окажется равным 1496:

lagg0.2: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1496

Почему это произошло?

В процессе загрузки ОС сначала создаёт все интерфейсы, перечисленные в cloned_interfaces. Таким образом, на момент создания тэгированных интерфейсов lagg0.2 и lagg0.4 их родительский интерфейс lagg0 еще не имеет ни одного физического порта. Так как теоретически в lagg0 могут быть добавлены интерфейсы, которые не поддерживают длину фрейма 1522 байта, то ОС перестраховывается и уменьшает MTU для тэгированных интерфейсов на 4.

Для того, чтобы этого избежать, на момент создания тэгированных интерфейсов родительский интерфейс уже должен знать свои порты, а для этого добавление портов необходимо перенести на момент создания интерфейса. Правильный rc.conf должен выглядеть так:

ifconfig_fxp0="up"
ifconfig_fxp1="up"
cloned_interfaces="lagg0 lagg0.2 lagg0.4"
create_args_lagg0="laggproto lacp laggport fxp0 laggport fxp1"
ifconfig_lagg0="up"
ifconfig_lagg0_2="inet 10.0.2.15/24"
ifconfig_lagg0_4="inet 10.0.4.16/24"

После загрузки с таким конфигурационным файлом Вы получите корректное значение MTU для тэгированных интерфейсов:

lagg0.2: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500

P.S. Если тэгированный интерфейс при загрузке получил MTU 1496, то изменить его на 1500 уже не получится. При этом создаваемые уже после загрузки интерфейсы будут получать MTU 1500.