Текст предоставил Chern Lee.
Даемон преобразования сетевых адресов (Network Address Translation) во FreeBSD, широко
известный как natd(8), является
даемоном, который принимает входящие IP-пакеты, изменяет адрес отправителя на адрес
локальной машины и повторно отправляет эти пакеты в потоке исходящих пакетов. natd(8) делает это,
меняя IP-адрес отправителя и порт таким образом, что когда данные принимаются обратно, он
может определить расположение источника начальных данных и переслать их машине, которая
запрашивала данные изначально.
Чаще всего NAT используется для организации так называемого Совместного Использования
Интернет.
Из-за исчерпания пространства адресов в IPv4 и увеличения количества пользователей
высокоскоростных каналов связи, таких, как кабельное подключение или DSL, необходимость в
решении по Совместному Использованию Интернет растёт. Возможность подключить несколько
компьютеров через единственное соединение и IP-адрес делает natd(8) подходящим
решением.
Чаще всего у пользователя имеется машина, подключенная к кабельному каналу или каналу
DSL с одним IP-адресом и есть желание использовать этот единственный подключенный
компьютер для организации доступа в Интернет другим компьютерам в локальной сети.
Для этого машина FreeBSD, находящаяся в Интернет, должна выступать в роли шлюза. Эта
шлюзовая машина должна иметь два сетевых адаптера--один для подключения к маршрутизатору
Интернет, а другой для подключения к ЛВС. Все машины в локальной сети подключаются через
сетевой концентратор или коммутатор.
Рисунок
Подобная конфигурация часто используется для совместного использования доступа в
Интернет. Одна из подключенных к локальной сети машин подключается к Интернет. Остальные
машины работают с Интернет посредством этой ``шлюзовой'' машины.
В файле конфигурации ядра должны присутствовать следующие параметры:
options IPFIREWALL
options IPDIVERT
Дополнительно, если это нужно, можно добавить следующее:
options IPFIREWALL_DEFAULT_TO_ACCEPT
options IPFIREWALL_VERBOSE
В файле /etc/rc.conf должны быть такие строки:
gateway_enable="YES"
firewall_enable="YES"
firewall_type="OPEN"
natd_enable="YES"
natd_interface="fxp0"
natd_flags=""
- Указывает машине выступать в качестве шлюза. Выполнение команды sysctl net.inet.ip.forwarding=1 приведёт к тому же самому
результату.
- При загрузке включает использование правил межсетевого экрана из файла /etc/rc.firewall.
- Здесь задается предопределенный набор правил межсетевого экрана, который разрешает
все. Посмотрите файл /etc/rc.firewall для нахождения
дополнительных типов.
- Указывает, через какой интерфейс передавать пакеты (интерфейс, подключенный к
Интернет).
- Любые дополнительный параметры, передаваемые при запуске даемону natd(8).
При использовании вышеуказанных параметров в файле /etc/rc.conf при загрузке будет запущена команда natd -interface fxp0. Эту команду можно запустить и вручную.
Замечание: Если для передачи natd(8) набирается
слишком много параметров, возможно также использовать конфигурационный файл. В этом
случае имя настроечного файла должно быть задано добавлением следующей строки в /etc/rc.conf:
natd_flags="-f /etc/natd.conf"
Файл /etc/natd.conf будет содержать перечень
конфигурационных параметров, по одному в строке. К примеру, для примера из следующего
раздела будет использоваться такой файл:
redirect_port tcp 192.168.0.2:6667 6667
redirect_port tcp 192.168.0.3:80 80
Для получения более полной информации о конфигурационном файле прочтите страницу
справки по natd(8) относительно
параметра -f.
Каждой машине и интерфейсу в ЛВС должен быть назначен IP-адрес из адресного
пространства частных сетей, как это определено в RFC 1918, а в качестве
маршрутизатора по умолчанию должен быть задан IP-адрес машины с natd из внутренней сети.
Например, клиенты A и B в ЛВС имеют
IP-адреса 192.168.0.2 и 192.168.0.3, а
интерфейс машины с natd в локальной сети имеет IP-адрес 192.168.0.1. Маршрутизатором по умолчанию для клиентов A и B должна быть назначена машина с natd, то есть 192.168.0.1. Внешний, или
Интернет-интерфейс машины с natd не требует особых настроек
для работы natd(8).
Минусом использования natd(8) является то,
что машины в локальной сети недоступны из Интернет. Клиенты в ЛВС могут выполнять
исходящие соединения во внешний мир, но не могут обслуживать входящие. Это является
проблемой при запуске служб Интернет на клиентских машинах в локальной сети. Простым
решением является перенаправление некоторых портов Интернет машины с natd на клиента локальной сети.
Пусть, к примеру, сервер IRC запущен на клиенте A, а
веб-сервер работает на клиенте B. Чтобы это работало, соединения,
принимаемые на портах 6667 (IRC) и 80 (веб), должны перенаправляться на соответствующие
машины.
Программе natd(8) должна быть
передана команда -redirect_port с соответствующими параметрами.
Синтаксис следующий:
-redirect_port proto targetIP:targetPORT[-targetPORT]
[aliasIP:]aliasPORT[-aliasPORT]
[remoteIP[:remotePORT[-remotePORT]]]
В примере выше аргументы должен быть такими:
-redirect_port tcp 192.168.0.2:6667 6667
-redirect_port tcp 192.168.0.3:80 80
При этом будут перенаправлены соответствующие порты tcp на клиентские машины в локальной сети.
Аргумент -redirect_port может использоваться для указания
диапазонов портов, а не конкретного порта. Например, tcp
192.168.0.2:2000-3000 2000-3000 будет перенаправлять все соединения, принимаемые на
портах от 2000 до 3000, на порты от 2000 до 3000 клиента A.
Эти параметры можно указать при непосредственном запуске natd(8), поместить их
в параметр natd_flags="" файла /etc/rc.conf, либо передать через конфигурационный файл.
Для получение информации о других параметрах настройки обратитесь к справочной
странице по natd(8)
Перенаправление адреса полезно, если имеется несколько адресов IP, и они должны быть
на одной машине. В этой ситуации natd(8) может
назначить каждому клиенту ЛВС свой собственный внешний IP-адрес. Затем natd(8) преобразует
исходящие от клиентов локальной сети пакеты, заменяя IP-адреса на соответствующие
внешние, и перенаправляет весь трафик, входящий на некоторый IP-адрес, обратно
конкретному клиенту локальной сети. Это также называют статическим NAT. К примеру, пусть
IP-адреса 128.1.1.1, 128.1.1.2 и 128.1.1.3 принадлежат шлюзовой машине natd. 128.1.1.1 может использоваться в
качестве внешнего IP-адреса шлюзовой машины natd, тогда как
128.1.1.2 и 128.1.1.3 будут
перенаправляться обратно к клиентам ЛВС A и B.
Синтаксис для -redirect_address таков:
-redirect_address localIP publicIP
В примере этот аргумент будет выглядеть так:
-redirect_address 192.168.0.2 128.1.1.2
-redirect_address 192.168.0.3 128.1.1.3
Как и для -redirect_port, эти аргументы также помещаются в
строку natd_flags="" файла /etc/rc.conf или передаются через конфигурационный файл. При
перенаправлении адресов нет нужды в перенаправлении портов, потому что перенаправляются
все данные, принимаемые для конкретного IP-адреса.
Внешние IP-адреса машины с natd должны быть активизированы
и являться синонимами для внешнего интерфейса. Обратитесь к rc.conf(5), чтобы это
сделать.