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

24 март, 2004 - 00:00Леонід Бараш
Считается, что одна из наиболее трудно поправимых ошибок -- принятое на начальных стадиях создания Internet решение ограничиться четырьмя байтами для определения адресного пространства. Однако даже сегодня трудно порицать за это людей, думавших, что свыше четырех миллиардов адресов (232) будет достаточно на все времена: ведь тогда не было даже ПК, которые бы нуждались в подключении к Internet, отсутствовали Internet-телефоны и микроволновые печи с сетевым интерфейсом. Правда, реально доступными в связи с разбиением адресов на классы оказались только немногим более 3 миллиардов. Возникший в наше время дефицит IP-адресов частично решается с помощью протокола трансляции сетевых адресов.

Прежде чем углубляться в механизм работы NAT, рассмотрим, как обычно происходит IP-соединение. Формат IP-пакета предусматривает двухбайтовое поле для номеров портов. Таким образом, имеется 65 535 портов, о которых можно думать как о каналах. Первые 1023 из них зарезервированы для так называемых Well Known Services (WNS), таких, скажем, как telnet, ftp, gopher, www и тому подобное. То есть они зарезервированы для серверных процессов и соответствующих протоколов и не могут использоваться клиентскими процессами. Остающиеся же порты могут служить для любых целей. Что, к примеру, произойдет, если набрать строку telnet.someserver.com? Операционная система выберет номер порта выше 1023 и присвоит его данной сессии. Предположим, для конкретности, что это будет порт 1025. На someserver.com пакет поступит на порт 23, поскольку он зарезервирован для telnet-сессии. В то же время в полученном сервером пакете содержится номер порта (1025) для ответа. Именно он и будет указан в пакете, который сервер направит клиенту. Таким образом, присваивая разные номера портов открывающимся сессиям на клиентской машине, можно одновременно обмениваться пакетами с несколькими серверами.

Напомним, что для того чтобы пакеты доставлялись по назначению, каждый узел в IP-сети (в простейшем случае) должен иметь уникальный адрес. Поэтому первым шагом в решении проблемы ограничений IPv4 было определение блоков адресов, которые могли бы использоваться повторно. Ими стали диапазоны адресов 10.0.0.0 -- 10.255.255. 255; 172.16.0.0 -- 172.16.255.255 и 192.168.0.0 -- 192.168.255.255. RFC 1918 гарантировал, что они никогда не будут применяться во внешних сетях. Теперь любая компания могла взять для внутреннего использования одинаковые наборы адресов и ни о чем не беспокоиться. Однако поскольку пакеты с такими адресами не маршрутизируются в Internet, необходим какой-то механизм для передачи пакетов узлам в Internet, получения ответов, доставки их компьютерам внутренней LAN и упорядочения сессий. Именно этой работой и занимается протокол NAT. Он может выполняться на маршрутизаторе, с помощью которого LAN подключается к Internet, на прокси-сервере или на компьютере.

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

Для использования NAT маршрутизатор, подсоединяющий LAN к Internet, имеет два IP-адреса (для простоты мы возьмем двухпортовый маршрутизатор). Один (внутренний) со стороны LAN, который выбирается из зарезервированного RFC 1918 адресного пространства, и второй (внешний) -- со стороны Internet, предоставляемый оператором услуг Internet. Теперь продолжим рассмотрение нашего примера. Клиент посылает пакет узлу с адресом someserver.com. В заголовке пакета содержатся IP-адрес и номер порта источника наряду с IP-адресом и номером порта получателя. Когда пакет прибывает на маршрутизатор, тот модифицирует заголовок таким образом, что в Internet отправляется пакет, содержащий внешний IP-адрес маршрутизатора и номер порта источника, присвоенный из набора доступных адресов, имеющихся в таблице маршрутизатора, и те же IP-адрес и номер порта получателя, сгенерированные компьютером клиента. Далее маршрутизатор добавит в свою таблицу запись, которая приводит в соответствие внутренний адрес и номер порта машины клиента номеру порта, присвоенному этой сессии. Когда узел someserver.com посылает ответный пакет маршрутизатору, тот согласно таблице восстанавливает адресные атрибуты клиента и направляет пакет во внутреннюю сеть. Таким образом, NAT может представлять сотни компьютеров внутренней сети только одним внешним IP-адресом.

Трансляция сетевых адресов
Рис. 1
Трансляция сетевых адресов
Рис. 2
Трансляция сетевых адресов
Рис. 3
Существует несколько схем отображения внутренних, незарегистрированных адресов на внешние, зарегистрированные. При статической схеме NAT отображает один внутренний адрес на один внешний адрес. Так, IP-адрес 192.168.32.10 будет всегда транслироваться в адрес 213.18.123.110 (рис. 1). Такой метод используется, если необходимо обеспечить доступ к компьютеру клиента извне.

При динамической трансляции NAT отображает незарегистрированный IP-адрес на один из свободных из группы зарегистрированных адресов. IP-адрес 192.168.32.10 компьютера будет транслироваться на первый доступный адрес из диапазона 213.18.123.100 -- 213.18.123.150 (рис. 2). Динамическая трансляция также действует по схеме "один к одному". Однако, как говорится, возможны варианты. Первый из них, при котором множество незарегистрированных адресов отображаются на один зарегистрированный с использованием различных портов, известен как overloading или Port Address Translation (PAT). В этой схеме каждый внутренний сетевой адрес компьютера клиента отображается на один и тот же внешний IP-адрес, но с разными номерами портов (рис. 3). Может существовать ситуация, когда внутренние адреса, применяемые в частной LAN, являются зарегистрированными IP-адресами в другой сети (overlapping). В таком случае маршрутизатор должен иметь таблицу соответствия этих адресов, чтобы перехватить их и заменить на уникальные зарегистрированные адреса.

Рассмотрим вкратце, как обеспечивается безопасность и выполняются административные функции с использованием NAT.

Реализация динамической схемы NAT автоматически создает брандмауэр между внутренней и внешней сетями или Internet. Динамическая трансляция позволяет осуществлять соединения, инициированные только компьютерами внутренней сети. Это значит, что компьютеры из внешней сети не могут подключаться к рабочей станции LAN, если только последняя не инициирует соединение. Таким образом, компьютеры внутренней сети могут осуществлять Internet-серфинг их и даже загружать файлы с сайтов, но никто извне не может захватить их IP-адреса и использовать последние для соединения с каким-нибудь портом клиентского компьютера. С помощью NAT маршрутизаторы способны выполнять фильтрацию пакетов и регистрацию трафика. Это позволяет контролировать посещаемость Web-узлов сотрудниками организации и тем самым предотвращать просмотр материалов сомнительного содержания.

Заметим, что NAT иногда путают с прокси-сервером. Однако между ними существует различие. NAT прозрачна как для отправителя, так и для получателя: ни один из них не может обнаружить, что имеет дело с третьим устройством. Но прокси-сервер не является прозрачным. Компьютер-источник знает, что он обращается к прокси-серверу и должен быть соответствующим образом сконфигурирован. Компьютер-получатель считает, что прокси-сервер представляет собой источник и имеет дело непосредственно с ним. К тому же прокси-сервер обычно работает на четвертом (транспортном) уровне эталонной модели OSI, тогда как NAT является протоколом третьего (сетевого) уровня.

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