На стороне сервера
Получив пакет, сервер полагает, что имеет дело с каким-то одним компьютером, IP-адрес которого допускает глобальную маршрутизацию. Сервер будет направлять ответные пакеты на внешние IP-адрес и порт устройства NAT, указывая в полях источника свои собственные IP-адрес и порт.
Входящий пакет в устройстве NAT
NAT принимает эти пакеты от сервера и анализирует их содержимое на основе своей таблицы сопоставления портов. Если в таблице будет найдено сопоставление порта, для которого IP-адрес источника, порт источника, порт назначения и сетевой протокол из входящего пакета совпадают с IP-адресом удаленного узла, удаленным портом и сетевым протоколом, указанным в сопоставлении портов, NAT выполнит обратное преобразование. NAT заменяет внешний IP-адрес и внешний порт в полях назначения пакета на частный IP-адрес и внутренний порт клиента.
Затем NAT отправляет пакет клиенту по внутренней сети. Однако если NAT не находит подходящего сопоставления портов, входящий пакет отвергается и соединение разрывается.
Благодаря устройству NAT клиент получает возможность передавать данные в глобальной среде интернета, используя лишь частный IP-адрес; ни от приложения, ни от клиента не требуется никаких дополнительных усилий. Приложению не приходится обращаться к каким-либо специальным API-интерфейсам, а клиенту не нужно выполнять дополнительную настройку. В данном случае механизм NAT оказывается прозрачным по отношению к клиенту и к серверному приложению — все работает просто и четко.
Однако не все сетевые приложения пользуются протоколами, способными взаимодействовать с NAT. В этом-то и заключается проблема.
Проблемы взаимодействия NAT и приложений
Средство NAT успешно обеспечивает совместное использование единого глобального IP-адреса, когда клиент инициирует контакт и принимает ответ через один и тот же порт. Однако многие приложения используют стратегии, основанные на предположениях, которые становятся неверными, если для доступа в интернет применяется устройство NAT. Некоторые из подобных проблем обсуждаются ниже.
Службы во внутренней сети
Многие сетевые службы и серверы исходят из того, что если они установили прослушивающий сокет, то любой клиент в интернете сможет инициировать с ними контакт. Если на периферии сети размещено устройство NAT, то для прохождения входящего трафика к службам внутренней сети потребуется наличие соответствующего сопоставления портов. Поэтому такая служба будет доступна только клиентам частной сети, но не остальным узлам интернета.
Чаще всего эту проблему обходят, вручную настраивая сопоставление портов, которое позволяет устройству NAT передавать трафик, адресованный в NAT с указанием неких внешних IP-адреса и порта, на внутренние IP-адрес и порт, используемые службой.
Когда такое сопоставление установлено, служба может получать входящие пакеты и становится доступной для клиентов, внешних по отношению к частной сети. Пока сопоставление портов не выполнено, связь с сетью не поддерживается.
Настроить сопоставление портов вручную, как правило, довольно сложно; это требует определенного опыта. Поэтому многие индивидуально работающие пользователи и сотрудники небольших офисов не могут работать с нужными им приложениями и службами без посторонней помощи и вынуждены в поисках решения проблемы обращаться в службу технической поддержки своего интернет-провайдера, производителя компьютера, торговой фирмы или производителя шлюза интернета. К тому же такое сопоставление накладывает меньше ограничений — любой внешний клиент сможет воспользоваться им для инициирования контакта с сервером.
Вложенные адреса и порты
Некоторые сетевые приложения предполагают, что IP-адрес и порт, назначенные клиенту, всегда будут доступны для глобальной маршрутизации и смогут непосредственно использоваться в интернете. Во многих случаях эти адреса являются частными IP-адресами из диапазонов, зарезервированных группой IETF. Приложение включает такой частный IP-адрес или порт в содержащую полезные данные часть пакета, посылаемого на сервер. Сервер может использовать этот вложенный адрес для связи с клиентом.
Если сервер попытается ответить, используя вложенные IP-адрес и порт вместо сопоставленных значений адреса и порта, предоставленных средством NAT, то пакет будет отброшен при передаче. Это происходит потому, что вложенный IP-адрес нельзя маршрутизировать. Если сетевое приложение обнаружило бы устройство NAT и получило у него внешний IP-адрес и внешний порт, оно смогло бы поместить в пакет правильные данные.
Приложения, использующие различные сокеты
Некоторые сетевые приложения отправляют трафик на сервер или в другой узел, используя сокет в одном порте “X”, а ожидают ответа с сервера на другом, прослушивающем сокете в порте “Y”. NAT изучает исходящий трафик и производит сопоставление порта “X”, но не знает о том, что нужно еще выполнить сопоставление портов для возвращающихся пакетов, адресованных в порт “Y”. Входящие пакеты, адресованные в порт “Y”, отбрасываются.
Ожидание доступа к портам
Некоторые сетевые протоколы исходят из того, что нужный им порт, широко известный и допускающий глобальную маршрутизацию, всегда будет для них доступен. Когда несколько клиентов сообща используют один IP-адрес, в каждый момент времени только один клиент имеет доступ к стандартному порту. Например, только одна веб-служба может в каждый момент времени пользоваться внешним портом 80 в локальной сети. Если бы это было не так, устройство NAT не смогло бы определить, к какому клиенту относится внешний запрос. Необходимо, помимо настройки пользователем сопоставления портов, принять специальные меры к тому, чтобы разные клиенты могли быть распознаны извне локальной сети.
Использование нескольких устройств NAT
Если клиент находится с внутренней стороны устройства NAT, которое, в свою очередь, защищено еще одним устройством NAT, возникают новые проблемы, суть которых выходит за рамки настоящего документа.
Последствия для пользователей и для отрасли
Выше описывались технические аспекты проблем прохождения NAT. По отношению к пользователю эти проблемы проявляются очень просто: применяя NAT, он не сможет работать с нужными ему службами или приложениями.
Большинство пользователей сегодня и не подозревают, что становятся «жертвами» NAT. Они знают одно: когда они пытаются сыграть в коллективную игру или воспользоваться приложениями одноранговой связи (например, средствами общения в режиме реального времени), им это не удается. На экране появляется сообщение об ошибке (что-нибудь вроде «Невозможно установить связь») или приложение, пытавшееся запуститься, завершается аварийно.
В некоторых случаях пользователь, подключающийся к интернету через обычный модем удаленного доступа, не будет сталкиваться с подобными неполадками. Но если он станет абонентом службы широкополосного доступа и перейдет на модем DSL или кабельный модем, проблемы станут неизбежны. Пользователи, рассчитывавшие на более эффективную связь через интернет, будут озадачены внезапно появившимися помехами, не дающими им играть в игры и применять другие службы.
Это может привести к росту недовольства среди пользователей, которое будет направлено на изготовителей компьютеров, интернет-провайдеров, производителей шлюзов интернета и др. Клиент часто не знает, в чем причина неполадок, и сотрудникам службы технической поддержки не всегда удается помочь ему по телефону.
Но это проблема касается не только пользователя. Это также проблема производителей, предоставляющих пользователю продукты и услуги. Обращения в службу поддержки, вызванные проблемами NAT, означают повышение расходов и могут неблагоприятно отразиться на прибылях производителя или продавца продукта. В итоге какая-то часть пользователей может утратить интерес к новым службам и приложениям, испытывая неудовлетворенность из-за неудачных попыток доступа к старым службам, так что NAT превращается в тормоз на пути создания и распространения новейших продуктов и служб.
Учитывая все эти факторы, следует признать, что решение проблемы NAT становится важнейшей задачей для всей отрасли.