NAT

Материал из VTK Wiki

Перейти к: навигация, поиск

Содержание

Общее описание

NAT - сокращение от Network Address Translation, "трансляция сетевых адресов" - технология, реализуемая маршрутизаторами в IP-сетях. Суть технологии NAT в том, что при пересборке заголовков IP-пакета в ходе его перемещения между своими интерфейсами, маршрутизатор подменяет в пакетах адреса отправителя и/или получателя по определенным правилам. В зависимости от этих правил и от выполняемой подмены становится возможной реализация многих интересных функций, например:

  • Предоставление доступа к Интернет целой сети под одним IP-адресом
  • Сокрытие внутренней структуры сети
  • Установка общедоступного сервера на машине во внутренней сети
  • Прозрачное "внесение" посторонних серверов в рамки сегмента сети
  • Распределение внешней нагрузки между несколькими серверами

Естественно, за все надо платить. Применение NAT повышает нагрузку на маршрутизатор в сети и снижает его производительность, но в наше время обычно это не является серьезным препятствием, особенно если учесть получаемые за счет реализации NAT возможности.

В последние годы NAT в том или ином виде поддерживается многими аппаратными роутерами и программными средствами маршрутизации. Несмотря на перечисленную выше внушительную горку плюсов, у NAT существуют и проблемы, как связанные с ограничениями его реализации, так и принципиально трудноустранимые. Им будет посвящен отдельный раздел статьи.

Варианты реализации

Традиционные виды NAT

Исходящая трансляция

Этот вид трансляции появился первым и наиболее распространен. В старые времена, когда понятие NAT еще не появилось в сетевом обиходе, его также называли IP Masquerading, а в терминологии Cisco такой сервис принято называть PAT (Port and Address Translation).

При выполнении исходящей трансляции адресов NAT-маршрутизатор в ходе передачи пакета из внутренней сети наружу сверяется со специальной, динамически наполняемой таблицей в оперативной памяти, не передавалось ли уже пакетов с таким же внутренним адресом отправителя и портом. Если такая запись в таблице не найдена, он выбирает свободный порт на себе самом и заносит в эту таблицу запись, в которой указывает внутренний адрес отправителя, исходящий порт на нем, и собственный порт, который он выбрал. Далее маршрутизатор подменяет в пакете внутренний IP-адрес отправителя на свой собственный внешний, а номер порта отправителя - на собственный порт, соответствующий этой паре "отправитель-порт" в таблице трансляций, пересчитывает контрольные суммы и отправляет пакет.

Таким образом, с точки зрения внешнего получателя пакета - пакет был отправлен самим маршрутизатором, а не внутренней машиной сети. Соответственно, ответные пакеты внешний получатель тоже отправляет на внешний адрес маршрутизатора и его порт, указанные в исходном пакете. При получении ответного пакета маршрутизатор вновь сверяется с таблицей трансляций и если обнаруживает в ней, что порт, на который получен пакет, соответствует определенному внутреннему адресу и порту, то передает полученный пакет во внутреннююю сеть, подменяя в нем адрес и порт получателя на данные внутренней машины. Если же подобной записи в таблице не обнаруживается - маршрутизатор в большинстве случаев просто отбрасывает пакет.

Естественно, поскольку память у маршрутизатора ограничена, таблица трансляций время от времени подчищается: из нее удаляются те строки, обращений к которым не было дольше определенного времени.

В идеальном случае достигается ситуация, когда с точки зрения внутреннего пользователя сети за NAT он "работает в Интернете" без помех, поскольку все его исходящие пакеты успешно передаются во внешний мир, а все ответы на них - доходят до него назад несмотря на то, что адрес у него внутренний и снаружи не виден. А с точки зрения внешнего пользователя - нет вообще никакой внутренней сети, а есть ровно одна машина с одним адресом (тем, что у внешнего интерфейса NAT-маршрутизатора), с которой и осуществляется все взаимодействие.

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

Легко заметить, что в самом простом случае при реализации этого вида трансляции от администратора не требуется проведения никаких дополнительных настроек на маршрутизаторе. Достаточно дать команду "включить NAT", все остальные данные (адрес внешнего интерфейса, адрес и маска внутренней сети) уже имеются в базовой настройке. Это - простота внедрения - тоже одна из причин широкой популярности этого вида трансляции. Тем не менее, бывают случаи, когда и для него требуется тонкая настройка, так что серьезные реализации NAT позволяют ее произвести.

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

