Трансляция адресов

Что такое и зачем нужна трансляция адресов

IP-адреса (и другие параметры заголовков) пакетов, проходящих через хост можно изменять. Измененение IP-адреса отправителя дает возможность скрывать несколько адресов хостов одним, а IP-адреса получателя, например, распределять нагрузку между несколькими хостами. Изменение порта отправителя в некоторых случаях позволяет обходить ненужные брандмауэры, а порта получателя, к примеру, организовать прозрачную работу прокси-сервера.

В частном случае нужно выполнить маскарадинг , то есть скрытие множества хостов, работающих с разными IP-адресами, одним.

Из-за ограничености адресного пространства IP, каждый хост, который пользуется услугами Интернета не может получить собственного IP-адреса. В этом случае используются адреса из диапазонов 10.x.x.x, 192.168.x.x., 172.16.x.x.-172.31.x.x. Эти адреса зарезервированы для внутреннего использования и не могут встретиться в Интернете. Компьютеры, имеющие такие адреса, могут общаться друг с другом в пределах одной сети, но не могут выходить за ее пределы: пакеты, имеющие такие адреса будут попросту уничтожаться.

Для того чтобы обеспечить хостам с внутреними адресами возможность доступа к Интернету, используется маскарадинг.

При маскарадинге, адрес отправителя пакета автоматически подменяется внешним адресом сетевого интерфейса хоста, на котором он осуществляется.

Трансляция адресов в FreeBSD

В FreeBSD трансляцию адресов пакетов можно выполнить двумя способами:

natd

Демон natd является процессом , то есть он работает не в пространстве ядра, а в пространстве пользователя. Поэтому, для обработки демоном трафик должен копироваться из ядра в пространство пользователя и обратно. Это несколько уменьшает производительность.

ipnat

Трансляция адресов выполняется ядром системы.

Каждый из этих механизмов имеет собственные способы настройки. Здесь рассматривается только первый вариант, то есть обеспечение маскарадинга с помощью 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 отвечает за правильную передачу входящих и исходящих пакетов в рамках этого соединения.

  • протокол -- протокол, пакеты которого должны перенаправляться. Допустимые значения: 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

Не делать ничего, кроме обеспечения прозрачного прокси.