IPFW + NATD

Несмотря на то, что наша прелесть называется PFSense и работает на PF, иногда хочется отбить у людей всякое желание что-либо конфигурировать, сделав файервол совсем без ГУИ, даже для себя любимиого…

…Или же, поставить сложную систему, где в Jai-ах будут биться другие нужные вещи (кстати, фаервол в джейле работает ничо так)… то выходом будет IPFW с NAT-ом

  • При таких условиях можно зафигачить крутючий фиревал с ядреным натом и другими ништяками: http://nixman.info/?p=655
  • Сделать кастомный IPFW, для чего изучить теорию, приведенную IPFW
  • Или попроще, для дома, для семьи, например, в джейле от FreeNAS, сляпить простой фаервол на IPFW. Здесь мы имеем 2 сетевухи:
  1. вовне - re0, с адресом 87.255.0.230/30
  2. внутрь, 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 комментировать надо. Патамучта паранойя.

freebsd/fbsd_nat.txt · Last modified: 2019/05/06 18:39 by rybario
About this template
CC Attribution-Share Alike 4.0 International
Powered by PHP Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0 Valid HTML5