divert/natd
Демон natd является процессом, то есть он работает не в пространстве ядра,
а в пространстве пользователя. Поэтому, для обработки демоном трафик должен
копироваться из ядра в пространство пользователя и обратно
Это несколько уменьшает производительность.
По умолчанию в статье я использую закрытый фаирвол:
------------------------------------------------------------------
options IPFIREWALL_DEFAULT_TO_ACCEPT ; allow ip from any to any
------------------------------------------------------------------
чтобы это дело заработало нужно:
1. либо в ядров вкомпилить: options IPWIREWALL
options IPDIVERT
2. либо подгрузить динамически модули ipfw.ko и ipdivert.ko
Далее:
1. в /etc/rc.conf должно быть: gateway_enable=YES
2. или: sysctl net.inet.ip.forwarding=1
По умолчанию natd использует порт 8668, который можно переназначить.
Можно посмотреть в /etc/services
Дальше настройки демона natd:
sh# ee /etc/natd.conf
--------------------------
use_sockets yes
same_ports yes
unregistered_only yes
interface fxp0
--------------------------
Запуск демона
sh# natd -f /etc/natd.conf
хотя конфигурационный файл можно и не создавать и указать
всё в одной строке запуска, приблизительно так:
sh# natd -s -m -u -n fxp0
И в ipfw разрешаем хождение пакетов таким образом:
-------------------------------------------------------------------
#!/bin/sh
#fxp0 - интерфейс на котором крутится NAT (наш внешний интерфейс)
#xl0 - внутренний интерфейс
#192.168.1.0/24 - локалка
#81.22.6.77 - внешний ip (здесь вымышленный)
ipfw -f flush
#Общий счётчик на ip
ipfw add count ip from any to any
ipfw add pass icmp from any to any
#NAT (1 - Всё Одмину и всей подсетке - асько!)
ipfw add divert natd ip from 192.168.1.13 to any out via fxp0
ipfw add divert natd ip from 192.168.1.0/24 5190 to any out via fxp0
#Возврат пакетов NAT
ipfw add divert natd ip from any to 81.22.6.77 in via fxp0
#отправляем "out via fxp0", возвращаем "in via fxp0"
#Дальше остальные правила:
ipfw add pass udp from any to any 53,123 keep-state
ipfw add pass tcp from any to any 25,110,80,443 keep-state
#прочие правила...
-------------------------------------------------------------------
И самое главное диверты прописываются вначле фаирвола.
Иначе до правил NAT'a может дело не дойти...