Данная статья рассчитана большей частью на новичков во FreeBSD. Написать её решил т к не нашел подходящего решения для следующей ситуации:
Имеется роутер FreeBSD, на внешнем интерфейсе ISP выделяет несколько ip сетей, принадлежащих разным клиентам во внутренней сети.
Хотелось бы посоветовать в альтернативу natd использовать ipnat, т к он работает в пространстве ядра, что существенно на слабых машинах (<= PII) с большим количеством клиентов (>=100). Кроме того, ipnat более функционален, на мой взгляд, т к natd - это более ранняя реализация NAT во FreeBSD.
Теперь о трансляции адресов: при наличии на внешнем интерфейсе нескольких публичных IP адресов, рекомендую использовать следующую конфигурацию:
/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