Разработка электроники,

Систем автоматики,

Программного обеспечения

8(981)186-50-82

ООО "Антех ПСБ",
Санкт-Петербург

anteh@bk.ru

antehru@gmail.com

©

FreeBSD 8.x, 9.x, 10.x, XX.x ядерный IPFW NAT установка настройка для 2х и 4х сетевых интерфейсов

Сайт https://anteh.ru


Amd64x2, 4 сетевых интерфейса
Nfe0 -На материнской плате Attansic 10/100/1000 Mb Gigabit
Re0 - PCI DGE-528T
Re1 - PCI Express x1 TG-3468
Re2 - PCI Express x1 TG-3468
Re1 смотрит во внешнюю сеть. На Re2 Web сервер. По Nfe0 только SSH для маршрутизатора и сервера. Re0 смотрит во внутреннюю сеть.

Следующие пару статей немного проливают свет на суть вопроса:
Подробное руководство по ipfw nat. Автор: terminus. Версия статьи 1_3_6 ссылка: ttp://www.lissyara.su/articles/freebsd/tuning/ipfw_nat/

ipfw: порядок прохождения пакетов, сложные случаи. Vadim Goncharov (nuclight) ссылка: http://nuclight.livejournal.com/124348.html

Ядерный NAT. koder_4 ссылка: http://koder-4.livejournal.com/7024.html

Статьи проливают свет на: in/out, recv/xmit, one_pass, check-state, keep-state.

В третьей статье пример помог разобраться с настройкой NAT, если сетевых интерфейсов более 2. Помогло после того, как получился стандартный nat с двумя сетевыми картами.

Для ядерного блокирующего IPFW NAT нужно пересобрать ядро с новыми параметрами:

ident MYKER
options IPFIREWALL
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMIT=50
options IPFIREWALL_NAT
options LIBALIAS
options IPFIREWALL_FORWARD

Производим компиляцию и установку ядра:

# cd /usr/src
# make -j4 -s buildkernel KERNCONF=<ИМЯ ЯДРА>
Ждём около часа
# make -s installkernel KERNCONF=<ИМЯ ЯДРА>
# shutdown -r now

По дате проверяем установку нового ядра

# uname -a

Если в системе 2 сетевых интерфейса, то проблем не будет. Какой именно сетевой адаптер будет смотреть в сеть выбирается здесь:

ipfw nat 1 config log if re1 reset same_ports deny_in

Если re1 смотрит в сеть, значит оставшийся второй и единственный адаптер будет для локальной сети. А вот если у вас более 2х сетевых адаптеров и вы примените подобную настройку, то произвольно можно будет выбрать только адаптер смотрящий во внешнюю сеть. Адаптер смотрящий в локальную сеть будет выбран по умолчанию и он будет первым, свободным по порядку установки в слоты расширения pci, pci-express. Вывод сделан на основании эксперимента. Опции или ключа, для произвольного выбора адаптера смотрящего в локальную сеть не нашёл.

В /etc/rc.conf добавляем:
gateway_enable="YES"
firewall_enable="YES"
firewall_script="/etc/firewall.conf"
firewall_nat_enable="YES"

Конфигурация с 2 сетевыми адаптерами:

#!/bin/sh -
/sbin/ipfw -q -f flush
/sbin/ipfw -q -f pipe flush
/sbin/ipfw -q -f queue flush
fwadd="/sbin/ipfw -q add"
# re0 внутренняя сеть
# re1 интерфейс смотрящий в сеть Internet

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

${fwadd} 00100 allow ip from any to any via lo0
${fwadd} 00200 deny ip from any to 127.0.0.0/8
${fwadd} 00300 deny ip from 127.0.0.0/8 to any
#Разрешаем всё через локальную сеть
${fwadd} 40000 allow ip from any to any via re0
ipfw nat 1 config ip <IP интерфейса Internet сети> reset same_ports deny_in
#Правило по которому осуществляется NAT преобразование
${fwadd} 50100 nat 1 ip from any to any via re1

Конфигурация с 2 сетевыми адаптерами ещё один вариант:

#!/bin/sh

/sbin/ipfw -q -f flush
/sbin/ipfw -q -f pipe flush
/sbin/ipfw -q -f queue flush

fwadd="/sbin/ipfw -q add"

ext="re0"        #Ext internet mask
loc="re1"        #Local net

#IP сетевого интерфейса, подключённого к внешней сети
ip_ext="65.88.99.44"

#Сеть внутренняя
ip_loc="172.31.0.1/24"
#IP например сервера, подключенного к внутренней сети, делаем редирект 80 порта
rm_loc="172.31.0.2"

/sbin/sysctl net.inet.ip.fw.one_pass=1
/sbin/sysctl net.inet.tcp.blackhole=2
/sbin/sysctl net.inet.udp.blackhole=1
/sbin/sysctl net.inet.icmp.drop_redirect=1
/sbin/sysctl net.inet.icmp.log_redirect=0
/sbin/sysctl net.inet.ip.redirect=0

${fwadd} 00700 allow ip from any to any via lo0
${fwadd} 00701 deny ip from any to 127.0.0.0/8
${fwadd} 00702 deny ip from 127.0.0.0/8 to any

