ipfw и kernel nat

Все вопросы по установке, обновлению и эксплуатации FreeBSD: конфигурация и сопровождение.

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
KAS
рядовой
Сообщения: 27
Зарегистрирован: 2009-08-12 21:32:10
Откуда: Orenburg
Контактная информация:

ipfw и kernel nat

Непрочитанное сообщение KAS » 2010-01-08 23:06:40

Доброго времени суток!
Имеется firewall настроенный следующим образом:

Код: Выделить всё

#!/bin/sh
LIF="em0"                                                       # Локальный интерфейс
LIP="`ifconfig $LIF|awk '/inet/{print \$2}'`"                   # Локальный ip
LAN="$LIP/24"                                                   # Локальная сеть
WIF="fxp0"                                                      # Внешний интерфейс
WIP="`ifconfig $WIF|awk '/inet/{print \$2}'`"                   # Внешний ip

ipfw="/sbin/ipfw "                                              # Путь к ipfw
add="$ipfw add "                                                # Добавление
pass="$ipfw add pass "                                          # Разрешение
deny="$ipfw add deny "                                          # Запрет
ks="keep-state"                                                 # Чтобы меньше писать

RDP="192.168.1.2"                                               # Хост с Windows для RDP

DenyNets="`cat /etc/permissions/nets.deny`"                     # Файл со списком сетей запрещенных на внешнем интерфейсе
InetAllow="`cat /etc/permissions/inet.allow`"                   # Файл со списком разрешенных IPов
FastInetAllow="`cat /etc/permissions/fastinet.allow`"           # Файл со списком разрешенных IPов (без ограничения скорости)
SA="21,25,53,80,110,443,465,995,5190"                           # Разрешенные сервисы

$ipfw -f flush                                                  # Удаляем старые правила
$ipfw nat 1 delete                                              # Удаляем старый нат
$ipfw disable one_pass                                          # Делаем sysctl net.inet.ip.fw.one_pass=0

$ipfw -f table all flush                                        # Очищаем все таблицы
for lan in $DenyNets; do $ipfw table 1 add $lan; done           # Добавляем запись в таблицу 1
for ip in $InetAllow; do $ipfw table 2 add $ip 1; done          # Добавляем запись в таблицу 2 с медленным интернетом
for ip in $FastInetAllow; do $ipfw table 2 add $ip 2; done      # Добавляем запись в таблицу 2 с быстрым интернетом

# Описываем наш NAT
$ipfw nat 1 config if $WIF log reset deny_in same_ports unreg_only \
redirect_port tcp $RDP:rdp   rdp                                # Делаем редирект на RDP

$add  check-state                                               # Проверяем динамические правила

$pass all from any to any via lo0                               # Разрешаем все на петле
$deny log all from 127.0.0.0/8 to any                           # Запрещаем петле лезть куда-либо на всех интерфейсах
$deny log all from any to 127.0.0.0/8                           # Запрещаем лезть на петлю от куда-либо на всех интерфейсах
$add  fwd 127.0.0.1,3129 tcp from $LAN to any http via $WIF     # Заварачиваем всех на proxy-squid
$add  reass all from any to any in via $WIF                     # Собираем входящие фрагменты на внешнем интерфейсе
$deny log all from any to not me in via $WIF                    # Анти спуфинг (блокируем пакеты не мне на внешнем интерфейсе на вход)
$pass log icmp from any to any icmptypes 0,8 via $WIF           # Разрешаем себя пинговать с наружи
$deny all from not table\(2\) to any recv $LIF xmit $WIF        # Блокируем тех кому не разрешен инет
#$deny log all from $LAN to any not $SA recv $LIF xmit $WIF     # Блокируем доступ к не разрешенным сервисам
$deny log all from table\(1\) to $WIP in  via $WIF              # Блокируем на внешнем интерфейсе частные сети на вход
$deny log all from $WIP to table\(1\) out via $WIF              # Блокируем на внешнем интерфейсе частные сети на выход
$pass tcp from any to $WIP domain in via $WIF setup $ks         # Разрешаем на вход на наш DNS
$pass udp from any to $WIP domain in via $WIF setup $ks         # Разрешаем на вход на наш DNS
$pass all from any to $WIP http,https in via $WIF setup $ks     # Разрешаем на вход Web-трафик к apache
$pass all from any to $WIP ssh in via $WIF setup $ks            # Разрешаем на вход ssh
$pass all from $WIP to any out via $WIF $ks                     # Разрешаем уходить пакетам от самого сервера с сохранением состояния
$add  nat  1 log all from any to any via $WIF                   # Натим всё и вся но только на внешнем интерфейсе
$pass all from any to $LAN in via $WIF                          # Разрешаем на вход трафик отначеный для локалки
$pass all from $WIP to any out via $WIF                         # Разрешаем на выход трафик отначеный из локалки
$pass all from any to any via $LIF                              # Разрешаем все на локальном интерфейсе

