FreeBSD Часть 11 Установка и настройка Firewall

   По хорошему, по правилам нужно пересобирать ядро. Но можно и не пересобирать - достаточно загрузить модуль Firewall при старте системы, для этого внесём строку firewall_enable="YES" в файл /etc/rc.conf и после перезагрузки файрволл заработает.

Файл настроек Firewall находится в файле /etc/rc.firewall. Очень мудренный, я не стал с ним разбираться и позаимствовал файл у www.lissyara.su с моими переделками. Меняем родной файл или создаем новый, а путь к файлу прописываем в /etc/rc.conf строчкой:
firewall_type="/etc/rc.firewall"
Пример моего файла:

#!/bin/sh
#
# для начала вводим переменные - для нашего же удобства, чтобы не
# вводить по сотне раз одно и то же, а потом искать почему не работает,
# и в итоге выяснять, что ошибся IP адресом в одном из правил
#
FwCMD="/sbin/ipfw -q"    # собственно где лежит бинарник ipfw  -q не выводить в консоль
LanOut="age0"        # внешний интерфейс
LanIn="fxp0"        # внутренний интерфейс
IpOut="xxx.xxx.xxx.xxx"    # внешний IP адрес машины
IpIn="192.168.xxx.xxx"    # внутренний IP адрес машины
NetMask="28"        # маска сети (если она разная для внешней
NetMask2="22"        # и внутренней сети - придется вводить еще
                        # одну переменную, как у меня)
NetIn="192.168.xxx.xxx"    # Внутренняя сеть
#
# Сбрасываем все правила:
${FwCMD} -f flush

${FwCMD} -f table 1 flush  # это правило для bruteblock, про который расказано будет в следуюших статьях
# Сбрасываем все pipe
${FwCMD} -f pipe flush
# Сбрасываем очереди
${FwCMD} -f queue flush
#
# Проверяем - соответствует ли пакет динамическим правилам:
${FwCMD} add check-state
#
# Разрешаем весь траффик по внутреннему интерфейсу (петле)
# Вообще я во многих местах читал что без него может ничЈ не заработать вообще
# и прочие страшилки. Работает - почта, апач, .... А вот squid - не работает :)
# так что без него и правда - никуда.
${FwCMD} add allow ip from any to any via ${LanIn}
#
# правило для bruteblock
${FwCMD} add deny all from "table(1)" to me 
# это правило для bruteblock, про который расказано будет в следуюших статьях# это тоже правило для bruteblock  # это правило для bruteblock, про который расказано будет в следуюших статьях# это правило для bruteblock, про который расказано будет в следуюших статьях
#
# рубим попытки lo0 куда-то лезть и откуда-то лезть на lo0
${FwCMD} add deny ip from any to 127.0.0.0/8
${FwCMD} add deny ip from 127.0.0.0/8 to any
# Вводим запреты:
# режем частные сети на внешнем интерфейсе - по легенде он у нас
# смотрит в интернет, а значит пакетам этим браться неоткуда на нЈм.
# рубим частные сeти
${FwCMD} add deny ip from any to 10.0.0.0/8 in via ${LanOut}
${FwCMD} add deny ip from any to 172.16.0.0/12 in via ${LanOut}
${FwCMD} add deny ip from any to 192.168.0.0/16 in via ${LanOut}
${FwCMD} add deny ip from any to 0.0.0.0/8 in via ${LanOut}
# рубим автоконфигуреную частную сеть
${FwCMD} add deny ip from any to 169.254.0.0/16 in via ${LanOut}
# рубаем мультикастовые рассылки
${FwCMD} add deny ip from any to 240.0.0.0/4 in via ${LanOut}
# рубим фрагментированные icmp
${FwCMD} add deny icmp from any to any frag
# рубим широковещательные icmp на внешнем интерфейсе
${FwCMD} add deny log icmp from any to 255.255.255.255 in via ${LanOut}
${FwCMD} add deny log icmp from any to 255.255.255.255 out via ${LanOut}
#
# !!!!!!!!!!!!!! а тут собственно файрволл и начался:
# если есть прокси всех перенаправляем туда
#${FwCMD} add fwd ${IpIn},2121 tcp from ${NetIn}/${NetMask2} to any 21 via ${LanOut}
# отправляем всех на squid (в данном случае - прокси прозрачный)
#${FwCMD} add fwd 127.0.0.1,3128 tcp from ${NetIn}/${NetMask2} to any 80 via ${LanOut}
#
# пропускаем траффик через трансляцию сетевых адресов (NAT)
${FwCMD} add divert natd ip from ${NetIn}/${NetMask2} to any out via ${LanOut}
${FwCMD} add divert natd ip from any to ${IpOut} in via ${LanOut}
# рубим траффик к частным сетям через внешний интерфейс
# заметтьте - эти правила отличаются от тех что были выше!
${FwCMD} add deny ip from 10.0.0.0/8 to any out via ${LanOut}
${FwCMD} add deny ip from 172.16.0.0/12 to any out via ${LanOut}
${FwCMD} add deny ip from 192.168.0.0/16 to any out via ${LanOut}
${FwCMD} add deny ip from 0.0.0.0/8 to any out via ${LanOut}
# рубим автоконфигуреную частную сеть
${FwCMD} add deny ip from 169.254.0.0/16 to any out via ${LanOut}
# рубаем мультикастовые рассылки
${FwCMD} add deny ip from 224.0.0.0/4 to any out via ${LanOut}
# рубаем мультикастовые рассылки
${FwCMD} add deny ip from 240.0.0.0/4 to any out via ${LanOut}
#
# разрешаем все установленные соединения (если они установились -
# значит по каким-то правилам они проходили.)
${FwCMD} add allow tcp from any to any established
# разрешаем весь исходящий траффик (серверу-то в инет можно? :))
#${FwCMD} add allow ip from ${IpOut} to any out xmit ${LanOut}
${FwCMD} add allow ip from ${IpOut} to any
# разрешаем DNS снаружи (нам же надо узнавать IP по именам машин?)
${FwCMD} add allow udp from any 53 to any via ${LanOut}
# разрешаем DNS входящий снаружи - если на этой машине работает named
# и держит какую-то зону. В остальных случаях - не нужно
${FwCMD} add allow udp from any to any 53 via ${LanOut}
# разрешаем UDP (для синхронизации времени - 123 порт)
${FwCMD} add allow udp from any to any 123 via ${LanOut}
# разрешаем ftp снаружи (оба правила - для пасивного режима)
#${FwCMD} add allow tcp from any to ${IpOut} 21 via ${LanOut}
#${FwCMD} add allow tcp from any to ${IpOut} 50000-50100 via ${LanOut}
# разрешаем некоторые типы ICMP траффика - эхо-запрос,
# эхо-ответ и время жизни пакета истекло
${FwCMD} add allow icmp from any to any icmptypes 0,8,11
# открываем снаружи 80 порт - если у нас есть WWW сервер на машине
${FwCMD} add allow tcp from any to ${IpOut} 80 via ${LanOut}
# открываем снаружи 25 порт (SMTP) если на машине крутится почта
${FwCMD} add allow tcp from any to ${IpOut} 25 via ${LanOut}
# открываем снаружи 22 порт - если надо будет ходить на машину по ssh
${FwCMD} add allow tcp from any to ${IpOut} 22 via ${LanOut}
# открываем снаружи 143 порт(если надо смотреть почту снаружи по IMAP)
${FwCMD} add allow tcp from any to ${IpOut} 143 via ${LanOut}
# открываем снаружи 110 порт(если надо смотреть почту снаружи по POP)
${FwCMD} add allow tcp from any to ${IpOut} 110 via ${LanOut}
# по поводу следующих трех правил, для tcp, udp и icmp - их можно
# заменить одним правилом:
#${FwCMD} add allow ip from any to any via ${LanIn}
# но для удобства наладки и контроля происходящего я предпочитаю три отдельных
# правила, хотя могут быть грабли - например протокол gre не пройдет -
# придется стругать отдельное правило для него, типа
#${FwCMD} add allow gre from any to any via ${LanIn}
# итак:
# разрешаем весь tcp траффик внутри локалки (на внутреннем интерфейсе)
${FwCMD} add allow tcp from any to any via ${LanIn}
# разрешаем весь udp траффик внутри локалки (на внутреннем интерфейсе)
${FwCMD} add allow udp from any to any via ${LanIn}
# разрешаем весь icmp траффик внутри локалки (на внутреннем интерфейсе)
${FwCMD} add allow icmp from any to any via ${LanIn}
# ну вот и все, в конце у файервола по умолчанию будет стоять deny ip from any to any

