FreeBSD шлюз (черновик)
ipfw может работать как подгружаемый модуль (kldload ipdivert, kldload dummynet, kldload ipfw),
либо на уровне ядра (требуется пересборка ядра с включением нужных опций)
Начало.
ee /etc/resolv.conf
nameserver — должен быть прописан рабочий!
проверяем ping ya.ru и если все ок, путти подключается, идем дальше.
=== Пересборка ядра ==
cp /usr/src/sys/amd64/conf/GENERIC /usr/src/sys/amd64/conf/GENERIC_ROUTER
ee /usr/src/sys/amd64/conf/GENERIC_GATE_TEST
В строке ident GENERIC дописываем что-нибудь
ident GENERIC_ROUTER
… далее добавляем опции
options IPFIREWALL # включаем ipfw
options IPFIREWALL_NAT # включает NAT уровня ядра
options LIBALIAS # включает NAT уровня ядра
# options IPFIREWALL_FORWARD # включает форвардинг (в 10 версии упразнили)
# options IPDIVERT # включает возможность использования NAT посредством демона natd
options IPFIREWALL_VERBOSE # включение логирования ipfw (если в правилах будет прописано log)
options IPFIREWALL_VERBOSE_LIMIT=20 # ограничение на количество записей в лог от одного правила — защищает от флуда одним и тем же в логах
# options IPFIREWALL_DEFAULT_TO_ACCEPT # делаем по-умолчанию ipfw открытым — думаем, включать или нет
# options DUMMYNET # если нужно использовать шейпинг, ограничение скорости, pipe/queue — включаем
cd /usr/src && make kernel -s -j4 KERNCONF=GENERIC_ROUTER
этот процесс может выполняться десятки минут… дожидаемся…
После пересборки вписываем:
ee /boot/loader.conf
net.inet.ip.fw.one_pass=1
и reboot
=== // Пересборка ядра ==
ee /etc/rc.conf
hostname=»bsdgate»
ifconfig_em0=»192.168.21.3/24″
ifconfig_em1=»95.47.183.2/24″
#ifconfig_em1=»inet 95.47.183.2 netmask 255.255.255.0″
defaultrouter=»95.47.183.1″
sshd_enable=»YES»
ntpd_enable=»YES»
gateway_enable=»YES»
firewall_enable=»YES»
firewall_nat_enable=»YES»
firewall_script=»/etc/rc.ipfw_rules»
#firewall_nat_interface=»em1″
#dummynet_enable=»YES»
#=================================================
ee /etc/rc.ipfw_rules
#!/bin/sh
# Переменные
wan=»em1″
wan_ip=»95.47.183.2″
lan=»em0″
lan_ip=»192.168.21.3″
cmd=»ipfw»
#cmd=»ipfw -q» — будет скрывать правила при запуске или рестарте фаервола
# Правила
$cmd -f flush
# Разрешаем весь трафик по внутреннему интерфейсу
$cmd add 100 allow ip from any to any via lo0
# Запрещаем доступ извне к внутреннему интерфейсу
$cmd add 200 deny ip from any to 127.0.0.0/8
$cmd add 300 deny ip from 127.0.0.0/8 to any
# Разрешаем подключение по ssh извне
$cmd add 400 allow tcp from any to $wan_ip 22 in via $wan
$cmd add 410 allow tcp from $wan_ip 22 to any out via $wan established
# Разрешаем ftp снаружи (если необходимо)
#$cmd add 700 allow tcp from any to $wan_ip 20,21 in via $wan
#$cmd add 710 allow tcp from $wan_ip 20,21 to any out via $wan established
#$cmd add 720 allow tcp from any to $wan_ip 49000-55000 in via $wan
# Разрешаем некоторые типы ICMP трафика — эхо-запрос, эхо-ответ и время жизни пакета истекло
$cmd add 800 allow icmp from any to any icmptypes 0,8,11
# Разрешаем все соединения на локальном интерфейсе
$cmd add 900 allow all from any to any via $lan
# Пример проброса портов 3389 и 80 в локальную сеть на два разных компьютера
$cmd nat 1 config log if $wan reset same_ports deny_in redirect_port tcp 192.168.21.4:3389 3389 redirect_port tcp 192.168.21.5:80 80
# Включаем NAT
$cmd add 1000 nat 1 log ip from any to any via $wan
# Запрещаем все, что не разрешено
$cmd add 65534 deny log all from any to any
#=================================================
Перезапуск ipfw — за одно он перечитывает конфиги:
/etc/rc.d/ipfw restart
ipfw show
Включить ping извне до нашего шлюза!
ipfw add 998 allow icmp from any to me icmptypes 0,3,8,11
ipfw add 999 allow icmp from me to any icmptypes 0,3,8,11
Посмотреть кто по каким портам куда идет:
iftop -i em1 -P
Ссылки:
https://ru.wikipedia.org/wiki/Ipfw — в целом объяснение базовых моментов
https://alexnettm.org.ua/freebsd/freebsd-nastrojka-ipfw-kernel-nat.html — более тонкая настройка ipfw
https://habrahabr.ru/post/111580/ — а здесь про разные варианты NATов интересно расписано
http://bezopasnik.org/unix/dok/FreeBSD/dok/632.htm
1 комментарий