Этот вид трансляции, в обиходе часто именуемый port mapping, является логичным дополнением описанной выше исходящей трансляции. Внимательный читатель заметил, что маршрутизатор с настроенным исходящим NAT отбрасывает приходящие извне пакеты, для которых у него нет записи в таблице трансляций. Такое поведение делает невозможным получение доступа к внутренним машинам извне сети, например, невозможно становится предоставить доступ внешним пользователям к серверу внутри сети. Именно для этого и придумана входящая трансляция.

Фактически суть ее состоит в том, что в таблицу трансляций маршрутизатора (которая, мы помним, наполняется и чистится при исходящей трансляции динамически) заранее дописываются строки, соответствующие определенным внутренним адресам и внутренним портам серверов, а также внешним портам маршрутизатора. Эти строки не удаляются при обычной чистке таблицы, они присутствуют в ней постоянно. В остальном - работа NAT на маршрутизаторе не меняется ни в чем.

В результате такого дополнения таблицы трансляций маршрутизатор уже не отбрасывает пакеты, адресованные снаружи на определенный его порт, но передает их во внутреннюю сеть на указанные в трансляции порт и внутренний адрес. Тем самым скрытый за NAT сервер во внутренней сети может спокойно принимать входящие соединения от пользователей снаружи, а его ответы им транслируются маршрутизатором на общих основаниях.

Замечу, что принцип сокрытия внутренней структуры сети при этом остается в силе. С точки зрения внешнего пользователя - сервер имеет тот же самый адрес внешнего интерфейса маршрутизатора, который имеет, по его мнению, вся остальная сеть за ним. Каков его реальный внутренний адрес, он узнать не в состоянии, если сервер не сообщит его ему сам - в данных прикладного уровня.

Входящая трансляция часто реализуется в тех же системах, что и исходящая, как дополнение к ней, но как легко увидеть, в отличие от исходящего входящий NAT уже требует обязательной тонкой настройки. Некоторые маршрутизаторы, например, D-Link DSL-500T, дополнительно предоставляют так называемый сервис DMZ, "демилитаризованной зоны". В этом случае все входящие пакеты, для которых маршрутизатор не нашел записей в таблице трансляции, не отбрасываются им, а передаются на определенный в настройках маршрутизатора внутренний адрес. Такой "упрощенный" способ реализации входящего NAT вполне подходит тем сетям, в которых все или большинство доступных извне сервисов расположены на единственной машине.

Прочие виды NAT

Помимо описанных выше исходящей и входящей трансляций для NAT существует много других применений. Все эти откровенно экзотические виды применения NAT обычно не требуются в рядовых сетях, а потому реализуются только на специальном оборудовании, например, на маршрутизаторах Cisco.

Так, например, можно заставить определенный внешний сервер "стать частью" внутренней сети, как если бы его подключили в этот сегмент, выдав ему собственный "виртуальный" внутренний адрес. При этом пакеты, направленные на этот внутренний адрес внутренними абонентами в реальности доставляются на маршрутизатор, который передает их во внешнюю сеть, подменив адрес отправителя - своим, а адрес получателя - назначенным адресом внешнего сервера. Ответы внешнего сервера транслируются вовнутрь обычным порядком, с подменой адреса отправителя на "виртуальный" внутренний адрес этого сервера.

Еще одно применение NAT - балансировка внешней нагрузки между несколькими серверами во внутренней сети. В этом случае маршрутизатор с NAT, получив от внешнего пользователя пакет, адресованный на определенный порт своего внешнего адреса, выбирает случайным образом один из известных ему внутренних адресов серверов, добавляет соответствующее правило в таблицу трансляции и передает пакет на этот внутренний сервер. Ответы сервера, естественно, транслируются наружу обычным образом. Так достигается ситуация, когда разные запросы внешних пользователей обрабатываются разными внутренними серверами при том, что с точки зрения внешнего абонента все они направлялись на один внешний адрес и порт.

Проблемы, связанные с NAT

При всех предлагаемых технологией преимуществах, применение трансляции адресов зачастую связано с некоторыми сложностями. Наиболее типичные проблемы, возникающие при работе пользователей через NAT, я попробую перечислить в этом разделе.

Прикладные программы, передающие адреса в составе пакетов

