Network Address Translation (NAT)- ДЫРКА В СЕТИ (CISCO)
Network Address Translation (NAT) — это технология, используемая для изменения IP-адресов в заголовках пакетов, проходящих через маршрутизатор или фаервол. Основная цель NAT — сократить количество публичных IP-адресов, необходимых для связи с интернетом, и улучшить безопасность путем скрытия реальных IP-адресов внутри сети. Существуют различные виды NAT, такие как Static NAT, Dynamic NAT и Перегруженный NAT (PAT), каждый из которых применяется в зависимости от потребностей сети и управления адресами. В этой статье мы рассмотрим эти методы и их применение в современных сетевых инфраструктурах.
Мы будем рассматривать практическую реализацию NAT, используя эмуляцию сети на GNS. Начнем с изучения статического NAT, и на практике посмотрим, как оно работает в нашей сети.

Это схема сети нашего предприятия. Мы подключаемся к интернет-провайдеру (ISP), который предоставляет нам публичный IP-адрес. Для того чтобы наш трафик мог выйти в интернет, на маршрутизаторе мы настраиваем дефолтный маршрут (обычно это маршрут с сетью 0.0.0.0/0). Подключение к провайдеру может быть выполнено через Serial Link (PPP, PPoE etc) или с использованием динамического протокола DHCP, чтобы получить IP-адрес. Однако, подробности настройки на стороне провайдера нас не интересуют.
В нашей сети будет находиться сервер, к которому мы захотим получить доступ. Мы настроим все необходимые IP-адреса для корректной работы сети и маршрутизации, обеспечив взаимодействие с внешним миром через интернет.
Таким образом, наша основная задача — правильно настроить IP-адресацию, маршруты и сетевые устройства для надежного и эффективного соединения с интернетом.
Когда была создана первая версия IP (IPv4), предполагалось, что все устройства в сети будут иметь уникальные публичные IP-адреса, которые можно будет использовать для прямой связи между всеми устройствами в интернете. Однако со временем количество доступных публичных адресов оказалось ограниченным, и этого количества не хватило для всех устройств, подключенных к сет

В ответ на эту проблему были введены частные IP-адреса (например, диапазоны 192.168.0.0, 10.0.0.0 и другие), которые можно использовать внутри частных сетей. Эти частные адреса не маршрутизируются в интернет. Вместо этого, когда устройство с частным IP-адресом отправляет данные в интернет, используется публичный IP-адрес. Это осуществляется с помощью технологии NAT (Network Address Translation), которая позволяет нескольким устройствам внутри частной сети использовать один публичный IP-адрес для выхода в интернет. Таким образом, частные IP-адреса служат для внутренней сети, а публичный IP-адрес используется для связи с внешним миром.

как видем если пингануть сервер с нашего компа, он не пинганется т.к частные адреса не маршрутизируются в интернете, поэтому нужно настроить NAT.
Но прежде чем настроим NAT, сделаем базовую статическую маршрутизацию на наших роутерах. Как мы и говорили на нашем роутере предприятия будем использовать дефолтный маршрут т.к мы бы не хотели чтобы он загружал в себя Full-view ip route (Допустим что там используется eBGP)
EdgeRouter (config)# ip route 0.0.0.0 0.0.0.0 215.215.215.2 # Дефолтный маршрут через ISP Router
Эта настройка позволит маршрутизатору EdgeRouter направлять весь трафик, который не может быть доставлен внутри локальной сети (например, запросы на сервер в интернете), через дефолтный маршрут к маршрутизатору ISP Router с адресом 215.215.215.2.
Конфигурация на роутере провайдера

ip route 134.25.25.0 255.255.255.0 125.15.15.3 (Чтобы знать маршрут к серверу)
Конфигурация на промежуточном роутере

ip route 215.215.215.0 255.255.255.0 125.15.15.2 (Обратный маршрут)




Можем также посмотреть в реальном времени трансляцию NAT
Команда show ip nat translation используется для отображения текущих записей в таблице NAT на маршрутизаторе. Она показывает, какие частные IP-адреса были переведены в публичные и наоборот, а также информацию о типах трансляций (например, статическая или динамическая).

Inside local: Это локальный (частный) IP-адрес устройства внутри вашей сети, например, 192.168.1.2. это ваш локальный IP-адрес (например, компьютер в вашей сети).
Inside global: Это публичный IP-адрес, который используется для трансляции из вашей сети в интернет. Он виден снаружи, например, 215.215.215.20. это ваш публичный IP-адрес, который маршрутизатор использует для общения с интернетом.
Outside local: Это локальный адрес в удаленной сети, к которой вы подключаетесь, но на самом деле это может быть тот же адрес, что и «Outside global». это локальный адрес сервера или устройства в интернете.
Outside global: Это публичный IP-адрес удаленной сети или сервера в интернете, например, 134.25.25.30. это публичный адрес сервера или устройства в интернете.


