Файрвол ipfw в FreeBSD

Рейтинг:  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

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

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

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

#!/bin/sh
ipfw -q -f flush
cmd="ipfw -q add"
skip="skipto 800"
ks="keep-state"
LanOut="re0" интерфейс смотрящий в интернет (Ваш провайдер)
LanIn="vr0"  смотрит в локальную сеть

$cmd 010 allow all from any to any via lo0
$cmd 005 allow all from any to any via $LanIn
$cmd 014 divert natd ip from any to any in via $LanOut
$cmd 015 check-state

##############################out####################

 

$cmd 024 allow tcp from any to any 53 out via $LanOut setup $ks
$cmd 025 allow udp from any to any 53 out via $LanOut
$cmd 026 allow udp from any 53 to any in via $LanOut $ks
$cmd 027 allow tcp from any to any 67 out via $LanOut setup $ks

#http(s)
$cmd 030 $skip tcp from any to any 80,443 out via $LanOut setup $ks

#teamviwer
$cmd 030 $skip tcp from any to any 5938 out via $LanOut setup $ks

#pop/smtp
$cmd 040 $skip tcp from any to any 25,110,143,465,993,995 out via $LanOut setup $ks

#access root
$cmd 050 $skip tcp from me to any out via $LanOut setup $ks uid root

#ssh
$cmd 060 $skip tcp from any to any 5906,5910 out via $LanOut setup $ks

#whois
$cmd 070 $skip tcp from any to any 43 out via $LanOut setup $ks

#ntp
$cmd 080 $skip udp from any to any 123 out via $LanOut $ks

$ping
$cmd 090 $skip icmp from any to any out via $LanOut $ks
$cmd 091 $skip ICMP from 192.168.1.126 to any out via $LanOut $ks

#traceroute
$cmd 092 $skip TCP from any to any 33434 out via $LanOut setup $ks
$cmd 093 $skip UDP from any to any 33434-33534 out via $LanOut $ks

#######################################in#############################
#$cmd 300 deny all from 192.168.0.0/16 to any in via $LanOut
#$cmd 301 deny all from 172.16.0.0/12 to any in via $LanOut
#$cmd 302 deny all from 10.0.0.0/8 to any in via $LanOut
$cmd 303 deny all from 127.0.0.0/8 to any in via $LanOut
$cmd 304 deny all from 0.0.0.0/8 to any in via $LanOut
$cmd 305 deny all from 169.254.0.0/16 to any in via $LanOut
$cmd 306 deny all from 192.0.2.0/24 to any in via $LanOut
$cmd 307 deny all from 204.152.64.0/23 to any in via $LanOut

$cmd 308 deny all from 224.0.0.0/3 to any in via $LanOut

$cmd 315 deny tcp from any to any 81,113,137-139 in via $LanOut
$cmd 330 deny all from any to any frag in via $LanOut
#$cmd 332 allow tcp from any to any established in via $LanOut

#ssh
$cmd 380 allow tcp from any to me 5906,5910 in via $LanOut setup limit src-addr 2

#icmp
$cmd 381 allow icmp from any to any in via $LanOut $ks

$cmd 400 deny log all from any to any in via $LanOut
$cmd 450 deny log all from any to any out via $LanOut
$cmd 800 divert natd ip from any to any out via $LanOut

$cmd 801 allow ip from any to any
$cmd 999 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)
natd_enable="YES"
natd_interface="re0" интерфейс смотрящий в инет
natd_flags="-f /etc/natd.conf" - для редиректа портов

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

reboot

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

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

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

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

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

Всем удачи!

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