Собираю шлюзак на pf. можно сказать, что впервые. Задачи преследовал следующие:
Инет <-> роутер (NAT + DNS ) -> юзеры в локалке по соотв. портам
<--------> почтовик + ntp + ftp + www (по соотв. портам)
<--------> серв с БД инфы по клиентам. (по одному порту)
x--------x КД (запрет выхода в инет)
<--------> локальным WiFi разрешить только сёрфить инет и не попадать на локальные КД (тоже набор портов)
Получилось вот что:
Код: Выделить всё
#----------------------------------------------------------------------------------------------
# 1. MACROS
#----------------------------------------------------------------------------------------------
#Внешний интерфейс
ext_if="fxp1"
#Внутренний интерфейс
int_if="rl0"
#Внутренняя сеть. Все пользователи
lan_net="192.168.0.0/24"
#Внутренние WiFi
WiFi1 = “192.168.0.50/32”
WiFi2=”192.168.0.60/32”
#"Сеть" этого компьютера
int_lan="127.0.0.0/24"
#Частные адреса
private_nets= "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8, 169.254.0.0/16, 192.0.2.0/24, 0.0.0.0/8, 240.0.0.0/4 }"
#Серваки
dc_1 = "192.168.0.1/32"
dc_2 = "192.168.0.2/32"
mail = "192.168.0.4/32"
www = "192.168.0.4/32"
sftp = "192.168.0.4/32"
ntp = "192.168.0.4/32"
gate = "192.168.0.91/32"
#порты пользователей
user_ports = { 80, 443, 25, 110, 21, 8080}
wifi_ports = { 80, 443, 21, 53 }
#----------------------------------------------------------------------------------------------
# 2. TABLES
#----------------------------------------------------------------------------------------------
#Таблица со списком "плохих" ip-адресов. Их блокируем прямо на роутере.
table <blacklist> persist file "/etc/blacklist"
#----------------------------------------------------------------------------------------------
# 3. OPTIONS
#----------------------------------------------------------------------------------------------
#Возвращаем пакеты, а не сбрасываем
set block-policy return
#Собираем статистику с внешнего интерфейса
set loginterface $ext_if
#Пропускаем проверку на loopback interface
set skip on lo0
# Макс. кол-во записей в пуле отвечающем за нормализацию трафика (scrub)
# Макс. кол-во вхождений в пул отвечающий за состояние таблицы состояний соединений (keep state)
set limit { frags 100000, states 100000 }
# Устанавливаем тип оптимизации
set optimization normal
#----------------------------------------------------------------------------------------------
# 4. TRAFFIC NORMALIZATION
#----------------------------------------------------------------------------------------------
#Полностью собираем пакет перед отправкой
scrub in all
#----------------------------------------------------------------------------------------------
# 5. QUEUEING
#----------------------------------------------------------------------------------------------
#Пока без очередей
#----------------------------------------------------------------------------------------------
# 6. NAT
#----------------------------------------------------------------------------------------------
#Nat’им всех на внешний интерфейс
nat on $ext_if inet from !($ext_if) -> ($ext_if:0)
#пробрасываем www
rdr on $ext_if proto tcp from any to 44.18.206.17 port 80 -> $ www port 80
#пробрасываем sftp
rdr on $ext_if proto tcp from any to 44.18.206.17 port 6060 -> $ sftp port 6060
#пробрасываемsmtp
rdr on $ext_if proto tcp from any to 44.18.206.17 port 25 -> $mail port 25
#пробрасываем pop3
rdr on $ext_if proto tcp from any to 44.18.206.17 port 110 -> $mail port 110
#пробрасываем информационную БД
rdr on $ext_if proto tcp from any to 44.18.206.17 port 4061 -> $dc_2 port 4061
#----------------------------------------------------------------------------------------------
# 7. PACKET FILTERING
#----------------------------------------------------------------------------------------------
###### ------------ COMMON --------------- ########
# блокируем всё, если только нет явного разрешения для обратного
block log all
# Блокируем тех, кто лезет на внешний интерфейс с частными адресами
block drop in quick on $ext_if from $private_nets to any
#Спуфинг
antispoof quick for { lo0 $int_if $ext_if }
#Не проверяем пакеты с этого хоста (127.0.0.1)
pass quick from $int_lan
#разрешаем Ping на внешнем и внутреннем интерфейсе
pass in on $ext_if inet proto icmp to ($ext_if) icmp-type echoreq keep state
pass in on $int_if inet proto icmp to ($int_id) icmp-type echoreq keep state
#Разрешаем все исходящие на внешнем и внутреннем интерфейсе gate
pass out on $ext_if from $ext_if to any keep state
pass out on $int_if from $int_if to any keep state
##### ------------ OUTGOING TO INET --------------- ######
#разрешаем доступ из офисной сети во внешний мир портам, перечисленным в переменных user_ports
#{ 80, 443, 25, 110, 21, 8080 }
pass in on $int_if inet proto tcp from $lan_net to any port $user_ports flags S/SA keep state
# Разрешаем с WiFi выходить только по определенным портам:
pass in on $int_if inet proto tcp from $WiFi1 to any port $wifi_ports flags S/SA keep state
# и то же время запрещаем доступ на КД с WiFi точек. WiFi находятся $lan_net, поэтому их надо
# поставить после разрешений, чтобы заблокировать выход.
block drop in quick on $int_if from $WiFi1 to $dc_1
block drop in quick on $int_if from $WiFi1 to $dc_2
block drop in quick on $int_if from $WiFi2 to $dc_1
block drop in quick on $int_if from $WiFi2 to $dc_2
# Разрешаем DNS внутренним КД, WiFi, и почтовику для обращения на gate. На шлюзе вертится ДНС,
# который уже полезет дальше за ответами
pass in on $int_if proto udp from $dc_1 to $gate port 53 flags S/SA keep state
pass in on $int_if proto udp from $dc_2 to $gate port 53 flags S/SA keep state
pass in on $int_if proto udp from $WiFi1 to $gate port 53 flags S/SA keep state
pass in on $int_if proto udp from $WiFi2 to $gate port 53 flags S/SA keep state
pass in on $int_if proto udp from $mail to $gate port 53 flags S/SA keep state
# Выпускаем почтовик - smtp
pass in on $int_if proto tcp from $ mail to any port 25 flags S/SA keep state
# Выпускаем сервер времени на почтовике - ntp
pass in on $int_if proto tcp from $ntp to any port 123 flags S/SA keep state
# Выпускаем сервер времени на обоих КД
pass in on $int_if proto tcp from $dc_1 to any port 123 flags S/SA keep state
pass in on $int_if proto tcp from $dc_2 to any port 123 flags S/SA keep state
# Выпускаем фтп-сервер - sftp
pass in on $int_if proto tcp from $sftp to any port 6060 flags S/SA keep state
# Выпускаем веб-сервер – www
pass in on $int_if proto tcp from $sftp to any port 80 flags S/SA keep state
# Выпускаем КД с информационной БД
pass in on $int_if proto tcp from $dc_2 to any port 4051 flags S/SA keep state
# POP3-сервер -его не надо выпускать, потому что он из инета ничего не тащит.
#pass in on $int_if proto tcp from $sftp to any port 110 flags S/SA keep state
##### ------------ INCOMING FROM INET --------------- ######
#входящий ssh на gate
pass in log on $ext_if inet proto tcp from any to $ext_ip port 22222 flags S/SA synproxy state
#входящий smtp на внутренний почтовик
pass in on $ext_if inet proto tcp from any to $mail 25 flags S/SA synproxy state
#входящий sftp на внутренний sftp-сервер
pass in on $ext_if inet proto tcp from any to $sftp port 6060 flags S/SA synproxy state
#входящий www на веб-сервер
pass in on $ext_if inet proto tcp from any to $www 80 flags S/SA synproxy state
#входящий ntp на ntp-сервер нам не нужен, потому что мы не работаем, как ntp-сервер
#pass in on $ext_if inet proto tcp from any to $ntp port 123 flags S/SA synproxy state
#входящий dns-траффик на gate c интернетчиков
pass in on $ext_if inet proto tcp from any to $gate port 53 flags S/SA synproxy state
#входящий pop3 на внутренний почтовик
pass in on $ext_if inet proto tcp from any to $mail port 110 flags S/SA synproxy state
#входящий траффик для БД на внутренний КД
pass in on $ext_if inet proto tcp from any to $dc_2 port 4051 flags S/SA synproxy state
Ответы от ДНСа на роутере клиентам возвращаются, а маршрутов до айпишников нет.
С самого шлюза инет и route to host есть. Из этого делаю вывод, что проблема где то на уровне фильтрации пакетов.
Кто подскажет, тому спасибон