Большинство программ, работающих с сетью, не беспокоится о своем собственном адресе, полагаясь в этом смысле на протокол IP. Тем не менее, существует множество сетевых протоколов, подразумевающих передачу адресов или номеров портов в данных прикладного уровня. Ярким и общеизвестным примером подобного протокола является активный режим FTP, в котором адрес получателя передается в явном виде в команде PORT. Другой пример подобного рода - DCC-соединения в протоколе IRC, при установлении которых адрес одной из сторон передается другой в составе CTCP-сообщения.

"Умные" системы, реализующие трансляцию адресов, используют так называемую "инспекцию протоколов" для того, чтобы отследить подобные казусы и осуществить подмену адресной информации также и на прикладном уровне. Однако, далеко не все реализации NAT поддерживают такое вмешательство в траффик, да и те, что поддерживают, реализуют это только для наиболее популярных протоколов на отдельных портах. Примеры таких "умных" реализаций - в маршрутизаторах Cisco и в WinRoute Firewall.

Для обхода этого ограничения NAT ввиду огромной его распространенности многие современные сетевые программы позволяют указать в настройках свой "внешний" адрес и включают в передаваемые данные именно его. В сочетании с грамотно настроенной входящей трансляцией адресов это позволяет им работать "сквозь" NAT без помех. Примеры таких программ - StrongDC и FileZilla Server.

Недоступность машин за NAT извне сети

Эта проблема - по сути отражение одного из преимуществ исходящей трансляции адресов, а именно - сокрытия структуры внутренней сети. Поскольку при работающей исходящей трансляции с точки зрения внешнего абонента все пользователи внутренней сети представлены одним адресом, организовать их разделение, или тем более, подключиться к определенной внутренней машине, становится для внешнего абонента неразрешимой задачей.

В результате этого - для пользователей закрытой NAT сети становятся недоступны любые сервисы, полагающиеся в своей работе на прием машиной абонента входящих соединений извне. Примеры таких сервисов - передача файлов в ICQ, прием входящих вызовов в NetMeeting и подобных программах.

В отдельных случаях с этой проблемой можно бороться, организовав по согласованию с администратором NAT-шлюза соответствующую входящую трансляцию адресов. Так, например, Miranda IM при использовании ее как ICQ-клиента позволяет указать определенный диапазон портов для приема входящих соединений. Если для каждой машины с Мирандой в сети за NAT назначить и настроить свой, отдельный диапазон портов, а на шлюзе сети включить входящую трансляцию каждого такого диапазона на соответствующую ему внутреннюю машину - можно успешно обойти это ограничение.

Тем не менее, во многих случаях (например, когда порты жестко зафиксированы в протоколе, как это сделано в NetMeeting) такой обходной маневр неприменим и не остается ничего иного, как отказаться от использования таких программ, либо вынести компьютеры с ними за пределы закрытой NAT части сети, с выдачей им собственных "внешних" адресов. К счастью, подобных программ немного.

Транзитные VPN-соединения

Поддержка VPN-соединений от внутреннего клиента к внешнему серверу - настоящий бич современных NAT-маршрутизаторов. В большинстве реализаций NAT полноценно поддерживаются лишь основные IP-протоколы: ICMP. TCP и UDP. Работа с прочими протоколами IP, на базе которых и строятся обычно VPN-туннели (например, туннели PPTP, применяемые клиентами Востоктелекома для выхода в Интернет, используют протокол GRE), реализуется по остаточному принципу или не реализуется вовсе.

В результате многие реализации NAT либо вообще не пропускают сквозь себя VPN-соединения определенных типов, либо ограничивают их работу (например, допуская не более одного соединения на всю внутреннюю сеть). При планировании установки NAT на маршрутизаторе в сети, откуда планируется выход наружу через VPN - обязательно убедитесь, что выбранный Вами NAT полноценно поддерживает работу с применяемым типом VPN.

Популярные продукты, реализующие трансляцию адресов

Программные пакеты

  • Сервис Internet Connection Sharing (ICS), встроенный в Windows XP
  • Сервис Routing and Remote Access (RRAS), встроенный в серверные сборки Windows 2000 и 2003
  • Kerio WinRoute Firewall
  • WinGate
  • UserGate начиная с версии 3
  • natd в составе FreeBSD
  • iptables в составе дистрибутивов Linux

Аппаратные маршрутизаторы

  • Маршрутизаторы и L3-коммутаторы производства Cisco Systems
  • DSL-маршрутизаторы D-Link (например, DSL-500T)
Источник — «http://help.vth.ru/NAT»