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