Страница 1 из 1

ipfw и kernel nat

Добавлено: 2010-01-08 23:06:40
KAS
Доброго времени суток!
Имеется 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 из внутренней сети... :(
Заранее благодарю!

Re: ipfw и kernel nat

Добавлено: 2010-01-08 23:37:42
terminus
Так как нат запущен с параметром deny_in, то, по идее, все что в него попадает из внешней сети такого, что не является или ответом на ранее инициализированную сессию, или не подходит под правила проброса портов, все такое должно уничтожаться в нате и не проходить дальше.

Re: ipfw и kernel nat

Добавлено: 2010-01-09 0:11:47
KAS
Ну как бы да... но хотелось бы точно знать что происходит, как я понимаю происходит отброс пакета и завершения поиска, как правило deny. Но так ли это? А то в мане как то размыто это сказано... или я плохо понял...

Re: ipfw и kernel nat

Добавлено: 2010-01-09 12:23:52
terminus
легко проверить. поставьте после ната правило

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

add count tcp from any to me 1234
и попробуйте подсоединиться телнетом откуда-то из вне на порт 1234. Счетчик не обновится - пакет умрет в нате.

Re: ipfw и kernel nat

Добавлено: 2010-01-09 13:24:48
KAS
terminus писал(а):легко проверить. поставьте после ната правило

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

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

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

Re: ipfw и kernel nat

Добавлено: 2010-01-09 13:48:34
hizel
для пасивного ftp нужен еще 20-ый порт

Re: ipfw и kernel nat

Добавлено: 2010-01-09 15:21:20
terminus
Для правильной работы фтп загрузите модуль alias_ftp.ko - это хелпер libalias который умеет отслеживать актив/пассив сессии и подстраевать под них нат.

Re: ipfw и kernel nat

Добавлено: 2010-01-10 17:34:59
KAS
К сожалению ни открытый 20 порт, ни подгруженный модуль alias_ftp не помогают...
Благодарю за советы, пойду думать дальше, что можно прикрутить...

Re: ipfw и kernel nat

Добавлено: 2010-01-10 18:53:01
hizel
что не работает то?
активный или пассивный ftp? :D

Re: ipfw и kernel nat

Добавлено: 2010-01-11 22:32:19
KAS
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, ответ от локальной машины на нем блокируется и все...
Может быть какой-нибудь пинок дадите куда копать или накидаете примерную схему правил.
А то на всех примерах которые находил всем интернет разрешен и на все службы...
Заранее благодарю!