Настраиваем IPFW - NAT на FreeBSD 9.1

И так имеем входящие подключение на одном сетевом интерфейсе и локальную сеть на другом. Необходимо что бы на самом сервере была возможность открывать порты, перенаправление портов на компьютеры локальной сети. Ну и естественно что бы все это работало с минимальной нагрузкой и отличной скоростью.
Для этого нам понадобиться ipfw который будет заниматься правовой политикой и NAT который будет заниматься перенаправление и маршрутизацией. NAT будет ядровой, то есть в составе ядра.
Такая архитектура будет как на картинке, сложнее уже не нужно.


Собираем ядро с необходимыми параметрами для работы ipfw-nat
options		IPFIREWALL				# Включаем ipfw
options		IPFIREWALL_VERBOSE			# Включаем логи ipfw
options		IPFIREWALL_VERBOSE_LIMIT=5	# Ограничение логи ipfw
options		IPFIREWALL_NAT				# Включаем ipfw NAT
options		LIBALIAS					# Включаем библиотеки
options		HZ="1000"					# ускорение работы гигабитного сетевого адаптера

Как собрать ядро читаем тут: notanony.ru/post/8/

Когда собрали ядро добавим в загрузку (/etc/rc.conf) ipfw и настроим сетевые интерфейсы
Все параметры показаны как пример, указывать свои параметры.
# Настройки сетевой карты которая смотрит в интернет
ifconfig_re0="inet 169.254.1.1 netmask 255.255.255.0"
# Настройка сетевой карты которая смотрит в локальную сеть
ifconfig_re1="inet 192.168.0.1 netmask 255.255.255.0"
# Шлюз по умолчанию для интеренета
defaultrouter="169.254.1.254"
# Включаем поддержку работы сервера в качестве шлюза
gateway_enable="YES"
# Включаем ipfw
firewall_enable="YES"
# Указываем файл конфигурации для ipfw
firewall_script="/usr/local/etc/ipfw_config"


Укажем настройки DNS серверов в файле /etc/resolv.conf Можно указать какой то из публичных серверов.
nameserver 169.254.1.50
nameserver 169.254.1.55


Переходим к настройки ipfw, редактируем файл конфигурации которые указали в переменной firewall_script, у меня это /usr/local/etc/ipfw_config

# Переменная для пути запуска ipfw.
fwcmd="/sbin/ipfw"
# Переменная для внешнего сетевого адаптера (Интернет).
internet="re0"
# Переменная для внутреннего сетевого адаптера (Локальная сеть).
local="re1"
# IP адрес сетевого интерфейса смотрящего в интернет.
ipinet="169.254.1.1"
# IP адрес сетевого интерфейса смотрящего в локальную сеть.
iplocal="192.168.0.1"
# IP группа для компьютеров локальной сети.
netlocal="192.168.0.0/24"

${fwcmd} -f flush
# Разрешаем весь трафик внутри локального сетевого интерфейса.
${fwcmd} add allow ip from any to any via lo0
# Запрещаем трафик из вне на локальный интерфейс и обратно.
${fwcmd} add deny ip from any to 127.0.0.0/8
${fwcmd} add deny ip from 127.0.0.0/8 to any

# Разрешаем любой трафик внутри локальной сети
${fwcmd} add allow ip from ${netlocal} to any via ${local}
${fwcmd} add allow ip from any to ${netlocal} via ${local}

# Настраиваем nat и перенаправление портов.
# На нашем сервер открываем 80 порт TCP.
# Перенаправляем 9500 порт TCP на компьютер локальной сети с IP адресом 192.168.0.50.
${fwcmd} nat 1 config ip ${ipinet} reset same_ports deny_in redirect_port tcp ${ipinet}:80 80 redirect_port tcp 192.168.0.50: 9500 9500

# Разрешаем прохождение TCP, UDP, ICMP между локальной сетью и интернетом.
${fwcmd} add nat 1 tcp from any to any via ${internet}
${fwcmd} add nat 1 udp from any to any via ${internet}
${fwcmd} add nat 1 icmp from any to any icmptypes 0,8 via ${internet}


Добавляем в файл /etc/sysctl.conf строчку, хотя во FreeBSD 9.1 параметр one_pass уже по умолчанию равен 1.
net.inet.ip.fw.one_pass=1

Перезагружаемая, если все сделали правильно то должно заработать.
0.10
20.08.2013 15:03