#ICMP разрешаются только необходимые
${fwadd} 00910 deny log icmp from any to any frag
${fwadd} 00911 allow icmp from any to ${ip_ext} in icmptype 3 via ${ext}
${fwadd} 00912 allow icmp from any to ${ip_ext} in icmptype 8 via ${ext}
${fwadd} 00913 allow icmp from any to ${ip_ext} in icmptype 12 via ${ext}
${fwadd} 00914 allow icmp from ${ip_ext} to any out icmptype 0 via ${ext}
${fwadd} 00915 allow icmp from ${ip_ext} to any out icmptype 3 via ${ext}
${fwadd} 00916 allow icmp from ${ip_ext} to any out icmptype 4 via ${ext}
${fwadd} 00917 allow icmp from ${ip_ext} to any out icmptype 11 via ${ext}
${fwadd} 00918 allow icmp from ${ip_ext} to any out icmptype 12 via ${ext}
${fwadd} 00919 deny icmp from any to any in icmptype 0,3,4,5,8,9,10,11,12,13,14,15,16,17,18 via ${ext}
${fwadd} 00920 deny icmp from any to any out icmptype 0,3,4,5,8,9,10,11,12,13,14,15,16,17,18 via ${ext}

#Доступ текущего компьютера к сети
#${fwadd} 50500 pass all from ${ip_ext} to any keep-state

ipfw nat 1 config ip ${ip_ext} reset same_ports deny_in \
redirect_port tcp ${rm_loc}:80 80 \
redirect_port tcp 192.168.0.15:22 54378 #\
${fwadd} 50600 allow tcp from ${ip_loc} to any in recv ${loc}
${fwadd} 50610 allow udp from ${ip_loc} to any in recv ${loc}
${fwadd} 50620 nat 1 tcp from ${ip_loc} to any out xmit ${ext}
${fwadd} 50630 nat 1 udp from ${ip_loc} to any out xmit ${ext}
${fwadd} 50640 nat 1 tcp from any to ${ip_ext} in recv ${ext}
${fwadd} 50650 nat 1 udp from any to ${ip_ext} in recv ${ext}
${fwadd} 50660 allow tcp from any to ${ip_loc} out xmit ${loc}
${fwadd} 50670 allow udp from any to ${ip_loc} out xmit ${loc}

Конфигурация, когда сетевых адаптеров больше 2х, например 4:

#!/bin/sh
/sbin/ipfw -q -f flush
/sbin/ipfw -q -f pipe flush
/sbin/ipfw -q -f queue flush
fwadd="/sbin/ipfw -q add"

loc2="nfe0" #Local net 2
loc1="re0" #Local net 1
ext="re1" #Ext net internet
srv="re2" #Local net 3 for Server
ip_ext="100.18.60.129"
ip_srv="192.168.3.1"
ip_loc1="192.168.7.1"
ip_loc2="192.168.5.1"

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

${fwadd} 00100 allow ip from any to any via lo0
${fwadd} 00200 deny ip from any to 127.0.0.0/8
${fwadd} 00300 deny ip from 127.0.0.0/8 to any

#Ниже рабочий кусок конфига, ошибок быть не должно, лишнее не убирал, ip вымышленные

ipfw nat 1 config ip ${ip_ext} reset same_ports deny_in \
redirect_port tcp 192.168.3.2:80 80 #перенаправление всего, что приходит извне на 192.168.3.1:80 роутера на 192.168.3.2:80 сервера

${fwadd} 50590 allow ip from ${ip_srv} to any in recv ${srv} #KNAT 80 from local to ipfw 
${fwadd} 50600 nat 1 ip from ${ip_srv} to any out xmit ${ext} #KNAT 80 nat translation local->external
#${fwadd} 50700 allow ip from ${ip_ext} to any out xmit ${ext} #No need if one_pass = 1
${fwadd} 50800 nat 1 ip from any to ${ip_ext} in recv ${ext} #KNAT translation external->local
#${fwadd} 50900 allow ip from any to ${ip_srv} in recv ${ext} #No need if one_pass = 1
${fwadd} 51000 allow ip from any to ${ip_srv} out xmit ${srv} #KNAT 80 from ipfw to local

#Local 2 interfase
${fwadd} 51100 allow ip from ${ip_loc2} to any in recv ${loc2} #from local to ipfw
${fwadd} 51200 nat 1 ip from ${ip_loc2} to any out xmit ${ext} #nat translation local->external
#${fwadd} 51300 allow ip from ${ip_ext} to any out xmit ${ext} #No need if one_pass = 1
#${fwadd} 51400 nat 1 ip from any to ${ip_ext} in recv ${ext} #This rule is present up
#${fwadd} 51500 allow ip from any to ${ip_loc2} in recv ${ext} #No need if one_pass = 1
${fwadd} 51600 allow ip from any to ${ip_loc2} out xmit ${loc2} #from ipfw to local

#Local 1 First from floor PCI interfase for local net description
${fwadd} 51700 allow ip from ${ip_loc1} to any in recv ${loc1} #from local to ipfw
${fwadd} 51800 nat 1 ip from ${ip_loc1} to any out xmit ${ext} #nat translation local->external
#${fwadd} 51900 allow ip from ${ip_ext} to any out xmit ${ext} #No need if one_pass = 1
#${fwadd} 52000 nat 1 ip from any to ${ip_ext} in recv ${ext} #This rule is present up
#${fwadd} 52100 allow ip from any to ${ip_loc1} in recv ${ext} #No need if one_pass = 1
#${fwadd} 52100 allow ip from any to ${ip_loc1} 8892 out xmit ${loc1} #from ipfw to local
${fwadd} 52200 allow ip from any to ${ip_loc1} out xmit ${loc1} #from ipfw to local

Copyright ©Новиков Алексей Александрович,

2012-2017 Санкт-Петербург, 197372, ООО "Антех ПСБ",

anteh собака bk.ru