Лучшее — враг хорошего или странности с PF
На шлюзе у меня в качестве файрвола, шейпера, и собственно NAT`а работает PF.
Сегодня ради кое-каких экспериментов на внешний IP шлюза повесил алиас. Само по себе это не страшно так как за шлюзом стоит модем в режиме роутера.
Но начали происходить «странные» вещи.
Я почти не мог достучаться по http, по pop и т.п. по TCP протоколам.
Но, при этом с самого сервера всё работало нормально.
На помощь пришёл tcpdump. Натравил я его на 110 порт, и стал телнетиться.
А увидел я там следующее. NAT подставлял алиас в качестве адрес отправителя, вместо основного IP. Но этот алиас был абсолютно из другой сети, и повешан был ради опытов.
Модем ответные пакеты отправлял на него, но так как этот IP из другой сети, пакеты никуда не приходили.
Почему NAT делал так мне было ясно. В конфиге PF нат определялся такой строкой
nat on $ext_if from $lan to !$lan -> ($ext_if)
Скобки означаю, что в качестве адреса подставлять надо любой адрес на интерфейсе ext_if. Сделана эта возможность для динамических IP, чтобы не было необходимости каждый раз при изменении IP, перечитывать конфиг.
Я убрал алиас с интерфейса. Вот тут и началось интересное. PF продолжал подставлять его адрес. Я перечитал правила PF — ничего не изменилось. PF и сервак перезапускать не хотелось. Изменил строку в конфиге на такую
nat on $ext_if from $lan to !$lan -> $ext_if
, перечитал правила — всё стало нормально.
Где PF закэшировал IP алиаса — загадка…
(подробнее о настройке PF можно почитать в этой записи)
правила как перечитывал?
надо pfctl -F all ; pfctl -f /….путь к конфиу
тогда «кеша» не будет а точнее не кеша а keepstate отвалится и применятся новые правила