Через время удаляются эти трансляции, и по умолчанию остаются эта таблица он означает что разрешается этому адрессу трансляция на 215.215.215.20.Время жизни этой таблицы можно настраивать
(clear ip nat tr — очистка таблицы)

Почему нужно менять время в нат трансляциях? Когда происходит NAT-трансляция, на маршрутизаторе открывается «дыра» в сети, через которую злоумышленники могут попытаться получить доступ к внутренним ресурсам. Поэтому важно контролировать время жизни этих трансляций и эффективно управлять их сроком, чтобы уменьшить риски безопасности.
При использовании статического NAT для каждого частного IP-адреса назначается один публичный IP-адрес. Это может быть проблемой, если в сети нужно больше публичных адресов, поскольку ограниченное количество IP-адресов быстро исчерпывается. Например, если на внутреннем сервере настроен статический NAT для IP 192.168.1.1, то только этот адрес будет использовать соответствующий публичный IP, и если потребуется подключить новый сервер, для него нужно будет настроить новый статический NAT.
При попытке пинговать публичный IP-адрес, который был переведен на 192.168.1.1, ответ будет поступать именно на этот адрес, так как статический NAT работает только для конкретных адресов и не решает проблему с нехваткой публичных IP.
Сейчас мы рассматриваем динамический NAT. Он работает следующим образом:
Динамический NAT позволяет нескольким частным IP-адресам использовать пул публичных IP-адресов. В отличие от статического NAT, где для каждого внутреннего адреса назначается один конкретный публичный IP-адрес, динамический NAT выбирает публичный IP-адрес из пула доступных адресов для каждого исходящего соединения.
Это решение помогает сэкономить количество публичных IP-адресов, позволяя нескольким устройствам из внутренней сети использовать один и тот же публичный IP-адрес при выходе в интернет, но каждый из них будет использовать уникальные порты для связи.
Пример:
В пуле есть 3 публичных IP-адреса.
Внутренняя сеть использует 10 частных IP-адресов.
Когда устройства из этой сети отправляют пакеты в интернет, маршрутизатор выбирает один из публичных адресов из пула для трансляции, и при этом каждому соединению присваивает уникальный порт.
Это решает проблему с нехваткой публичных IP-адресов и позволяет использовать ограниченное количество публичных адресов для большого числа устройств внутри сети.


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

Сделаем очистку и сейчас трансляция пуста. Таблица NAT пуста, потому что после выполнения команды clear ip nat tr * все текущие записи в таблице трансляций NAT были удалены. Это делается для того, чтобы очистить старые записи и начать новую трансляцию с чистой таблицей. Можно выбирать каким образом очистить, как видно можно очистить все, внешние внутренние и т.д

Когда выполняется трансляция, маршрутизатор отслеживает все исходящие и входящие соединения, записывая их в таблицу NAT. Но после очистки таблицы старые соединения больше не отображаются, и таблица становится пустой.
В данном примере, после очистки, таблица снова будет заполняться, когда начнется новая трансляция, а соединения с частных IP-адресов будут использовать доступные публичные IP-адреса для связи с интернетом.
У нас есть локальная сеть с несколькими устройствами (192.168.1.0/24), и мы хотим, чтобы эти устройства могли выходить в интернет, используя только один публичный IP-адрес.
Локальные IP-адреса: У нас есть несколько устройств в локальной сети, например, 192.168.1.2, 192.168.1.3.
Публичный IP-адрес: Мы имеем один публичный IP-адрес, например, 215.215.215.10.
Когда устройства из внутренней сети пытаются выйти в интернет, маршрутизатор с помощью динамического NAT переводит их локальные IP-адреса в этот публичный IP-адрес, используя различные порты для разных соединений. Таким образом, все устройства внутри локальной сети могут использовать один публичный IP-адрес для выхода в интернет, но их соединения будут иметь уникальные порты для отличия.
Динамический NAT позволяет множеству устройств внутри частной сети использовать один публичный IP-адрес для выхода в интернет. При этом для каждого соединения назначается уникальный порт. Например:
192.168.1.2 подключается к веб-сайту на порт 80, и его запрос преобразуется в 215.215.215.10:10001.
192.168.1.3 подключается к тому же веб-сайту на порт 443, и его запрос преобразуется в 215.215.215.10:10002.
Маршрутизатор использует эти порты, чтобы различать соединения и направлять ответы обратно на соответствующие устройства в сети. Это позволяет эффективно использовать один публичный IP для нескольких устройств.



