IPFW + NATD
Несмотря на то, что наша прелесть называется PFSense и работает на PF, иногда хочется отбить у людей всякое желание что-либо конфигурировать, сделав файервол совсем без ГУИ, даже для себя любимиого…
…Или же, поставить сложную систему, где в Jai-ах будут биться другие нужные вещи (кстати, фаервол в джейле работает ничо так)… то выходом будет IPFW с NAT-ом
Сделать кастомный IPFW, для чего изучить теорию, приведенную
IPFW
Или попроще, для дома, для семьи, например, в джейле от FreeNAS, сляпить простой фаервол на IPFW. Здесь мы имеем 2 сетевухи:
вовне - re0, с адресом 87.255.0.230/30
внутрь, igb1, с адресом 192.168.10.254/24
Далее - немного перефразированная копипаста с http://www.linuxsuxx.org/bsd/stroim-nat-na-freebsd-po-ochen-uskorennoj-programme.html
1. Пересобираем ядро
Ибо нам хочется резать скорость не транспарент проксей, а пайпом;
Также нам хочется файервол с логированием и другие вкусняшки.
cd /usr/src/sys/amd64/conf/
cp GENERIC ROUTER
nano ROUTER
Правим конфиг ядра под наши минимальные ну или по желанию не минимальные нужды:
ident MYROUTER
options IPFIREWALL
#options IPFIREWALL_DEFAULT_TO_ACCEPT
options IPFIREWALL_FORWARD
options DUMMYNET
options IPDIVERT
options HZ=1000
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMIT=100
и собираем:
config ROUTER
cd ../compile/MYROUTER
make depend
make
Бекапим старое ядро если случится что-то страшное:
cp R /boot/kernel /boot/good
и инсталлим новое ядро
make install
В принципе, если мы делаем все это в джейле, то пересобирать ядро не надо (на FreeNAS все равно не получится), достаточно включить дамминет в rc.conf, дополнительно засунув туда строку
dummynet_enable="YES"
2. rc.conf
в /etc/rc.conf засовываем
defaultrouter="87.255.0.229" #шлюз по умолчанию
gateway_enable="YES" # таки да - будем
firewall_enable="YES" # врубаем ipfw
firewall_script="/etc/firewall.conf" # отсюда наше ipfw должно брать правила
natd_enable="YES" # врубаем natd
natd_interface="re0" # и подсказываем ему где мы будем натить (сетевуха,
#смотрящая в интернет)
Можно включить нат в IPFW, записав в /etc/rc.conf строку
firewall_nat_enable="YES" # для поддержки IPFW NAT
В этом случае НАТ будет не в ядре.
3. /etc/firewall.conf
#!/bin/sh
FwCMD="/sbin/ipfw -q"
${FwCMD} -f flush
${FwCMD} add divert natd all from any to any via re0
Теперь, сохранив этот скрипт, дадим ему права выполнения:
chmod a+x /etc/firewall.conf
У НАС ЕСТЬ ПЕЧЕНЬКИ:
В фаервольский скрипт можно втыкать таблицы и нумерные пайпы с ограничением скорости.
4. CONCLUSION
reboot
Можно заметить, что после перезагрузки оно не будет работать.
Но мы можем в фаервольский скрипт /etc/ipfirewall.conf вписать такую строку
${FwCMD} add 65535 allow all from any to any
и все заработает, так как дефолтные установки файервола “НЕ ПУЩАТЬ” теперь отменены постфактум правилом 65535, которое разрешает проходить всем пакетам всюду.
Правило это записано здесь только для того, чтобы “Оно заработало”. А НА САМОМ ДЕЛЕ то, что мы хотим разрешить, мы должны разрешить явно, а последним правилом ВСЕ НАФИГ ЗАПРЕТИТЬ. Ибо паранойя.
Или же, при конфигурении нового ядра, не надо было комментировать строку
options IPFIREWALL_DEFAULT_TO_ACCEPT
В этом случае оно само будет втыкать в фаервольский скрипт правило add 65535 allow all from any to any
. Но это правило открывает нашу задницу всем и отовсюду.
Поэтому options IPFIREWALL_DEFAULT_TO_ACCEPT
комментировать надо. Патамучта паранойя.