В механизмах работы с IP стеком v4 в новом релизе FreeBSD 10.0 было внесено много изменений.
В том числе был изменен механизм ip fordwarding. В частности была убрана опция ядра options IPFIREWALL_FORWARD о чем написано в updates к релизу. Теперь этот функционал включен постоянно и надобность такой опции просто отпала. Но есть маленький нюанс.
Суть его заключена в следующем — если используются ipfw правила то все работает кроме одного но часто используемого случая.
ipfw fwd X.X.X.X all from A.A.A.A to B.B.B.B. Условие проявления ошибки — исходный пакет по правилам роутинга должен уйти на интерфейс int_1 а адрес X.X.X.X находиться за другим интерфейсом int_2.
Правило ipfw fwd X.X.X.X отправляет пакеты в /dev/null в ситуации когда Х.Х.Х.Х находиться на другом интерфейсе, чем исходный пакет
Подобные правила часто используются для организации параллельных физических каналов для дублирования или для организации разных маршрутов на основании адреса-источника пакетов.
В лог пакет попадает но на выходном интерфейсе его нет.
Как выяснилось эта проблема проявлялась и других людей. Тут приведен и способ решения проблемы. Добавление одной пропущенной строки решает вопрос в текущем релизе. После пересборки ядра правила ведут себя предсказуемо и работают, хотя в промышленном варианте пока это запускать рано — проверку на корректность в других местах я еще не завершил.
Достаточно интересно что материала про эту проблему очень мало и когда я наткнулся на такое поведение ipfw даже не сразу понял что происходит.
PS. В некоторых случаях я наблюдаю задвоение исходящих пакетов, прошедших через правило ipfw fwd, что в общем то не приносит вреда — но все равно поведение странное. Особенно из-за того что задвоение именно иногда. Пока логики не обнаружил.
PPS. Встретил также рекомендацию обновиться до 10.0.Stable где эта ошибка стека IP исправлена. Но релиз — все таки релиз. А динамичная версия «в разработке» — явно не то что годиться для работы. Ну и вывод — к сожалению 10-ка пока не рекомендуется к промышленной эксплуатации… Что очень жаль.
Автор: ded_Pihto