[
root@rt.daycom.ru /etc ] # cat pf.conf [ 17:46 ]
#Внешние и внутренний интерфейсы.
#
ext_if_a = "vr0" #первый провайдер
ext_if_b = "vr2" #второй провайдер
int_if = "vr1" #локалка
int_if_vpn = "tun0" # vpn
if_lo = "lo"
#Шлюзы для каналов.
#
ext_gw_a = "17.106.95.89" #для первого провайдера
ext_gw_b = "192.168.1.1" #для второго провайдера
net = "192.168.0.0/24" #локалка
#TCP/UDP сервисы, обслуживаемые маршрутизатором, то к чему имеется доступ на внешних интерфейсах
#
tcp_svc = "domain, auth, http, ntp, ssh" #как пример, что то нужно вписать иначе будет биг ошибка
udp_svc = "domain, ntp, ssh" #аналогично, 1194 - vpn
udp_vpn = "1194"
# Из интернета на почтовый сервер
tcp_mail ="smtp, pop3"
# закрытые порты из внутренней сети в интернет
tcp_block_int ="smtp"
mail_server ="17.106.95.91"
router ="17.106.95.90"
#Создаем таблицу доверенных smtp-севреров (1. внутр. IP, 2. внеш. IP, 3. smtp.mail.ru, 4. smtp.yandex.ru)
table <my_smtp> { $mail_server, 194.67.23.111, 195.161.174.129}
set skip on lo0
# нормализация трафика (иначе терминальный клиент через vpn не работает!!!)
scrub in
#Натим, важный момент, именно тут определяется кого куда пускать
#Синтаксис ната, грубо говоря, таков: nat on _интерфейс_ from _откуда_ to _куда_ -> _интерфейс_или_ип_адрес
#
nat on $ext_if_b from {$net} -> ($ext_if_b:0)
# Пробрасываем порты из внутренней сети на SQUID
#
rdr pass on $int_if proto tcp to port http -> 127.0.0.1 port 3128
#
#Разрешаем сети ходить в интернет, всё остальное блокируем
#
block in on { $ext_if_a $ext_if_b }
block return-rst in on { $ext_if_a $ext_if_b } proto tcp
pass out on { $ext_if_a $ext_if_b } keep state
#Исходящие пакеты в канал, соответствующий адресу источника. Здесь и начинается policy
#
pass out route-to ($ext_if_a $ext_gw_a) from ($ext_if_a) to !(self:network) keep state
pass out route-to ($ext_if_b $ext_gw_b) from ($ext_if_b) to !(self:network) keep state
#
# Пускаем vpn на роутер
#
pass out on $ext_if_b reply-to ($ext_if_a $ext_gw_a) inet proto udp from $router port { $udp_vpn } to any keep state
pass out on $ext_if_b route-to ($ext_if_a $ext_gw_a) inet proto udp from $router port { $udp_vpn } to any keep state
pass in on $ext_if_a reply-to ($ext_if_a $ext_gw_a) inet proto udp from any to $router port { $udp_vpn } keep state
#
#Блокируем все исходящие smtp-запросы которые к левым серверам
#
block in log quick on $int_if proto { tcp, udp } from $net to !<my_smtp> port { $tcp_block_int }
#
# Пускаем почту на почтовый сервер и выпускаем почту с нашего сервера в инет
#
pass out quick on $ext_if_b reply-to ($ext_if_a $ext_gw_a) proto {tcp, udp} from $mail_server port { smtp } to any port { smtp }
pass out quick on $ext_if_b route-to ($ext_if_a $ext_gw_a) proto {tcp, udp} from $mail_server port { smtp } to any port { smtp }
pass in on $ext_if_a reply-to ($ext_if_a $ext_gw_a) proto {tcp, udp} to $mail_server port { $tcp_mail } flags S/SA keep state
#
# Разрешаем пинговать роутер и почтовый сервер
#
pass in on $ext_if_a reply-to ($ext_if_a $ext_gw_a) proto icmp to {$router,$mail_server} keep state
#
#А вот policy для входящих пакетов на внешние интерфейсы
#
pass in on $ext_if_a reply-to ($ext_if_a $ext_gw_a) proto udp to $router port { $udp_svc } keep state
pass in on $ext_if_a proto udp from ($ext_if_a:network) to $router port { $udp_svc } keep state
#
pass in on $ext_if_a reply-to ($ext_if_a $ext_gw_a) proto tcp to port { $tcp_svc } flags S/SA keep state
pass in on $ext_if_a proto tcp from ($ext_if_a:network) to port { $tcp_svc } flags S/SA keep state
#
pass in on $ext_if_b reply-to ($ext_if_b $ext_gw_b) proto udp to port { $udp_svc } keep state
pass in on $ext_if_b proto udp from ($ext_if_b:network) to port { $udp_svc } keep state
#
pass in on $ext_if_b reply-to ($ext_if_b $ext_gw_b) proto tcp to port { $tcp_svc } flags S/SA keep state
pass in on $ext_if_b proto tcp from ($ext_if_b:network) to port { $tcp_svc } flags S/SA keep state
# По внутреннему интерфейсу и vpn пропускаем всё и везде
#
pass on $int_if all keep state
pass on $int_if_vpn all keep state