Что такое и зачем нужна трансляция адресов
IP-адреса (и другие параметры заголовков)
пакетов, проходящих через хост можно изменять.
Измененение IP-адреса отправителя дает возможность
скрывать несколько адресов хостов одним,
а IP-адреса получателя, например, распределять
нагрузку между несколькими хостами.
Изменение порта отправителя в некоторых случаях
позволяет обходить ненужные брандмауэры,
а порта получателя, к примеру, организовать
прозрачную работу прокси-сервера.
В частном случае нужно выполнить маскарадинг,
то есть скрытие множества хостов, работающих с разными IP-адресами,
одним.
Из-за ограничености адресного пространства IP,
каждый хост, который пользуется услугами Интернета
не может получить собственного IP-адреса.
В этом случае используются
адреса из диапазонов 10.x.x.x, 192.168.x.x., 172.16.x.x.-172.31.x.x.
Эти адреса зарезервированы для внутреннего использования и не могут
встретиться в Интернете.
Компьютеры, имеющие такие адреса, могут общаться друг с другом в пределах
одной сети, но не могут выходить за ее пределы:
пакеты, имеющие такие адреса будут попросту уничтожаться.
Для того чтобы обеспечить хостам с внутреними
адресами возможность доступа к Интернету,
используется маскарадинг.
При маскарадинге, адрес отправителя пакета автоматически
подменяется внешним адресом сетевого интерфейса хоста,
на котором он осуществляется.
Демон natd является процессом,
работающим в пространстве пользователя (то есть не в пространстве ядра).
Следовательно,
пакеты, которые он обрабатывает,
должны как-то к нему попасть.
Действие divert пакетного фильтра может справиться с такой задачей.
Если к пакету применяется действие divert,
он передается на соответствующий сокет и его
обработка фильтром пакетов на этом прекращается
(если сокет закрыт или не существует, пакет просто уничтожается).
Например, для того, чтобы все пакеты, которые
отправлены из сети 192.168.15.0
и проходят через интерфейс ${natd_interface}
передавались демону natd, нужно так модифицировать правила:
# ipfw add divert 8868 tcp from 192.168.15.0/24 to any via ${natd_interface}
Здесь ${natd_interface} -- интерфейс, через который пакеты
уходят из сети во внешний мир, а 8868 -- номер сокета, на котором ведет
прослушивание natd.
Вместо 8868 можно написать символическое имя порта: natd.
Для того чтобы трансляция адресов работала,
необходимо чтобы natd
получал и все пакеты, которые возвращаются обтратно.
Можно пойти еще дальше и передавать демону natd
вообще все пакеты, которые проходят через ${natd_interface}:
# ipfw add divert 8868 tcp from any to any via ${natd_interface}
Собственно настройка ipfw
дает только то, что пакеты будут переданы демону natd.
Основная работа выполняется самим демоном, так что,
нужно сконфигурировать и его.
Конфигурация natd задается либо аргументами
его командной строки, либо конфигурационным файлом /etc/natd.conf
(имя конфигурационного файла должно быть указано при вызове natd
с ключом -f).
Параметры конфигурационного файла и аргументы командной строки natd
в точности повторяют друг друга, с той разницей, что
когда параметр указывается в командной строке, перед ним нужно поставить
минус.
Например, сказать
# natd -interface xl0
значит то же самое, что и просто
# natd -f /etc/natd.conf
когда в конфигурационном файле /etc/natd.conf находится
interface xl0
Таблица 4. Опции natd
-redirect_port протокол targetIP:targetPORT[-targetPORT]
[aliasIP:]aliasPORT[-aliasPORT] [remoteIP[:remotePORT[-remotePORT]]]
|
Перенавправить входящее соединение.
Теперь natd отвечает за правильную передачу
входящих и исходящих пакетов в рамках этого соединения.
протокол --
протокол, пакеты которого должны перенаправляться.
Допустимые значения: tcp и udp
targetIP и targetPORT --
куда должно перенаправляться соединение;
aliasIP и aliasPORT --
откуда должно перенаправляться соединение;
remoteIP и remotePORT --
чье соединение будет перенаправляться.
|
-redirect_address localIP[,localIP,...] publicIP
|
Перенаправить входящие соединения, направленные на адрес
publicIP на внутренний адрес localIP.
Если указано несколько адресов localIP
нагрузка распределяется между ними, то есть
различные соединения перенаправляются на различные
localIP по очереди.
|
-config файл или -f файл
|
Использовать указаный файл
в качестве конфигурационного.
|
-dynamic
|
Используется в сочетании с -n или -interface.
Периодически проверять адрес интерфейса
и смотреть, не изменился ли он.
Если адрес изменился, то нужно
учесть это изменение при маскарадинге.
|
-a адрес
или -alias_address адрес
|
При маскарадинге указывать заданный адрес
в качестве адреса отправителя.
|
-interface интерфейс или -n интерфейс
|
Считать этот интерфейс внешним при маскарадинге.
При изменение IP-адреса следует
использовать вместе с опцией -dynamic.
|
-proxy_rule port порт server адрес:порт
|
Перехватывать все исходящие соединения,
по указаному порту и направлять их
на заданый сервер (адрес:порт).
Опция используется для обеспечения работа прозрачного прокси.
|
-proxy-only
|
Не делать ничего, кроме обеспечения прозрачного прокси.
|