Nat во FreeBSD (пример)

Пример 1

rc.conf


firewall_enable="YES"
firewall_script="/etc/rules"
firewall_logging="YES"
natd_enable="YES"
natd_interface="rl0";

/etc/rules

#!/bin/sh
# при работе по SSH, чтобы перечитать конфиг набирать nohup sh /etc/rules

# Прежде, чем мы начнем, сбросим список
ipfw -q -f flush

# Установим префикс команды для набора правил
cmd="ipfw -q add"
skip="skipto 400"
wanip="111.111.111.111" # внешний IP
lannet="192.168.0.0/24" # внутренняя сеть
eif="rl0" # внешний интерфейс

# Нет запретов внутри интерфейса смотрящего в локальную сеть
$cmd 010 allow all from any to any via re0

# Нет ограничений на Loopback интерфейсе
$cmd 020 allow all from any to any via lo0

# Рубим попытки lo0 куда-то лезть и откуда-то лезть на lo0
$cmd 030 deny ip from any to 127.0.0.0/8
$cmd 040 deny ip from 127.0.0.0/8 to any

# отправляем всех на прозрачный squid
$cmd 050 fwd 127.0.0.1,3129 tcp from $lannet to any 21,80,443,5190 out via $eif

# Входящий NAT
$cmd 060 divert natd ip from any to any in via $eif

# Позволяем пакету проходить, если предыдущий был добавлен в
# "динамическую" таблицу правил с разрешением состояния keep-state
$cmd 070 check-state

############## Outgoing ################

# Исходящий PING
$cmd 100 $skip icmp from any to any keep-state

# Исходящий NTP
$cmd 105 $skip udp from any to any 123 out via $eif keep-state

# Разрешаем DNS
$cmd 110 $skip udp from any to any 53 out via $eif keep-state
$cmd 111 $skip tcp from any to any 53 out via $eif setup keep-state

# Выпускаем пользователей в обход сквида
$cmd 140 $skip all from $lannet to any 4899 out via $eif setup keep-state
$cmd 150 $skip all from $lannet to any 3389 out via $eif setup keep-state
$cmd 160 $skip all from $lannet to any 25 out via $eif setup keep-state
$cmd 170 $skip all from $lannet to any 110 out via $eif setup keep-state

# Разрешаем полный выход с сервака
$cmd 190 $skip all from $wanip to any out via $eif setup keep-state

############# Incoming ################

# Запрещаем весь входящий трафик из зарезервированных адресных пространств
$cmd 200 deny all from 192.168.0.0/16 to any in via $eif #RFC 1918 private IP
$cmd 201 deny all from 172.16.0.0/12 to any in via $eif #RFC 1918 private IP
$cmd 202 deny all from 10.0.0.0/8 to any in via $eif #RFC 1918 private IP
$cmd 203 deny all from 127.0.0.0/8 to any in via $eif #loopback
$cmd 204 deny all from 0.0.0.0/8 to any in via $eif #loopback
$cmd 205 deny all from 169.254.0.0/16 to any in via $eif #DHCP auto-config
$cmd 206 deny all from 192.0.2.0/24 to any in via $eif #reserved for docs
$cmd 207 deny all from 204.152.64.0/23 to any in via $eif #Sun cluster
$cmd 208 deny all from 224.0.0.0/3 to any in via $eif #Class D & E multicast

# Запрещаем ident
$cmd 215 deny tcp from any to any 113 in via $eif

# Запрещаем весь сервис Netbios. 137=имя, 138=дейтаграмма, 139=сессия
$cmd 220 deny tcp from any to any 137 in via $eif
$cmd 221 deny tcp from any to any 138 in via $eif
$cmd 222 deny tcp from any to any 139 in via $eif
$cmd 223 deny tcp from any to any 81 in via $eif

# Входящий пинг, несколько типов
$cmd 300 allow icmp from any to $wanip in via $eif icmptypes 0,8,11 limit src-addr 2

# Разрешаем входящую www функцию, если есть вэб сервер
$cmd 310 allow tcp from any to $wanip 80 in via $eif setup limit src-addr 2

# Разрешаем входящие безопасные SSH, номер порта лучше сменить
$cmd 320 allow tcp from any to $wanip 22 in via $eif setup limit src-addr 2

# Разрешаем входящую почту SMTP, если есть почтовый сервер
$cmd 330 allow tcp from any to $wanip 25 in via $eif setup limit src-addr 2

