Мультироутинг во FreeBSD, IPNAT + IPFW

Данная статья рассчитана большей частью на новичков во FreeBSD. Написать её решил т к не нашел подходящего решения для следующей ситуации:

Имеется роутер FreeBSD, на внешнем интерфейсе ISP выделяет несколько ip сетей, принадлежащих разным клиентам во внутренней сети.

Хотелось бы посоветовать в альтернативу natd использовать ipnat, т к он работает в пространстве ядра, что существенно на слабых машинах (<= PII) с большим количеством клиентов (>=100). Кроме того, ipnat более функционален, на мой взгляд, т к natd - это более ранняя реализация NAT во FreeBSD.

Теперь о трансляции адресов: при наличии на внешнем интерфейсе нескольких публичных IP адресов, рекомендую использовать следующую конфигурацию:

ЯДРО (дописываем в конфиг след строки):

[dm80@k /usr/src/sys/i386/conf]$ tail -n 15 K

# firewall

(обязательно)

options IPFIREWALL

options IPFIREWALL_FORWARD

(далее опционально)

options DUMMYNET # шейпер

options HZ=1000 # кол-во просматриваемых пакетов в очереди при шейпинге

предположим, мы имеем на внутреннем интерфейсе rl0 адрес 192.168.0.1/24

внешний - rl1

195.5.43.66/30

194.1.1.202/29

194.1.1.203/29

194.1.1.204/29

листинг /etc/rc.conf

gateway_enable="YES"

defaultrouter="195.5.43.65"

ifconfig_rl1="inet 195.5.43.66 netmask 255.255.255.252"

ifconfig_rl1_alias0="inet 194.1.1.202 netmask 255.255.255.248"

ifconfig_rl1_alias1="inet 194.1.1.203 netmask 255.255.255.248"

ifconfig_rl1_alias2="inet 194.1.1.204 netmask 255.255.255.248"

ifconfig_rl0="inet 192.168.0.1 netmask 255.255.255.0"

firewall_enable="YES"

firewall_script="/etc/ipfw/fw"

ipnat_enable="YES"

ipnat_rules="/etc/ipfw/ipnat"

листинг /etc/ipfw/fw

/sbin/ipfw add check-state # проверяем наличие динамических правил

/sbin/ipfw add pass all from any to any via lo0 # локальная петля

# следующие три правила перенаправляют пакеты на альтернативный шлюз для сети 194.1.1.200/29

/sbin/ipfw add fwd 194.1.1.201 all from 194.1.1.202 to not me

/sbin/ipfw add fwd 194.1.1.201 all from 194.1.1.203 to not me

/sbin/ipfw add fwd 194.1.1.201 all from 194.1.1.204 to not me

## собственно далее пишем свой набор правил, для примера разрешим всё и вся ;)

/sbin/ipfw add pass all from any to any

листинг /etc/ipfw/ipnat

тут подпишусь под каждой строчкой

# клиента 192.168.0.2 маскируем адресом 195.5.43.66, rl1 - внешний

# интерфейс

# разрешим использовать пассивный и активный режим ftp

map rl1 192.168.0.2/32 -> 195.5.43.66/32 proxy port ftp ftp/tcp

# динамическая нумерация портов исходящих пакетов

# (рекомендую для нескольких внутренних клиентов, чтобы

# избежать конфликтов)

map rl1 192.168.0.2/32 -> 195.5.43.66/32 portmap tcp/udp auto

# все прочее, что не попадает под действие вышеуказанных правил

map rl1 192.168.0.2/32 -> 195.5.43.66/32

# клиента 192.168.0.3 маскируем адресом 194.1.1.202

map rl0 192.168.0.3/24 -> 194.1.1.202/32 proxy port ftp ftp/tcp

map rl0 192.168.0.3/24 -> 194.1.1.202/32 portmap tcp/udp auto

map rl0 192.168.0.3/24 -> 194.1.1.202/32

# клиента 192.168.0.40 маскируем адресом 194.1.1.203

map rl0 192.168.0.40/24 -> 194.1.1.203/32 proxy port ftp ftp/tcp

map rl0 192.168.0.40/24 -> 194.1.1.203/32 portmap tcp/udp auto

map rl0 192.168.0.40/24 -> 194.1.1.203/32

# клиента 192.168.0.100 маскируем адресом 194.1.1.204

map rl0 192.168.0.100/24 -> 194.1.1.204/32 proxy port ftp ftp/tcp

map rl0 192.168.0.100/24 -> 194.1.1.204/32 portmap tcp/udp auto

map rl0 192.168.0.100/24 -> 194.1.1.204/32

PS: у меня данная конфигурация работает так же и с редиректом портов

# пример

rdr rl1 194.1.1.204/32 port 80 -> 192.168.0.100 port 80 tcp

Собственно, все. Мы получили готовый роутер с возможностью множественной маршрутизации в ядре, что позволеят его использовать даже на слабых машинах.

Обновлено: 12.03.2015