pf pbr
![Сообщение Сообщение](./styles/prosilver/imageset/icon_post_target.gif)
Вот сегодня полностью переписал свои правила фаирвола с ipfw+ipnat на pf. Вкрадце опишу зачем такой скрипт нужен:
0 По-умолчанию все запрещено с уведомлением
1 Юзеры локалки лазиют только на разрешенные сервисы tcp_services
2 Юзеры инета видят на только по портам tcp_public (udp, icmp, gre трафик без ограничений)
3 На запрос, пришедший на определенный ип , будет отправлен ответ через нужный гейт
4 поднят нат и переадресация напрозрачный прокси
5 Закомментированное правило 1 позволит сделать балансировку между двумя (в моем случае) каналами
6 Закомментированное правило 2 позволит запросы на определенный порт (в моем случае 443) отправить через определенный мой гейт
В целом ощущения от нового для меня фаирвола - положительные, конечно придется привыкнуть к чтению логов и чтению статистики. Но неделя мучений с ipfw для реалиции такого же функционала - это серьезный показатель. Вроде в 8ке сделали что-то в помощь ipfw, но это уже другая тема.
В следующий раз опишу как праивльно читать статистику и логи.
0 По-умолчанию все запрещено с уведомлением
1 Юзеры локалки лазиют только на разрешенные сервисы tcp_services
2 Юзеры инета видят на только по портам tcp_public (udp, icmp, gre трафик без ограничений)
3 На запрос, пришедший на определенный ип , будет отправлен ответ через нужный гейт
4 поднят нат и переадресация напрозрачный прокси
5 Закомментированное правило 1 позволит сделать балансировку между двумя (в моем случае) каналами
6 Закомментированное правило 2 позволит запросы на определенный порт (в моем случае 443) отправить через определенный мой гейт
- Код: Выделить всё
lan_net = "192.168.5.0/24"
int_if = "fxp1"
ext_if1 = "vlan10"
ext_if2 = "vlan20"
ext_gw1 = "GW1"
ext_gw2 = "GW2"
ip0 = "IP0"
ip1 = "IP1"
ip2 = "IP2"
ip3 = "IP3"
ip4 = "IP4"
ip5 = "IP5"
icmp_types = "echoreq, unreach"
tcp_services="21,22,25,80,87,110,143,443,465,995,1501,1778,1863,2802,3306,3389,4000,5190,5222,5999,6000,7011,3233,8181,9090,9999,37710,60177,60178"
tcp_public="22,1723,3389"
set block-policy return
set skip on lo
#может понадобится
#int_service = "{ int_ip1, int_ip2, int_ip3 }"
#rdr on $ext_if proto tcp to port XX -> $int_service round-robin sticky-address
# nat outgoing connections on each internet interface
rdr on $ext_if2 proto tcp from any to $ip1 port 3389 -> 192.168.5.105 port 3389
rdr on $ext_if2 proto tcp from any to $ip4 port 3389 -> 192.168.5.144 port 3389
rdr on $int_if proto tcp from $lan_net to any port 80 -> 192.168.5.1 port 8080
nat on $ext_if1 from $lan_net to any -> ($ext_if1)
#nat on $ext_if2 from $lan_net -> ($ext_if2)
antispoof quick for { lo $int_if $ext_if1 $ext_if2}
# default deny
block in all
block return-rst in proto tcp all
block return-icmp in proto udp all
block out all
block return-rst out proto tcp all
block return-icmp out proto udp all
#block drop in quick on $ext_if from $martians to any
#block drop out quick on $ext_if from any to $martians
#--- Allow outgoing traffic
pass out on $ext_if1 all
pass out on $ext_if2 all
#-------------------
#--- PBR out
#1
# pass in on $int_if route-to { ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2) } round-robin from $lan_net
#2
#pass in on $int_if route-to ($ext_if1 $ext_gw1) proto tcp from $lan_net to port https
pass in quick on $int_if route-to { ($ext_if1 $ext_gw1) } proto tcp from $lan_net to any port { $tcp_services } flags S/SA keep state
#--- PBR in
pass in quick on $ext_if1 reply-to ($ext_if1 $ext_gw1) inet proto { tcp } from any to { $ip0 } port { $tcp_public }
pass in quick on $ext_if1 reply-to ($ext_if1 $ext_gw1) inet proto { tcp } from { $ip0 } port { $tcp_public } to any
pass in quick on $ext_if1 reply-to ($ext_if1 $ext_gw1) inet proto { icmp,udp,gre } from any to { $ip0 }
pass in quick on $ext_if1 reply-to ($ext_if1 $ext_gw1) inet proto { icmp,udp,gre } from { $ip0 } to any
pass in quick on $ext_if2 reply-to ($ext_if2 $ext_gw2) inet proto { tcp } from any to { $ip1, $ip2, $ip3, $ip4, $ip5 } port { $tcp_public }
pass in quick on $ext_if2 reply-to ($ext_if2 $ext_gw2) inet proto { tcp } from { $ip1, $ip2, $ip3, $ip4, $ip5 } port { $tcp_public } to any
pass in quick on $ext_if2 reply-to ($ext_if2 $ext_gw2) inet proto { icmp,udp,gre } from any to { $ip1, $ip2, $ip3, $ip4, $ip5 }
pass in quick on $ext_if2 reply-to ($ext_if2 $ext_gw2) inet proto { icmp,udp,gre } from { $ip1, $ip2, $ip3, $ip4, $ip5 } to any
pass proto tcp from any to { 192.168.5.105, 192.168.5.144 } port 3389 flags S/SA synproxy state
#--- Allow all on local interface
pass quick on $int_if all
#-------------------
В целом ощущения от нового для меня фаирвола - положительные, конечно придется привыкнуть к чтению логов и чтению статистики. Но неделя мучений с ipfw для реалиции такого же функционала - это серьезный показатель. Вроде в 8ке сделали что-то в помощь ipfw, но это уже другая тема.
В следующий раз опишу как праивльно читать статистику и логи.