Локалка не NAT'ится средствами pf
Добавлено: 2013-03-21 9:37:02
Добрый день, уважаемые!
Собираю шлюзак на pf. можно сказать, что впервые. Задачи преследовал следующие:
Инет <-> роутер (NAT + DNS ) -> юзеры в локалке по соотв. портам
<--------> почтовик + ntp + ftp + www (по соотв. портам)
<--------> серв с БД инфы по клиентам. (по одному порту)
x--------x КД (запрет выхода в инет)
<--------> локальным WiFi разрешить только сёрфить инет и не попадать на локальные КД (тоже набор портов)
Получилось вот что:
Итог:
Ответы от ДНСа на роутере клиентам возвращаются, а маршрутов до айпишников нет.
С самого шлюза инет и route to host есть. Из этого делаю вывод, что проблема где то на уровне фильтрации пакетов.
Кто подскажет, тому спасибон
Собираю шлюзак на 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 есть. Из этого делаю вывод, что проблема где то на уровне фильтрации пакетов.
Кто подскажет, тому спасибон
