IP-адреса (и другие параметры заголовков) пакетов, проходящих через хост можно изменять. Измененение IP-адреса отправителя дает возможность скрывать несколько адресов хостов одним, а IP-адреса получателя, например, распределять нагрузку между несколькими хостами. Изменение порта отправителя в некоторых случаях позволяет обходить ненужные брандмауэры, а порта получателя, к примеру, организовать прозрачную работу прокси-сервера.
В частном случае нужно выполнить маскарадинг , то есть скрытие множества хостов, работающих с разными IP-адресами, одним.
Из-за ограничености адресного пространства IP, каждый хост, который пользуется услугами Интернета не может получить собственного IP-адреса. В этом случае используются адреса из диапазонов 10.x.x.x, 192.168.x.x., 172.16.x.x.-172.31.x.x. Эти адреса зарезервированы для внутреннего использования и не могут встретиться в Интернете. Компьютеры, имеющие такие адреса, могут общаться друг с другом в пределах одной сети, но не могут выходить за ее пределы: пакеты, имеющие такие адреса будут попросту уничтожаться.
Для того чтобы обеспечить хостам с внутреними адресами возможность доступа к Интернету, используется маскарадинг.
При маскарадинге, адрес отправителя пакета автоматически подменяется внешним адресом сетевого интерфейса хоста, на котором он осуществляется.
В FreeBSD трансляцию адресов пакетов можно выполнить двумя способами:
Демон natd является процессом , то есть он работает не в пространстве ядра, а в пространстве пользователя. Поэтому, для обработки демоном трафик должен копироваться из ядра в пространство пользователя и обратно. Это несколько уменьшает производительность.
Трансляция адресов выполняется ядром системы.
Каждый из этих механизмов имеет собственные способы настройки. Здесь рассматривается только первый вариант, то есть обеспечение маскарадинга с помощью natd.
Демон 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 отвечает за правильную передачу входящих и исходящих пакетов в рамках этого соединения.
|
-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 |
Не делать ничего, кроме обеспечения прозрачного прокси. |