FreeBSD: настройка NAT с помощью ipnat

ipnat - утилита, реализующая подсистему NAT.
Чтобы включить NAT, в /etc/rc.conf нужно добавить:
ipnat_enable="YES" # включить NAT
gateway_enable="YES" # включить пересылку кадров между интерфейсами
После этого перегружаемся.
Конфигурация ipnat хранится по умолчанию в файле /etc/ipnat.rules (уже задано в /etc/defaults/rc.conf). Файла /etc/ipnat.rules пока нет, его надо создать. Пример файла (комментарий также можно вставлять в строке, начинающейся на #) для Корбины:
map ng0 192.168.0.0/24 -> 0.0.0.0/32 proxy port ftp ftp/tcp
map ng0 from 192.168.0.0/24 to any -> 0.0.0.0/32

map fxp0 192.168.0.0/24 -> 0.0.0.0/32 proxy port ftp ftp/tcp
map fxp0 from 192.168.0.0/24 to any -> 0.0.0.0/32

rdr ng0 89.178.130.45/32 port 6112 -> 192.168.0.1 port 6112 udp
rdr ng0 89.178.130.45/32 port 22 -> 192.168.0.1 port 22 tcp

rdr ng0 89.178.130.45/32 port 20 -> 192.168.0.1 port 20 tcp
rdr ng0 89.178.130.45/32 port 21 -> 192.168.0.1 port 21 tcp

rdr ng0 89.178.130.45/32 port 50000 -> 192.168.0.1 port 50000 tcp
rdr ng0 89.178.130.45/32 port 50001 -> 192.168.0.1 port 50001 tcp
rdr ng0 89.178.130.45/32 port 50002 -> 192.168.0.1 port 50002 tcp
rdr ng0 89.178.130.45/32 port 50003 -> 192.168.0.1 port 50003 tcp
rdr ng0 89.178.130.45/32 port 50004 -> 192.168.0.1 port 50004 tcp
rdr ng0 89.178.130.45/32 port 50005 -> 192.168.0.1 port 50005 tcp
rdr ng0 89.178.130.45/32 port 50006 -> 192.168.0.1 port 50006 tcp
rdr ng0 89.178.130.45/32 port 50007 -> 192.168.0.1 port 50007 tcp
rdr ng0 89.178.130.45/32 port 50008 -> 192.168.0.1 port 50008 tcp
rdr ng0 89.178.130.45/32 port 50009 -> 192.168.0.1 port 50009 tcp
rdr ng0 89.178.130.45/32 port 50010 -> 192.168.0.1 port 50010 tcp

Примечания.

192.168.0.1 - этот компьютер получает основной доступ через NAT - на нем можно играть в StarCraft. Кроме того, на этом компьютере работает сервер ftp и сервер SSH. Оба эти сервера опубликованы в Интернете через ipnat.

89.178.130.45 - такой адрес выдан на виртуальном интерфейсе ng0 после успешного VPN-ppp соединения с Корбиной (постарался демон mpd).

fxp0 - сетевой интерфейс, который подключен к Корбине, по DHCP ему выдан адрес a.b.103.223. Какой тут IP адрес - не имеет значения, ipnat к нему не привязан (в /etc/ipnat.rules этот IP не фигурирует)
ng0 - внешний виртуальный интерфейс, создаваемый демоном mpd через pptp соединение поверх fxp0. IP также выдается автоматически на этом интерфейсе по протоколу ppp.

Эти 2 правила включают NAT для доступа в Интернет. Первое правило обеспечивает корректную работу клиентов ftp из внутренней сети (192.168.0.024) через NAT. Второе - доступ тем же клиентам ко всем портам и IP адресам Интернета через NAT.

Эти 2 правила включают NAT для доступа к локальным ресурсам Корбины. Первое правило обеспечивает корректную работу клиентов ftp из внутренней сети (192.168.0.024) через NAT (по ftp работают многие локальные ресурсы Корбины, например ftp.corbina.ru, а также megafilms.ru он же homefilms.ru). Второе - доступ тем же клиентам ко всем портам и IP адресам локальной сети Корбины через NAT. Без NAT-а доступ ко всем локальным ресурсам Корбины будет закрыт!


Первое из этих 2 правил публикует порт 6112 udp от компьютера 192.168.0.1 в Интернете под публичным адресом 89.178.130.45. Правило обеспечивает игру в StarCraft на компьютере 192.168.0.1. Второе правило публикует сервер ssh, который работает тоже на компьютере 192.168.0.1.

Эти два правила публикуют сервер ftp на компьютере 192.168.0.1. Первое правило публикует порт данных для активного режима (20), второе - порт канала управления (21).

Эти 11 правил публикуют 11 портов ftp-сервера 192.168.0.1 для его работы в пассивном режиме. Этот диапазон портов должен быть прописан также на ftp сервере специальной настройкой.
Пример правил для Акадо:
map fxp0 192.168.0.0/24 -> 0.0.0.0/32 proxy port ftp ftp/tcp
map fxp0 from 192.168.0.0/24 to any -> 0.0.0.0/32
rdr fxp0 83.167.123.75/32 port 6112 -> 192.168.0.1 port 6112 udp
rdr fxp0 83.167.123.75/32 port 22 -> 192.168.0.1 port 22 tcp
rdr fxp0 83.167.123.75/32 port 20 -> 192.168.0.1 port 20 tcp
rdr fxp0 83.167.123.75/32 port 21 -> 192.168.0.1 port 21 tcp
rdr fxp0 83.167.123.75/32 port 50000 -> 192.168.0.1 port 50000 tcp
rdr fxp0 83.167.123.75/32 port 50001 -> 192.168.0.1 port 50001 tcp
rdr fxp0 83.167.123.75/32 port 50002 -> 192.168.0.1 port 50002 tcp
rdr fxp0 83.167.123.75/32 port 50003 -> 192.168.0.1 port 50003 tcp
rdr fxp0 83.167.123.75/32 port 50004 -> 192.168.0.1 port 50004 tcp
rdr fxp0 83.167.123.75/32 port 50005 -> 192.168.0.1 port 50005 tcp
rdr fxp0 83.167.123.75/32 port 50006 -> 192.168.0.1 port 50006 tcp
rdr fxp0 83.167.123.75/32 port 50007 -> 192.168.0.1 port 50007 tcp
rdr fxp0 83.167.123.75/32 port 50008 -> 192.168.0.1 port 50008 tcp
rdr fxp0 83.167.123.75/32 port 50009 -> 192.168.0.1 port 50009 tcp
rdr fxp0 83.167.123.75/32 port 50010 -> 192.168.0.1 port 50010 tcp

Тут все то же самое, за исключением отсутствия виртуального интерфейса ng0 - теперь внешний интерфейс не ng0, а fxp0, и "локальных" ресурсов, как были у Корбины, нет.

Эта команда применяет правила /etc/ipnat.rules без перезагрузки:
# ipnat -CF -f /etc/ipnat.rules
Документация:
# man ipnat
/usr/share/examples/ipfilter/BASIC.NAT
/usr/share/examples/ipfilter/nat-setup

Вот еще правила для публикации сервера VPN, работающего на Windows XP

rdr ng0 83.167.123.75/32 port 1701 -> 192.168.0.1 port 1701 udp
rdr ng0 83.167.123.75/32 port 1723 -> 192.168.0.1 port 1723 tcp
rdr ng0 83.167.123.75/32 port 47 -> 192.168.0.1 port 47 gre
rdr ng0 83.167.123.75/32 port 50 -> 192.168.0.1 port 50 esp

Обратите внимание на 2 последних правила - они публикуют конкретные номера протоколов IP (47 и 50), а не TCP или UDP порты.

Обновлено: 12.03.2015