$deny log all from any to any                                   # Запрещаем всё и вся (ну так, на всякий случай)
Возникает 2 вопроса:
  • 1. Куда деваются пакеты которые пришли ко мне, прошли нат, но сеть их не запрашивала, куда они деваются? Проходят дальше (но тогда куда) или убиваются (но почему ни что не пишется по этому поводу)?
    А то пугают в логе записи вида:

    Код: Выделить всё

    Jan  9 01:02:51 gateway kernel: ipfw: 1700 Nat TCP 83.149.21.152:55716 xx.xx.xx.xx:110 in via fxp0
    Jan  9 01:02:51 gateway kernel: ipfw: 1700 Nat TCP 83.149.21.152:55717 xx.xx.xx.xx:110 in via fxp0
    Jan  9 01:02:51 gateway kernel: ipfw: 1700 Nat TCP 83.149.21.152:55718 xx.xx.xx.xx:110 in via fxp0
    Jan  9 01:02:51 gateway kernel: ipfw: 1700 Nat TCP 83.149.21.152:55719 xx.xx.xx.xx:110 in via fxp0
    
    ну и подобные, на любые порты кроме тех который я сам ловлю (22,53,80,443,3389)...
    2. Как запретить пользователям сети использовать сервисы, кроме перечисленных в переменной $SA? А то если раскоментировать правило:

    Код: Выделить всё

    #$deny log all from $LAN to any not $SA recv $LIF xmit $WIF             # Блокируем доступ к не разрешенным сервисам
    перестает работать ftp из внутренней сети... :(
Заранее благодарю!
Если хочешь, чтобы что-то было сделано хорошо - сделай это сам!

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
terminus
майор
Сообщения: 2305
Зарегистрирован: 2007-10-29 11:27:35
Откуда: Рига

Re: ipfw и kernel nat

Непрочитанное сообщение terminus » 2010-01-08 23:37:42

Так как нат запущен с параметром deny_in, то, по идее, все что в него попадает из внешней сети такого, что не является или ответом на ранее инициализированную сессию, или не подходит под правила проброса портов, все такое должно уничтожаться в нате и не проходить дальше.
Модель: AST-PM-105/0044; Тип: Универсальный, ремонтный; Название: Терминус; Род повреждения: Распад функций; Выводы: Сдать на слом.

Аватара пользователя
KAS
рядовой
Сообщения: 27
Зарегистрирован: 2009-08-12 21:32:10
Откуда: Orenburg
Контактная информация:

Re: ipfw и kernel nat

Непрочитанное сообщение KAS » 2010-01-09 0:11:47

Ну как бы да... но хотелось бы точно знать что происходит, как я понимаю происходит отброс пакета и завершения поиска, как правило deny. Но так ли это? А то в мане как то размыто это сказано... или я плохо понял...
Если хочешь, чтобы что-то было сделано хорошо - сделай это сам!

Аватара пользователя
terminus
майор
Сообщения: 2305
Зарегистрирован: 2007-10-29 11:27:35
Откуда: Рига

Re: ipfw и kernel nat

Непрочитанное сообщение terminus » 2010-01-09 12:23:52

легко проверить. поставьте после ната правило

Код: Выделить всё

add count tcp from any to me 1234
и попробуйте подсоединиться телнетом откуда-то из вне на порт 1234. Счетчик не обновится - пакет умрет в нате.
Модель: AST-PM-105/0044; Тип: Универсальный, ремонтный; Название: Терминус; Род повреждения: Распад функций; Выводы: Сдать на слом.

Аватара пользователя
KAS
рядовой
Сообщения: 27
Зарегистрирован: 2009-08-12 21:32:10
Откуда: Orenburg
Контактная информация:

Re: ipfw и kernel nat

Непрочитанное сообщение KAS » 2010-01-09 13:24:48

terminus писал(а):легко проверить. поставьте после ната правило

Код: Выделить всё

add count tcp from any to me 1234
и попробуйте подсоединиться телнетом откуда-то из вне на порт 1234. Счетчик не обновится - пакет умрет в нате.
Благодарю!
Проверил, пакет умирает! :good: Все нервы успокоил...

А по второму вопросу какие идеи есть?
У меня только 1 вариант поставить какой-нибудь ftp прокси, но не хочу запускать еще 1 сервис, охота как нибудь файрволом этот вопрос решить...
Если хочешь, чтобы что-то было сделано хорошо - сделай это сам!

Аватара пользователя
hizel
дядя поня
Сообщения: 9032
Зарегистрирован: 2007-06-29 10:05:02
Откуда: Выборг

Re: ipfw и kernel nat

Непрочитанное сообщение hizel » 2010-01-09 13:48:34

для пасивного ftp нужен еще 20-ый порт
В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.

Аватара пользователя
terminus
майор
Сообщения: 2305
Зарегистрирован: 2007-10-29 11:27:35
Откуда: Рига

Re: ipfw и kernel nat

Непрочитанное сообщение terminus » 2010-01-09 15:21:20

Для правильной работы фтп загрузите модуль alias_ftp.ko - это хелпер libalias который умеет отслеживать актив/пассив сессии и подстраевать под них нат.
Модель: AST-PM-105/0044; Тип: Универсальный, ремонтный; Название: Терминус; Род повреждения: Распад функций; Выводы: Сдать на слом.

Аватара пользователя
KAS
рядовой
Сообщения: 27
Зарегистрирован: 2009-08-12 21:32:10
Откуда: Orenburg
Контактная информация:

Re: ipfw и kernel nat

Непрочитанное сообщение KAS » 2010-01-10 17:34:59

К сожалению ни открытый 20 порт, ни подгруженный модуль alias_ftp не помогают...
Благодарю за советы, пойду думать дальше, что можно прикрутить...
Если хочешь, чтобы что-то было сделано хорошо - сделай это сам!

Аватара пользователя
hizel
дядя поня
Сообщения: 9032
Зарегистрирован: 2007-06-29 10:05:02
Откуда: Выборг

Re: ipfw и kernel nat

Непрочитанное сообщение hizel » 2010-01-10 18:53:01

что не работает то?
активный или пассивный ftp? :D
В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.

Аватара пользователя
KAS
рядовой
Сообщения: 27
Зарегистрирован: 2009-08-12 21:32:10
Откуда: Orenburg
Контактная информация:

Re: ipfw и kernel nat

Непрочитанное сообщение KAS » 2010-01-11 22:32:19

hizel писал(а):что не работает то?
активный или пассивный ftp? :D
Перестает работать пассивный, он по умолчанию же в браузерах (насколько я знаю).
Насчет ftp я смирился и поставил frox, вроде робит...
Ладно, тогда другой вопрос, как можно настроить ipfw таким образом чтобы доступ в интернет был доступен только ограниченному кругу пользователей (по ip адресу) и к определенному виду сервисов, как то: http (ну это squid сам решит), https, ftp (frox), icq и почта (smtp(s), pop(s)).
Кроме того должно быть перенаправление портов на машины в локальной сети (rdp в частности).
Просто если использовать, то что я настроил, то вроде все хорошо...
НО! Если правило

Код: Выделить всё

$deny log all from $LAN to any not $SA recv $LIF xmit $WIF     # Блокируем доступ к не разрешенным сервисам
активно, то перестает работать перенаправление RDP, ответ от локальной машины на нем блокируется и все...
Может быть какой-нибудь пинок дадите куда копать или накидаете примерную схему правил.
А то на всех примерах которые находил всем интернет разрешен и на все службы...
Заранее благодарю!
Если хочешь, чтобы что-то было сделано хорошо - сделай это сам!