Сегодня столкнулся с очень странным багом:Была у меня некогда задача: Есть два интернет-канала, оба 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 и ее подсистемами)...
Буду раз любому совету!