Команда debugipnat позволяет наблюдать в реальном времени, что происходит при трансляции NAT, например, когда идет ICMP-запрос. В выводе видно, как локальные IP-адреса преобразуются в публичные. Чтобы отключить дебаг, используется команда undebugall. Включение дебага на реальном оборудовании может быть опасным, особенно если в сети нет HSRP (HotStandbyRouterProtocol) для резервного маршрутизатора. Это связано с тем, что дебагging может существенно нагрузить систему, особенно если сетевой трафик интенсивный. Без резервного маршрутизатора это может привести к временной недоступности сети.
Однако в лабораторных условиях или при тестировании в безопасной среде дебаг можно использовать без проблем, поскольку это не повлияет на реальную работу сети и позволяет детально изучить происходящие процессы, например, трансляцию NAT в реальном времени.

Мы рассмотрели два типа NAT: статический и динамический. Динамический NAT значительно решает проблему с исчерпанием публичных IP-адресов, однако он все равно не является идеальным решением, так как требует наличия пула публичных адресов. В реальной практике его использование ограничено, как и статического NAT.
Основное различие между ними заключается в следующем:
Статический NAT: для каждого частного IP-адреса назначается один публичный IP-адрес. Это решение подходит для случаев, когда необходимо, чтобы конкретные внутренние устройства всегда использовали один и тот же публичный IP-адрес.
Динамический NAT: создается пул публичных IP-адресов, из которого выбирается адрес для трансляции частных IP. Это позволяет нескольким устройствам использовать один публичный IP-адрес, но с разными портами для разных соединений.
Оба метода имеют свои ограничения, и в практике часто применяется NAT с перегрузкой (PAT), который позволяет эффективно использовать один публичный IP-адрес для множества устройств в локальной сети.
Следующий тип NAT, который мы рассмотрим, поможет решить проблему с исчерпанием публичных IP-адресов. Этот метод называется Перегруженный NAT (или PAT, NAPT, NAT Overload). В отличие от статического и динамического NAT, PAT позволяет выполнять трансляцию нескольких частных IP-адресов в один публичный, используя разные порты для каждого соединения.
Этот метод широко используется в реальных крупных компаниях и на предприятиях, так как позволяет эффективно использовать ограниченное количество публичных IP-адресов для множества устройств в локальной сети. PAT применяется не только в устройствах Cisco, но и в устройствах других производителей, так как это стандартная технология для оптимизации работы с IP-адресами в сетях с большим числом пользователей.
Конфигурация для NAT с перегрузкой (PAT)


Удаляем все текущие записи.
Конфигурируем роутер и все работает!


Мы выполняем сниффинг трафика на нашем маршрутизаторе и видим, как частный IP-адрес был преобразован в публичный. Наш сервер в ответном запросе reply отправляет данные на публичный IP-адрес 215.215.215.20, на который мы выполняем трансляцию.
Возникает вопрос: как роутер понимает, куда направить ответный трафик? Как он различает, к какому устройству внутри сети относится этот трафик, например, к 192.168.1.2 или 192.168.1.3? (P.S ICMP не использует порты, пример показан для наглядного понимание процесса)

Допустим, что мы устанавливаем TCP-сессию с сервером, и один компьютер использует порт 30012, а другой — 1234. Роутер записывает это в своей таблице NAT, и когда сервер отвечает, роутер понимает, что запросы с портом 30012 идут на 192.168.1.4, а с портом 1234 — на 192.168.1.5.
Но возникает вопрос: что если порты будут одинаковыми? Например, если два устройства используют порт 5 для UDP-сессии. В таком случае роутер столкнется с проблемой, потому что NAT не сможет различать два одинаковых порта.
Решение простое: роутер автоматически меняет внутренний порт на случайный, например, на 1024, и записывает это в таблице трансляций. Теперь роутер будет знать, что трафик с порта 1024 относится к 192.168.1.4, а трафик с порта 1025 — к 192.168.1.5.

Возникает еще один вопрос: если мы кидаем ping (ICMP Echo Request), как роутер будет различать Echo Request и Echo Reply? Ведь у ICMP нет портов, и как он понимает, куда отправлять ответ?
Здесь на помощь приходят sequence numbers (номера последовательностей), которые используются в ICMP-пакетах. Хотя ICMP не использует порты, как TCP или UDP, каждый ICMP Echo Request и Echo Reply имеют уникальные ID и sequence number, которые позволяют роутеру отслеживать запросы и ответы.
Когда роутер получает Echo Request от одного устройства, он сохраняет информацию о ID и sequence number в своей таблице NAT. Когда приходит Echo Reply от сервера, роутер использует эти значения для того, чтобы правильно направить ответ тому устройству, которое отправляло запрос, даже если они используют одинаковый публичный IP-адрес.
Таким образом, роутер отличает запрос и ответ по ID и sequencenumber, и отправляет EchoReply обратно на нужный частный IP-адрес, основываясь на сохраненных значениях.

