Файрвол ipfw в FreeBSD + kernel nat

Рейтинг:  0 / 5

Звезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активна
 

IPFIREWALL (IPFW) - представляет собой межсетевой экран, написанный и поддерживаемый добровольными участниками проекта FreeBSD. Он использует stateless правила, т.е. правила без учета состояния, и наследование техники кодирования правил для получения того, что называется простой логикой с сохранением состояния (stateful). 

Честно говоря по началу мне он не понравился, но разобравшись с ним, я понял, что он не хуже чем iptables. Хорошо документирован, так что не буду писать много теории, а сразу переходим к практике.) Но более подробно об IPFW можно прочитать здесь.

Собираем наше ядро, включив туда firewall, natd, bridge (мост - нужен для распределения нагрузки, и так как у нас будет wifi, но об этом в другой статье), Dymmanet (ограничение пропускной способности инета).

Проверим нашу архитектуру командой: 

uname -a

Вывод

FreeBSD gate 11.1-RELEASE FreeBSD 11.1-RELEASE #1: Mon Sep 25 20:30:12 MSK 2017     root@gate:/usr/obj/usr/src/sys/GENERIC  amd64

У меня 64 разрядная ОС, значит мой каталог такой -  /sys/amd64/conf/. У кого x86, каталог i386 (cd  /sys/i386/conf/ )

cd /sys/amd64/conf/

Копируем конфиг нашего ядра

cp GENERIC MYGENERIC

Редактируем. Добавляем необходимые опции.

nano MYGENERIC

options IPFIREWALL

options IPFIREWALL_VERBOSE

options IPFIREWALL_VERBOSE_LIMIT=10

options IPDIVERT

options DUMMYNET

options IPFIREWALL_NAT

options LIBALIAS

options ROUTETABLES=2

options DUMMYNET

options HZ="1000"

device if_bridge

Компилируем новое ядро.

!Процесс занимает длительное время

cd /usr/src
make buildkernel KERNCONF=MYGENERIC

Устанавливаем ядро

make installkernel KERNCONF=MYGENERIC

 Редактируем rc.conf

nano /etc/rc.conf

#firewall
firewall_enable="YES"
firewall_type="open"

Если мы не добавим эту строчку firewall_type="open", то получим автономный сервер без сети.

Перезагружаем сервер

reboot

Вывод системы (uname -a)

FreeBSD gate 11.1-RELEASE FreeBSD 11.1-RELEASE #1: Mon Sep 25 21:50:54 MSK 2017     root@gate:/usr/obj/usr/src/sys/MYGENERIC  amd64

Все готово. Идем дальше.

Поднимаем кеширующий DNS (отдельная статья)

Правила для ipfw

nano /etc/sysctl.conf 

net.inet.ip.fw.one_pass=0

Создаем конфиг нашего файрвола 

touch /etc/ipfw.firewall
nano /etc/ipfw.firewall

ipfw -q -f flush
cmd="ipfw -q add"
cmt="ipfw -q"
#skip="skipto 900"
ks=keep-state
LanOut="em0"
LanIn="em1"
Home="192.168.10.0/24"


$cmd 006 allow all from any to any via $LanIn
$cmd 010 allow all from any to any via lo0
$cmd 014 nat 1 all from any to any via $LanOut
$cmd 015 check-state

#############################out#########################
$cmd 020 allow udp from any to any 53 out via $LanOut
$cmd 021 allow tcp from any to any 53 out via $LanOut
$cmd 022 allow udp from any to any 67 out via $LanOut
$cmd 023 allow udp from any to any 68 in via $LanOut
$cmd 023 allow udp from any 53 to any in via $LanOut
$cmd 024 allow tcp from any 53 to any in via $LanOut

#http(s)
$cmd 025 allow tcp from any to any 80,443 out via $LanOut

#client icmp
$cmd 026 allow icmp from any to any out via $LanOut

#ntp
$cmd 027 allow udp from any to any 123 out via $LanOut

####################IN####################################
#nat
$cmt nat 1 config if $LanOut log reset same_ports unreg_only \
redirect_port tcp 192.168.10.2:3333 3333 \
redirect_port tcp 192.168.10.2:80 80

$cmd 200 allow tcp from any to any established via $LanOut

#ssh
$cmd 201 allow tcp from any to me 22 in via $LanOut setup limit src-addr 2

#icmp
$cmd 202 allow icmp from any to me in via $LanOut

#UDP
$cmd 203 allow udp from any to 10.255.255.255 1947,137-138 in via $LanOut
$cmd 204 allow all from any to 224.0.0.1 in via $LanOut

#web nat
$cmd 205 allow tcp from any to 192.168.10.2 80 in via $LanOut
$cmd 206 allow tcp from any to 192.168.10.2 3333 in via $LanOut

#ntp
$cmd 220 allow udp from any to any 123 in via $LanOut

$cmd 401 deny log all from any to 10.0.0.0/8 in via $LanOut
$cmd 402 deny log all from 127.0.0.0/8 to any in via $LanOut
$cmd 403 deny log all from any to 172.10.0.0/12 in via $LanOut
$cmd 404 deny log all from any to 192.168.0.0/16 in via $LanOut
$cmd 405 deny log all from any to 0.0.0.0/8 in via $LanOut
$cmd 406 deny log all from any to 169.254.0.0/16 in via $LanOut
$cmd 407 deny log all from any to 240.0.0.0/4 in via $LanOut

$cmd 999 deny log all from any to any out via $LanOut
$cmd 1000 deny log all from any to any in via $LanOut

$cmd 65534 deny log all from any to any

 

Делаем скрипт исполняемым

chmod +x /etc/ipfw.firewall

Добавляем опции в rc.conf. Вместо firewall_type, ставим firewall_script=путь до Ваше набора правил

nano /etc/rc.conf

#firewall
firewall_enable="YES"
firewall_script="/etc/ipfw.firewall"
firewall_logging="YES" (log)
gateway_enable="YES" шлюз (port.forwarding)

firewall_nat_enable="YES" - для редиректа портов
firewall_nat_interface="em0" - интерфейс смотрящий в инет

Перезагружаем компьютер

reboot

Чтобы применять правила, не обязательно каждый раз перезагружать компьютер, а можно воспользоваться двумя способами, мне больше нравиться второй

  1. sh /etc/ipfw.firewall
  2. service ipfw restart

!Не много дополнительной информации!

Чтобы отследить IP или порты приходящие на наш шлюз или идущие из локальной сети, можно воспользоваться утилитой iftop. (расскажу о ней более подробно в другой статье)

Если что-то не проходит, то смотрим логи ipfw (/var/log/security)

Всем удачи!

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