Для просмотра установленных правил фаерволла есть следующие команды:

ipfw list - показывает список правил
ipfw table 1 list - показывает ip адреса, кто находится в этой таблице
ipfw table 1 add 109.237.2.166 - добавить ip адрес в таблицу 1
ipfw table 1 delete 109.237.2.166 - удалить ip адрес из таблицы 1

ipfw show - тоже показывает список правил, но вместе с числом пакетов и байт, что попали под эти правила. Очень удобно при отдладке - смотрим на чём зарубаются пакеты.
ipfw zero - обнуление всех счётчиков. Если ввести в виде
ipfw zero №_правила то будет обнулён только счётчик правила с этим номером.

 

Пример файла:
Если не хотим чтобы выводились сообщения в консоль нужно запускать с ключом -q
FwCMD="/sbin/ipfw -q"
Не забываем про NAT. NAT - это Network Address Translation - подделка сетевых адресов. Есть т.н. частные сети - диапазоны IP-адресов которые запрещено применять в интернете, и они применяются организациями для адресации внутренних сетей организации. Но - несмотря на то, что сеть внутренняя - сотрудники хотят шариться по инету. Для того чтобы все пользователи серых адресов могли ходить в инет и существует NAT - он подделывает адрес отправителя, как будто пакет шёл от машины, на которой крутится NAT, а не от машины в частной сети. Ответ тоже приходит на эту машину, и всё тот же NAT разбирает кому он предназначен, снова подделывает адрес, будто он шёл не ему, а машине с частным адресом.
Чтобы NAT заработал нужно прописать в файле /etc/rc.conf
# natd_enable="YES"

интерфейс на котором он будет работать (тот, который смотрит в инет)
# natd_interface="age0"

флаги, если кому нужно :
-u - транслировать только адреса частных сетей, т.е. по RFC 1918: 10.0.0.0/8, 172.16.0.0/12 and 192.168.0.0/16
-m - попробовать оставить тот же номер порта что и был, с этим флагом протоколы, типа RPC лучше пашут.
# natd_flags="-m -u"

 

Категории:

Рейтинг: 
Средняя: 3.7 (3 оценок)

Добавить комментарий

Filtered HTML

Plain text