Выполним сниффинг траффика и наглядно посмотрим на пакеты


ICMP — это протокол, который инкапсулируется в пакет IP. То есть ICMP является полезной нагрузкой (data) внутри IP-пакета, и он не использует порты, как TCP или UDP. ICMP работает на уровне Internet Layer модели OSI (уровень 3), и его сообщения, такие как Echo Request и Echo Reply, передаются внутри пакета IP.
Давайте поговорим о пробросе портов. Как выставить внутренний ресурс нашей локальной сети в интернет, чтобы к нему был доступ? Например, если мы развернем сервер в нашей организации, такой как веб-сервер, и кто-то из интернета захочет обратиться к этому серверу, как это будет происходить? У нас, например, есть корпоративная веб-страница или работает 1С, и мы хотим предоставить удалённым сотрудникам доступ к 1С через веб-клиент. Как им попасть?
Начнем с самого простого — пинга. Если мы пытаемся обратиться к частному IP-адресу, например, 192.168.1.4, у нас ничего не получится, потому что частные IP-адреса не маршрутизируются в интернет. Если же мы попробуем обратиться к нашему внешнему публичному IP-адресу, например, 215.215.215.20, то снова ничего не произойдёт. Это понятно. Пакет ICMP (эхо-запрос) направляется на этот IP-адрес, доходит до роутера, но роутер не знает, куда его направить дальше. Неясно, куда отправлять пакет. Это отличается от ситуации, когда, например, один узел пингует другой. В этом случае создается динамическая запись в таблице маршрутизации роутера.
Когда с нашего корпоративного компьютера отправляется пинг на удалённый сервер, маршрут проходит через роутер, и создаётся запись, которая открывает «дырку» в NAT. То есть роутер, используя эту запись, ожидает ответ от сервера. Такая запись временная, и через какое-то время она удаляется. Как работает PAT (Port Address Translation)? Он открывает двустороннюю связь только в случае, если соединение было инициировано из нашей локальной сети. Как только мы отправили хотя бы один пакет, NAT «открывает дырку» и ожидает соответствующего пакета. После этого эта «дыра» закрывается, и таким образом NAT обеспечивает некоторую степень безопасности. Это означает, что в нашу сеть невозможно будет пробиться, если инициатором подключения не была наша локальная сеть.
Однако на самом деле NAT не является механизмом безопасности. Такое поведение происходит не потому, что NAT специально защищает сеть, а просто так он устроен. Например, в IPv6 NAT вообще не нужен, и вся безопасность обеспечивается другими средствами, такими как фаерволы и дополнительные устройства. Если запись в NAT не используется, она исчезнет через тайм-аут, и если сервер попытается снова отправить пинг, записи уже не будет, и пройти в сеть он не сможет. Как же нам тогда добраться до этой сети? В таком случае нам нужно создать статическую запись, которая откроет «дырку», не закрывающуюся со временем. Эта запись будет висеть в таблице маршрутизации постоянно. Этот процесс называется пробросом портов. То есть мы сообщим NAT, что если он получает пакет на внешний IP-адрес 215.215.215.20 на порт 80, он должен пробросить его на внутренний IP-адрес 172.168.1.4. Как это делается? Всё это описано в инструкции.
Проброс портов

PAT с перегрузкой позволяет эффективно использовать ограниченное количество публичных IP-адресов для множества устройств в локальной сети. Это значительно сокращает потребность в публичных адресах.
Внимание! Если используется один публичный IP для всех устройств в локальной сети, это может привести к перегрузке трансляции и исчерпанию IP-адресов, особенно при высокой активности в сети. Нужно внимательно следить за состоянием пула IP-адресов.

Также можно использовать другой протокол или порт.