# Разрешаем входящую почту POP3, если есть почтовый сервер
$cmd 340 allow tcp from any to $wanip 110 in via $eif setup limit src-addr 2

# Разрешаем RAdmin, номер порта лучше сменить
$cmd 350 allow tcp from any to $wanip 4899 in via $eif setup limit src-addr 2

# Разрешаем уже установленные соединения
$cmd 360 allow all from any to any established

########### Final ###############

# рубим все, что не ушло в скип
$cmd 399 deny log all from any to any

# Исходящий NAT
$cmd 400 divert natd ip from any to any out via $eif

# Выпускаем пакеты из скипа
$cmd 410 allow all from any to any

# Режем все лишнее с занесением в лог
$cmd 999 deny log all from any to any

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

Пример 2 (FreeBSD-6.2)

rc.conf

gateway_enable="YES"
firewall_enable="YES"
firewall_type="/etc/rc.fwrules"
firewall_loggin="YES"

natd_enable="YES"
natd_interface="rl0"
natd_flags="-f /etc/natd.conf"

natd.conf

#interface rl0
same_ports
#unregistered_only
redirect_port tcp 192.168.100.208:20-21 20-21 # FTP на ftp
redirect_port tcp 192.168.100.10:110 110 # POP3 (для филиалов)
redirect_port tcp 192.168.100.202:443 443 # Система заказов и планирования
redirect_port tcp 192.168.100.207:5222 5222 # Jabber-сервер
redirect_port tcp 192.168.100.207:5269 5269 # Jabber-сервер
redirect_port tcp 192.168.100.59:60463 60463 # Блин, дома засада пока по торренту
redirect_port tcp 192.168.100.202:9080 9080
redirect_port tcp 192.168.100.202:9090 9090
#redirect_port tcp 192.168.100.50:4899 4899 # Radmin
redirect_port tcp 192.168.20.210:80 8075 # Video server
redirect_port tcp 192.168.20.210:2536 2536 # Video server
redirect_port tcp 192.168.20.210:2527 2537 # Video server
redirect_port tcp 192.168.15.11:4899 4899 # BUH

rc.fwrules

add 10 divert natd ip from 192.168.100.59 to not 192.168.0.0/16 143,1024-65535 out xmit rl0
add 20 divert natd gre from 192.168.100.59 to not 192.168.0.0/16 out xmit rl0

add 30 divert natd gre from 192.168.100.59 to not 192.168.0.0/16 out xmit rl0

add 40 divert natd ip from 192.168.100.24 to not 192.168.0.0/16 out xmit rl0 # Sys
add 50 divert natd ip from 192.168.100.13 to not 192.168.0.0/16 out xmit rl0 # Dr

add 60 divert natd ip from 192.168.100.39 to not 192.168.0.0/16 out xmit rl0 # B

add 70 divert natd ip from 192.168.100.244 to not 192.168.0.0/16 out xmit rl0 # Test
add 71 divert natd ip from 192.168.100.245 to not 192.168.0.0/16 out xmit rl0 # New_Fire
add 80 divert natd ip from 192.168.100.204 5222,5269,5190 to not 192.168.0.0/16 out xmit rl0 # Jabber
add 90 divert natd ip from 192.168.20.210 to 91.202.70.228,95.79.94.11,91.151.245.18 out xmit rl0 # Video

add 91 divert natd ip from 192.168.100.50 4899 to any out xmit rl0 # Radmin

add 92 deny log all from not 192.168.0.0/16 to Wan_Ip 137-139 in recv rl0 # закрываем самбу извне

add 95 divert natd ip from 192.168.15.0/24 to not 192.168.0.0/16 out xmit rl0
add 95 divert natd ip from 192.168.15.11 4899 to any out xmit rl0

add 96 divert natd ip from 192.168.25.0/24 to not 192.168.0.0/16 out xmit rl0

add 99 divert natd ip from not 192.168.0.0/16 to Wan_Ip in recv rl0

add 100 allow all from any to any

Кстати не забываем пересобрать ядрышко

options IPDIVERT
options IPFIREWALL
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMIT=100
options IPFIREWALL_FORWARD
options DUMMYNET
options HZ=1000

cd /usr/src

make kernel KERNCONF=mykernel

на этом все !

Обновлено: 12.03.2015