Сегодня столкнулся с очень странным багом:Была у меня некогда задача: Есть два интернет-канала, оба IP статические, один канал - основной (defaultrouter), через второй должен работать почтовый SMTP-сервер Postfix (принимать и отправлять почту).
Именно в тот момент активно изучал PF - с его помощью и решил тогда задачу:
# Правило для входящей почты:
pass in on $if_ext_second reply-to ($if_ext_second $router_second) inet proto tcp to $if_ext_second port 25 keep state# Правила для отправляемой почты:
# NAT:
nat on $if_ext_first inet proto tcp from self to any port 25 -> $if_ext_second
# Фильтрация:
pass out route-to ( $if_ext_second $router_second ) inet from $if_ext_second keep state
Реализовано это было на FreeBSD 7.1Сегодня возникла точно такая же задача, система такая же (FreeBSD 7.1), разница лишь в том, что основной Интернет-канал - через PPTP (использовал VPN-клиент MPD v5.3).
Сделал такие же правила (с учетом интерфейсов в /etc/pf.conf), применил (pfctl -f /etc/pf.conf) и стал проверять.
Первое правила (для входящей почты) работает замечательно, но вот второе вызывает полное зависание системы (нет ничего на экране, не реагирует клавиатура, power - помогает только reset).Причем зависает только тогда, когда в правило NAT попадает пакет - в моем случае зависание стабильно (проверял несколько раз) вызывает такая команда:
echo "test mail" | mail -s "test mail" admin@xxxxВ общем такая ситуация...думаю, дело связано с NetGrath и хуками/нодами (т.е. с MPD и ее подсистемами)...
Буду раз любому совету!
>Сегодня столкнулся с очень странным багом:
>
>Была у меня некогда задача: Есть два интернет-канала, оба IP статические, один
>канал - основной (defaultrouter), через второй должен работать почтовый SMTP-сервер Postfix
>(принимать и отправлять почту).Нормальный почтовый демон и без pf может слушать и отправлять почту с указанных ip.
Про грабли self в pf и mpd - уже описано и решено. Хотя бы у разработчиков mpd почитайте
http://sourceforge.net/forum/forum.php?forum_id=44693
> Нормальный почтовый демон и без pf может слушать и отправлять почту
>с указанных ip.Я бы не был столь категоричен. Без специальных манипуляций исходящая почта не пойдёт во второй канал, а будет уходить по default route, какой бы ИП-адрес вы почтовому демону не указали. А чем вы будете заворачивать траффик во второй канал: pf или ipfw - не важно.
>[оверквотинг удален]
>помогает только reset).
>
>Причем зависает только тогда, когда в правило NAT попадает пакет - в
>моем случае зависание стабильно (проверял несколько раз) вызывает такая команда:
>echo "test mail" | mail -s "test mail" admin@xxxx
>
>В общем такая ситуация...думаю, дело связано с NetGrath и хуками/нодами (т.е. с
>MPD и ее подсистемами)...
>
>Буду раз любому совету!Сначала нужно определиться и явно указать постфиксу, на каком интерфейсе слушать и с какого ИП-адреса выполнять исходящие соединения. Мне почему-то кажется что сейчас он у вас слушает на всех, а инициирует с какого ему ос скажет.
После этого будет понятно, нужно ли правило с НАТ вообще.
В конфигурации с двумя каналами применять self опрометчиво. Вы думаете pf угадает ваши намерения и подставит нужный адрес источника? Привыкайте явно указывать системе что вы от неё хотите.
>Сначала нужно определиться и явно указать постфиксу, на каком интерфейсе слушать и
>с какого ИП-адреса выполнять исходящие соединения. Мне почему-то кажется что сейчас
>он у вас слушает на всех, а инициирует с какого ему
>ос скажет.
>После этого будет понятно, нужно ли правило с НАТ вообще.
>В конфигурации с двумя каналами применять self опрометчиво. Вы думаете pf угадает
>ваши намерения и подставит нужный адрес источника? Привыкайте явно указывать системе
>что вы от неё хотите.kam - спасибо за подсказку!
Почитал man 5 postconf, нашел вот такую штуку в описании inet_interfaces:
When inet_interfaces specifies just one IPv4 and/or IPv6 address that
is not a loopback address, the Postfix SMTP client will use this
address as the IP source address for outbound mail. Support for IPv6 is
available in Postfix version 2.2 and later.Сменил параметр в main.cf, перестартовал postfix, закомментировал NAT-правило в PF, оставил только такое:
pass out route-to ( $if_ext_second $router_second ) inet from $if_ext_second keep stateПопробовал послать письмо - ушло с нужного адреса - ура! :)
Сама система почтарь видит (несмотря на отсутствие порта 25 на loopback), поэтому осталось только дать доступ локалке на SMTP:
rdr inet proto tcp from $if_lan/24 to $if_lan port 25 -> $if_ext_second port 25Думаю, на этом задачу можно считать решенной :)