Если мы зайдем на веб-сервер через браузер, указав https://215.215.215.1:55, то откроется веб-сервер с IP 192.168.1.99. В этом случае, чтобы попасть на сервер из внешней сети, нужно обращаться не на стандартный 80-й порт, а на 55-й. Сервер или обычный компьютер должен будет указать в запросе внешний IP-адрес, добавив порт 55. И только тогда соединение будет установлено.
Хотя сервер слушает 80-й порт, NAT (сетевой адресный перевод) будет слушать 55-й порт и перенаправлять его на 80-й порт, обеспечивая доступ к серверу. Это полезно, особенно для маленьких организаций, где внешний доступ к серверу через RDP (Remote Desktop Protocol) происходит через нестандартный порт. Например, компьютер использует стандартный порт 3389, но в NAT настраивается другой порт. Для того чтобы подключиться к серверу удаленно, нужно указать этот нестандартный порт, как в нашем примере.
Таким образом, чтобы подключиться к веб-серверу, если мы вводим 192.168.1.4, то ничего не произойдёт, потому что NAT не слушает 80-й порт. 80-й порт слушает только сам сервер, а 55-й порт слушает NAT и перенаправляет его на 80-й, чтобы сервер открылся. Поэтому необходимо указывать 55-й порт. Если указать другой порт, соединение не будет установлено. Если у нас 2 сервера и 1 публичный адрес, то чтобы их настроить достаточно использовать другой порт.
Мы можем также использовать в качестве публичного IP адреса наш айпи интерфейса в таком случае мы используем эту команду. В реальных сетях обычно это и применяется особенно при использовании IPsec.


Если же необходимо пробросить большое количество портов, например, в случае с торрентами или IP-телефонией, статическая настройка NAT для каждого порта становится неудобной и небезопасной. В таких ситуациях можно рассмотреть использование DMZ (Demilitarized Zone).

Что такое DMZ?
DMZ — это специальная подсеть, которая изолирует внешние сервисы от основной локальной сети. Она позволяет предоставлять доступ к публичным сервисам, таким как веб-серверы или VoIP-сервисы, при этом обеспечивая безопасность, потому что эти сервисы не имеют прямого доступа к внутренним ресурсам.
Когда использовать DMZ?
Хостинг внешних сервисов: Веб-серверы, почтовые серверы и другие публичные сервисы, которые требуют доступа из интернета.
Обеспечение безопасности: Изоляция потенциально уязвимых серверов от основной локальной сети.
Управление динамическими портами: Приложения, такие как торренты и IP-телефония, которые требуют открытия множества портов.
По сути, DMZ — это отдельная зона, где все порты открыты для предоставления доступа к внешним сервисам. Сервисы, такие как веб-серверы или почтовые серверы, размещаются в этой зоне. Это означает, что если кто-то получит доступ к DMZ, он не сможет попасть в основную локальную сеть. Важно! Это не значит, что в DMZ всегда открыты все порты. Вы можете настроить и ограничить доступ, открывая только те порты, которые вам необходимы.
DMZ позволяет эффективно разделять публичные и приватные сети. Количество таких зон зависит от числа доступных публичных IP-адресов, которые у вас есть.

На самом деле DMZ представляет собой более сложную конфигурацию. Обычно в DMZ конечные пользователи не имеют доступа к серверу. То есть при правильной настройке DMZ зоны, пользователи не смогут подключиться к серверу, а сервер, находящийся в этой зоне, не сможет обратиться к пользователям. Зачем это нужно? Такая конфигурация помогает предотвратить ситуацию, когда злоумышленники, взломав сервер в DMZ, смогут использовать его для доступа к внутренней сети, в которой находятся другие серверы и устройства. Это достигается не через NAT, а с помощью Zone-Based Policy Firewall (ZPF). С помощью этого фаервола мы создаем правила, которые контролируют трафик между разными зонами. Такая настройка будет реализована при построении полноценной сети, которая будет имитировать работу реальной организации. В DMZ мы будем использовать NAT для проброса портов, а Zone-Based Policy Firewall будет ограничивать доступ как с внешней стороны, так и внутри сети, защищая наши внутренние ресурсы.

NVI NAT (Network Virtual Interface NAT) в IOS — это удобная технология, которая позволяет выполнять NAT как для исходящего, так и для входящего трафика, при этом не требуется разделение интерфейсов на inside и outside. Всё, что нужно — это использовать команду ip nat enable на интерфейсах, и NVI NAT будет автоматически заниматься трансляцией. Нет необходимости указывать ip nat inside или ip nat outside для интерфейсов, что упрощает настройку и управление.
Как работает NVI NAT? Когда пакеты проходят через интерфейсы с ip nat enable, они маркируются, и NAT определяет, какие из них нужно трансформировать. Дальше используется ip nat source для трансляции как исходящих, так и входящих адресов. Важно, что при этом нет различия между inside и outside, что добавляет гибкости. Также система отслеживает состояние соединений, чтобы правильно перенаправить ответные пакеты.


Как видим, всё работает. Спасибо всем, кто прочитал до конца. Если есть предложения или идеи, пишите.
© Javid CCNP