До того, как у нас закончились адреса IPv4, мы (широко) не использовали NAT. У каждого компьютера, подключенного к Интернету, будет свой глобальный уникальный адрес. Когда NAT был впервые представлен, он должен был перейти от предоставления клиентам ISP 1 реального адреса на устройство, которое клиент использовал / владел, к предоставлению 1 клиенту 1 реального адреса. Это решило проблему на некоторое время (годы), в то время как мы должны были перейти на IPv6. Вместо перехода на IPv6 (в основном) все ждали, когда все остальные переключатся, и поэтому (в основном) никто не выкатывал IPv6. Теперь мы снова сталкиваемся с той же проблемой, но на этот раз развертывается второй уровень NAT (CGN), так что интернет-провайдеры могут совместно использовать 1 реальный адрес для нескольких клиентов.
Исчерпание IP-адреса не имеет большого значения, если NAT не является ужасным, в том числе и в случае, когда конечный пользователь не имеет над ним никакого контроля (Carrier Grade NAT или CGN).
Но я бы сказал, что NAT ужасен, особенно в случае, когда конечный пользователь не имеет над ним контроля. И (как человек, занимающийся сетевым проектированием / администрированием, но обладающий степенью разработки программного обеспечения), я бы сказал, что, внедрив NAT вместо IPv6, сетевые администраторы перенесли вес решения по исчерпанию адресов из своей области на конечных пользователей. и разработчики приложений.
Итак (на мой взгляд), почему NAT ужасная, злая вещь, которую следует избегать?
Давайте посмотрим, могу ли я отдать должное объяснению того, что он ломает (и какие проблемы это вызывает, мы настолько привыкли, что даже не осознаем, что это может быть лучше):
- Независимость сетевого уровня
- Одноранговые соединения
- Согласованное наименование и расположение ресурсов
- Оптимальная маршрутизация трафика, хосты знают свой реальный адрес
- Отслеживание источника вредоносного трафика
- Сетевые протоколы, которые разделяют данные и управляют на отдельные соединения
Посмотрим, смогу ли я объяснить каждый из этих пунктов.
Независимость сетевого уровня
Предполагается, что интернет-провайдеры просто пропускают пакеты уровня 3 и не заботятся о том, что находится на уровнях выше этого. Независимо от того, передаете ли вы протокол TCP, UDP или что-то более / более экзотическое (возможно, SCTP? Или даже какой-то другой протокол, который лучше, чем TCP / UDP, но неясен из-за отсутствия поддержки NAT), ваш ISP не должен забота; все это должно выглядеть как данные для них.
Но это не так - не тогда, когда они реализуют «вторую волну» NAT, «Carrier Grade» NAT. Затем они обязательно должны смотреть и поддерживать протоколы уровня 4, которые вы хотите использовать. Сейчас это практически означает, что вы можете использовать только TCP и UDP. Другие протоколы были бы либо просто заблокированы / отброшены (в моем опыте подавляющее большинство случаев), либо просто перенаправлены на последний хост «внутри» NAT, который использовал этот протокол (я видел 1 реализацию, которая делает это). Даже пересылка на последний хост, который использовал этот протокол, не является реальным исправлением - как только два хоста используют его, он ломается.
Я полагаю, что существуют некоторые протоколы замены для TCP и UDP, которые в настоящее время не проверены и не используются только из-за этой проблемы. Не поймите меня неправильно, TCP & UDP были впечатляюще хорошо спроектированы, и это удивительно, как они оба смогли масштабироваться в соответствии с тем, как мы используем Интернет сегодня. Но кто знает, что мы упустили? Я читал о SCTP, и это звучит хорошо, но никогда не использовал его, потому что это было непрактично из-за NAT.
Одноранговые соединения
Это большой. На самом деле, самый большой на мой взгляд. Если у вас есть два конечных пользователя, оба за собственным NAT, независимо от того, какой из них пытается подключиться первым, NAT другого пользователя отбросит свой пакет, и соединение не будет установлено.
Это влияет на игры, голосовой / видеочат (например, Skype), размещение собственных серверов и т. Д.
Есть обходные пути. Проблема заключается в том, что эти обходные пути стоят времени разработчика, времени и неудобств для конечного пользователя или затрат на инфраструктуру обслуживания. И они не надежны и иногда ломаются. (См. Комментарии других пользователей о сбое в работе Skype.)
Одним из обходных путей является переадресация портов, когда вы программируете устройство NAT для переадресации определенного входящего порта на конкретный компьютер за устройством NAT. Есть целые сайты, посвященные тому, как сделать это для всех различных устройств NAT, которые там есть. Смотрите https://portforward.com/ . Это обычно стоит времени конечного пользователя и разочарования.
Другой обходной путь - добавить поддержку таких вещей, как пробивание дырок в приложениях, и поддерживать инфраструктуру сервера, которая не находится за NAT, для введения двух клиентов с NAT. Это обычно стоит времени на разработку и ставит разработчиков в состояние потенциальной поддержки серверной инфраструктуры там, где это раньше не требовалось.
(Помните, что я говорил о развертывании NAT вместо IPv6, перенося вес проблемы с сетевых администраторов на конечных пользователей и разработчиков приложений?)
Согласованное наименование / расположение сетевых ресурсов
Поскольку внутри NAT используется другое адресное пространство, чем снаружи, любая служба, предлагаемая устройством внутри NAT, имеет несколько адресов для доступа к нему, и правильный выбор зависит от того, откуда клиент обращается к нему. , (Это все еще проблема, даже после того, как вы работаете с переадресацией портов.)
Если у вас есть веб-сервер внутри NAT, скажем, на порту 192.168.0.23, порт 80, и ваше устройство NAT (маршрутизатор / шлюз) имеет внешний адрес 35.72.216.228, и вы настроили переадресацию портов для порта TCP 80, теперь ваш Доступ к веб-серверу можно получить через порт 80 192.168.0.23 ИЛИ порт 35.72.216.228. Выбор одного из них зависит от того, находитесь ли вы внутри или за пределами NAT. Если вы находитесь за пределами NAT и используете адрес 192.168.0.23, вы не попадете туда, где ожидаете. Если вы находитесь внутри NAT и используете внешний адрес 35.72.216.228, вы можете получить, куда хотите, если ваша реализация NAT является продвинутой и поддерживает шпильку, но тогда веб-сервер, обслуживающий ваш запрос, увидит запрос как поступающий с вашего устройства NAT. Это означает, что весь трафик должен проходить через устройство NAT, даже если в сети имеется более короткий путь за NAT, и это означает, что журналы на веб-сервере становятся намного менее полезными, поскольку все они перечисляют устройство NAT в качестве источника связь. Если ваша реализация NAT не поддерживает шпильку, вы не получите того, чего ожидали.
И эта проблема усугубляется, как только вы используете DNS. Внезапно, если вы хотите, чтобы все работало должным образом для чего-либо, размещенного за NAT, вы захотите дать разные ответы на адрес службы, размещенной внутри NAT, в зависимости от того, кто спрашивает (DNS с разделенным горизонтом AKA, IIRC). Тьфу.
И все это при условии, что у вас есть кто-то, кто хорошо разбирается в переадресации портов, шпильке NAT и DNS с разделением горизонта. Как насчет конечных пользователей? Каковы их шансы настроить все это правильно, когда они купят потребительский маршрутизатор и некоторую IP-камеру безопасности и хотят, чтобы она «просто работала»?
И это приводит меня к:
Оптимальная маршрутизация трафика, хосты знают свой реальный адрес
Как мы уже видели, даже при использовании расширенного NAT-трафика трафик не всегда проходит через оптимальный путь. Это даже в том случае, если опытный администратор устанавливает сервер и имеет шпильку NAT. (Разумеется, DNS с разделением горизонта может привести к оптимальной маршрутизации внутреннего трафика в руках сетевого администратора.)
Что происходит, когда разработчик приложения создает программу, подобную Dropbox, и распространяет ее среди конечных пользователей, которые не специализируются в настройке сетевого оборудования? В частности, что происходит, когда я помещаю файл объемом 4 ГБ в общий файл, а затем пытаюсь получить доступ на следующем компьютере? Передается ли он напрямую между компьютерами, или мне нужно подождать, пока он загрузится на облачный сервер через медленное WAN-соединение, а затем подождать второй раз, пока он загрузится через то же медленное WAN-соединение?
Для наивной реализации, он будет загружен и затем загружен с использованием серверной инфраструктуры Dropbox, которая не находится за NAT в качестве посредника. Но если две машины могли понять только, что они находятся в одной сети, они могли бы просто напрямую передавать файл намного быстрее. Итак, для нашей первой менее наивной попытки реализации мы могли бы спросить у ОС, какой IP-адрес (v4) есть у компьютера, а затем проверить его на других машинах, зарегистрированных в той же учетной записи Dropbox. Если он находится в том же диапазоне, что и мы, просто передайте файл. Это может работать во многих случаях. Но даже тогда возникает проблема: NAT работает только потому, что мы можем повторно использовать адреса. Так что, если адрес 192.168.0.23 и адрес 192.168.0. 42 адреса, зарегистрированные в одной учетной записи Dropbox, фактически находятся в разных сетях (например, в вашей домашней сети и в вашей рабочей сети)? Теперь вы должны вернуться к использованию серверной инфраструктуры Dropbox для посредничества. (В конце концов, Dropbox попытался решить эту проблему, передав каждому клиенту Dropbox широковещательную рассылку в локальной сети в надежде найти других клиентов. Но эти широковещательные рассылки не пересекают маршрутизаторы, которые могут быть у вас за NAT, то есть это не полное решение. ,особенно в случае CGN .)
Статические IP-адреса
Кроме того, поскольку первая нехватка (и волна NAT) произошла, когда многие потребительские соединения не всегда были в соединениях (например, при коммутируемом соединении), интернет-провайдеры могли бы лучше использовать свои адреса, только выделяя публичные / внешние IP-адреса, когда вы на самом деле были подключены. Это означало, что когда вы подключались, вы получали любой доступный адрес, а не всегда получали один и тот же. Это значительно усложняет работу на вашем собственном сервере и усложняет разработку одноранговых приложений, поскольку им приходится иметь дело с перемещающимися одноранговыми узлами, а не с фиксированными адресами.
Обфускация источника вредоносного трафика
Поскольку NAT перезаписывает исходящие соединения так, как если бы они исходили от самого устройства NAT, все поведение, хорошее или плохое, свернуто в один внешний IP-адрес. Я не видел ни одного устройства NAT, которое регистрирует каждое исходящее соединение по умолчанию. Это означает, что по умолчанию источник прошлого вредоносного трафика можно отследить только на устройстве NAT, через которое он прошел. Хотя для регистрации каждого исходящего соединения можно настроить оборудование корпоративного или операторского класса, я не видел ни одного маршрутизатора-потребителя, который бы это делал. Я, конечно, думаю, что будет интересно посмотреть, будут ли (и как долго) интернет-провайдеры вести журнал всех соединений TCP и UDP, выполненных через CGN, по мере их развертывания. Такие записи будут необходимы для рассмотрения жалоб на злоупотребления и жалоб DMCA.
Некоторые люди думают, что NAT повышает безопасность. Если это так, то это происходит через мрак. Отбрасывание входящего трафика по умолчанию, которое NAT делает обязательным, аналогично наличию межсетевого экрана с сохранением состояния. Насколько я понимаю, любое оборудование, способное выполнять отслеживание соединений, необходимое для NAT, должно иметь возможность запускать межсетевой экран с отслеживанием состояния, поэтому NAT на самом деле не заслуживает каких-либо точек там.
Протоколы, использующие второе соединение
Протоколы, такие как FTP и SIP (VoIP), как правило, используют отдельные соединения для контроля и фактического содержимого данных. Каждый протокол, который делает это, должен иметь вспомогательное программное обеспечение, называемое ALG (шлюз прикладного уровня) на каждом устройстве NAT, через которое он проходит, или обходить проблему с помощью какого-либо посредника или пробивки отверстий. По моему опыту, ALG редко, если вообще обновляются, были причиной по крайней мере нескольких проблем, с которыми я сталкивался при использовании SIP. Каждый раз, когда я слышу, как кто-то сообщает, что VoIP у них не работает, потому что звук работает только в одном направлении, я сразу же подозреваю, что где-то есть NAT-шлюз, сбрасывающий UDP-пакеты, с которыми он не может понять, что делать.
Таким образом, NAT имеет тенденцию ломаться:
- альтернативные протоколы TCP или UDP
- одноранговые системы
- доступ к чему-то, что находится за NAT
- такие вещи, как SIP и FTP. ALG, чтобы обойти это, по-прежнему вызывают случайные и странные проблемы сегодня, особенно с SIP.
По сути, многоуровневый подход сетевого стека относительно прост и элегантен. Попытайтесь объяснить это кому-то новичку в сети, и они неизбежно предполагают, что их домашняя сеть, вероятно, является хорошей, простой сетью, которую нужно понять. Я видел, как это привело в нескольких случаях к довольно интересным (чрезмерно сложным) идеям о том, как работает маршрутизация из-за путаницы между внешними и внутренними адресами.
Я подозреваю, что без NAT VoIP был бы вездесущим и интегрированным с PSTN, и что звонки с мобильного телефона или компьютера были бы бесплатными (за исключением Интернета, за который вы уже заплатили). В конце концов, зачем мне платить за телефон, если мы с вами можем просто открыть поток VoIP 64K, и он работает так же хорошо, как PSTN? Кажется, что сегодня проблема номер 1 с развертыванием VoIP проходит через устройства NAT.
Я подозреваю, что мы обычно не понимаем, насколько проще было бы многое, если бы у нас была сквозная связь, которую прервал NAT. Люди по-прежнему отправляют по электронной почте (или Dropbox) сами файлы, потому что если основная проблема заключается в необходимости посредника, когда два клиента находятся за NAT.