IPFW NAT

Начнем

uname -a
FreeBSD roller.amo.ka 10.3-STABLE FreeBSD 10.3-STABLE #0: Thu Nov 9 22:33:21 
EET 2017 svm@roller.amo.ka:/usr/obj/usr/src/sys/ROLLER i386

Собираем ядро с такими опциями:

IPFW NAT ########################
options IPFIREWALL
options IPFIREWALL_DEFAULT_TO_ACCEPT
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMIT=50
options IPFIREWALL_NAT
options LIBALIAS
options ROUTETABLES=2
options DUMMYNET
#####################################

и добавляем в sysctl и  делаем sysctl restart

net.inet.ip.fw.one_pass=1

или просто даем команду

sysctl net.inet.ip.fw.one_pass=1

net.inet.ip.fw.one_pass: 1 Когда установлено, пакет, выходящий из потока dummynet, не проходит через брандмауэр повторно, в противном случае, после обработки канала пакет повторно вводится в брандмауэр по следующему правилу.

Синтаксис написания правил ядерного IPFW NAT следующий:

ipfw [-q] nat number config config-options

Если явно не указать номер правила nat, система присваивает правилу номер 123.

В /etc/rc.conf добавляем

gateway_enable=«YES»

firewall_enable="YES"
firewall_nat_enable="YES"
firewall_script="/etc/firewall.script"
firewall_logging="YES"
dummynet_enable="YES"

Делаем простейший файервол

ee /firewall.script

#!/bin/sh

# Задаём строку для обращения к ipfw.
ipfw="/sbin/ipfw -q"

# Сетевая карта в которую вставлен провод от провайдера.
LanOut="em0"
IpOut="192.168.1.134"

# Сетевая карта "смотрящая" во внутреннюю сеть.
LanIn="em2"
IpIn="10.0.0.1"

# DMZ
LanDmz="em1"
IpDmz="192.168.2.162"
NetDmz="192.168.2.0"
MaskDmz="28"

# Внутренняя подсеть.
NetIn="10.0.0.0"

# Сетевая маска внутренней подсети.
NetMask="24"

# Если до выполнения этого сценария в фаерволе
# были какие-то правила - сбрасываем их.
${ipfw} -f flush

# Создаём таблицу с пользователями, которым разрешен доступ в Интернет.
# Если в таблице 0 были какие-то значения - сбрасываем их.
${ipfw} -f table 0 flush
${ipfw} table 0 add 10.0.0.0/24

# Сбрасываем все ограничители.
${ipfw} -f pipe flush

# Сбрасываем все очереди.
${ipfw} -f queue flush

# Таблица DMZ
${ipfw} table 10 add 192.168.2.161
${ipfw} table 10 add 192.168.2.163
${ipfw} table 10 add 192.168.2.164

${ipfw} add deny ip from any to any not verrevpath in

# MAIL
${ipfw} add allow tcp from any to 192.168.2.163 25, 587
${ipfw} add allow tcp from 192.168.2.163 to any 25, 587

# NAT
${ipfw} add nat 1 config log if em0 reset same_ports
${ipfw} add nat 1 ip from table\(0\) to not table\(10\) via em0
#${ipfw} add nat 1 ip from 10.0.0.0/24 to not table\(10\) via em0
${ipfw} add nat 1 ip from any to 192.168.1.134 via em0

Где table 10 – не идет через NAT

Статистику можно посмотреть так:

ipfw nat 1 show

Пример: нужно сделать проброс портов для RDP сервера во внутренней сети с IP 10.0.0.20. Тогда правило НАТа примет вид

${ipfw} add nat 1 config log if em0 reset same_ports \
       redirect_port tcp 10.0.0.20:3389 3389

Перезагружаем IPFW и смотрим

 ipfw nat 1 show config

 

http://www.lissyara.su/articles/freebsd/tuning/ipfw_nat/
http://ipfw.ism.kiev.ua/ipfw.html

https://mdex-nn.ru/page/probros-portov-v-jadernom-ipfw-nat.html