Ядерный NAT во FreeBSD


--Artix 13:02, 9 декабря 2010 (UTC)

В последних версиях FreeBSD (по-моему с ветки 8.x) во FreeBSD появился так называемый ядерный NAT (kernel nat) - механизм, замещающий стандартный демон NAT - natd. Мои опыты и практическое использование показали, что ядерный NAT - намного шустрее и отзывчивее natd, и при правильном использовании повышает работоспособность даже самого тупого шлюза. Делается ядерный NAT не совсем быстро, но оно того стоит.

Сначала пересобирается ядро. В файле /usr/src/sys/amd64/conf/MYKERNEL добавляются опции для поддержки ядерного NAT.
cpu I686_CPU
ident OFFICE
options GEOM_MIRROR
...
# Ядерный НАТ
options IPFIREWALL
options IPFIREWALL_NAT
options IPFIREWALL_FORWARD
....

В файле /etc/rc.conf всё достаточно просто "как обычно":
hostname="office"
ifconfig_vr0="inet 192.168.1.1 netmask 255.255.255.0"
ifconfig_fxp0="inet 32.32.32.200 netmask 255.255.255.0"
defaultrouter="32.32.32.1"
gateway_enable="YES"

firewall_enable="YES"
firewall_type="simple"
firewall_simple_oif="fxp0"
firewall_simple_onet="32.32.32.0/24"
firewall_simple_iif="vr0"
firewall_simple_inet="192.168.1.0/24"
firewall_quiet="NO"
firewall_script="/etc/firewall.conf"

#Обычный NAT - не нужен
#natd_enable="YES"
#natd_interface="re0"
#natd_flags="-f /etc/redirect.conf"

Я специально привел кусок конфига, в котором наглядно видно, что natd - для ядерного "ната" не нужен.

И осталось привести актуальный кусок из файла /etc/firewall.conf Этот файл - точная копия стандартного /etc/rc.firewall, который я просто поправил для своих нужд, выкинув из него IPv6 и добавив всякие хак-проверки и баны. А в то место, где раньше была секция natd - divert - я написал вставку своего ядерного NAT:
case ${firewall_type} in
[Oo][Pp][Ee][Nn])
${fwcmd} add 65000 pass all from any to any
;;

[Ss][Ii][Mm][Pp][Ll][Ee])

# ...

# KERNEL NAT
${fwcmd} nat 1 config if ${oif} log same_ports unreg_only
${fwcmd} add nat 1 ip from ${inet} to any
${fwcmd} add nat 1 ip from any to ${onet} via ${oif}

${fwcmd} add fwd 192.168.1.1,3128 tcp from ${inet} to any 80

# ....

esac

Squid все также остался прозрачным - но уже с использованием NAT ядра.

-------------------------------------------------------------------------------------------------

Вот рабочий конфиг разобрацца я думаю можно и самому

Код: Выделить всё
#!/bin/sh
ipfw -f flush
oif="rl0"
iif="rl1"
oip="xxx.xxx.xxx.xxx"
iip="192.168.0.1"
dns1="yyy.yyy.yyy.yyy"
#Хождение через loopbask
ipfw add 10 allow all from any to any via lo0

ipfw add 20 fwd 127.0.0.1,3128 tcp from 192.168.0.0/24 to any dst-port 80 via $iif
#------------------------------------------
ipfw nat 1 config if $oif log redirect_port tcp 192.168.0.5:9999 9999
ipfw add 100 nat 1 tcp from any to $oip 9999 via $oif
ipfw add 100 allow tcp from any to 192.168.0.5 9999 via $iif
#------------------------------------------
ipfw nat 2 config if $oif log redirect_port tcp 192.168.0.5:9990 9990
ipfw add 100 nat 2 tcp from any to $oip 9990 via $oif
ipfw add 100 allow tcp from any to 192.168.0.5 9990 via $iif

#------------------------------------------
ipfw nat 3 config if $oif log redirect_port tcp 192.168.0.5:80 80
ipfw add 100 nat 3 tcp from any to $oip 80 via $oif
ipfw add 100 allow tcp from any to 192.168.0.5 80 via $iif

#------------------------------------------
ipfw nat 4 config if $oif log redirect_port tcp 192.168.0.6:7777 7777
ipfw add 200 nat 4 tcp from any to $oip 7777 via $oif
ipfw add 200 allow tcp from any to 192.168.0.6 7777 via $iif

#------------------------------------------
ipfw nat 5 config if $oif log redirect_port tcp 192.168.0.6:7770 7770
ipfw add 200 nat 5 tcp from any to $oip 7770 via $oif
ipfw add 200 allow tcp from any to 192.168.0.6 7770 via $iif

#------------------------------------------
ipfw nat 6 config if $oif log redirect_port tcp 192.168.0.6:7779 7779
ipfw add 200 nat 6 tcp from any to $oip 7779 via $oif
ipfw add 200 allow tcp from any to 192.168.0.6 7779 via $iif

#---------------NAT--------------------------------------
ipfw nat 10 config if $oif
ipfw add 300 nat 10 ip4 from any to any via $oif

#---------------Old config-------------------------------
#Запрет к 255.0.0.0 подсети
ipfw add 400 deny all from any to 127.0.0.0/8
ipfw add 400 deny all from 127.0.0.0/8 to any

#Запрет на наружнем интерфейсе внтреней сети
ipfw add 450 deny all from 192.168.0.0/24 to any via $oif

#Допуск определенных ping'ов
ipfw add 500 allow icmp from any to any in via $oif icmptypes 0,3,8,11
ipfw add 500 allow icmp from any to any out via $oif
ipfw add 500 allow icmp from any to any via $iif

#Запрет сетей
ipfw add 600 deny all from any to 0.0.0.0/8 via $oif
ipfw add 600 deny all from any to 169.254.0.0/16 via $oif
ipfw add 600 deny all from any to 224.0.0.0/4 via $oif
ipfw add 600 deny all from any to 240.0.0.0/4 via $oif

ipfw add 600 deny all from 0.0.0.0/8 to any via $oif
ipfw add 600 deny all from 169.254.0.0/16 to any via $oif
ipfw add 600 deny all from 224.0.0.0/4 to any via $oif
ipfw add 600 deny all from 240.0.0.0/4 to any via $oif

#Разрешения для локалки
ipfw add 700 allow tcp from 192.168.0.0/24 to any via $iif

#Разрешаю ssh
ipfw add 800 allow tcp from any to any 22 via $iif

#Разрошение на соединение, не прерывать соединение и получение фрагментир покетов
ipfw add 900 allow all from $oip to any out via $oif setup
ipfw add 910 allow tcp from any to any established
ipfw add 920 allow tcp from any to any frag

#Разрешение DNS
ipfw add 1000 allow udp from $dns1 53 to $oip in via $oif
ipfw add 1000 allow udp from $oip to $dns1 53 keep-state

#Запрет NETBIOS
ipfw add 1100 deny udp from any to any 137,138 via $oif
ipfw add 1100 deny tcp from any to any 135,139 via $oif

#DHCP
#ipfw add 1200 allow udp from any to 192.168.0.1 67 via $iif keep-state

#ssh,smtp,pop,http
ipfw add 1300 allow tcp from any to $oip 22,25,110,80 via $oif setup

#Сброс опознавания
ipfw add 1400 reset tcp from any to $oip 113 via $oif
# FTP
ipfw add 1500 allow tcp from me 21,50000-50100 to any
ipfw add 1500 allow tcp from any to me 21,50000-50100

-------------------------------------------------------------------------------------------------

http://www.user.su/Ядерный_NAT_во_FreeBSD

Обновлено: 12.03.2015