Содержание
- 1 Общее определение
- 2 Тип первый, Static NAT
- 3 Так в чем же дело в статике?
- 4 Схема работы статического NAT
- 5 Тип второй, Dynamic NAT
- 6 Недостаток и преимущества динамики
- 7 Тип третий, Port Address Translation (PAT), также известный как NAT Overload или NAT Masquerading
- 8 Еще немного про порты и другие нюансы
- 9 Немного деталей про порты
- 10 Преимущества и недостатки третьего варианта
- 11 Послесловие
Добрый день, коллеги! судя по многочисленным вопросам на форуме (ссылка в конце поста), от слушателей и коллег, работа NAT на маршрутизаторах Cisco (firewall’ы я опущу, достаточно подробно его работу расписал в своей серии статей про Cisco ASA) плохо описана, поэтому я попробую описать свой опыт и свое понимание данной технологии в большинстве ее ипостасей. Не претендую на всеобъемлющее описание и 100% точность, но кому интересно — велкам под кат. Итак, для структурности описания разберемся с определением, что такое NAT.Определение. NAT (Network Address Translation) — технология трансляции сетевых адресов, т.е. подмены адресов в заголовке IP-пакета (иногда может еще и порт менять в заголовках TCP/UDP, но об этом позже). Другими словами, пакет, проходя через маршрутизатор, может поменять свой адрес источника и/или назначения. Зачем это нужно? 1. Для обеспечения доступа из LAN, где чаще всего используются частные IP-адреса, в Internet, где маршрутизируются только глобальные IP-адреса. 2. (в меньшей степени) для сокрытия топологии сети и создания некоторого защитного барьера для проникновения внутрь сети (обсудим это позже на примере). NAT бывает разным 🙂 И хотя много по этому поводу уже написано, есть желание отправлять новичков с вопросами о NAT по конкретному адресу, поэтому я все же приведу некоторую классификацию. 1. Static NAT — статический NAT задает однозначное соответствие одного адреса другому. Иными словами, при прохождении через маршрутизатор, адрес(а) меняются на строго заданный адрес, один-к-одному. (к примеру 10.1.1.1 всегда заменяется на 11.1.1.1 и обратно, но никогда на 12.1.1.1). Запись о такой трансляции хранится неограниченно долго, пока есть строчка в конфиге. 2. Dynamic NAT — при прохождении через маршрутизатор, новый адрес выбирается динамически из некоторого куска адресов, называемого пулом (англ. pool). Запись о трансляции хранится некоторое время, чтобы ответные пакеты могли быть доставлены адресату. Если в течение некоторого времени трафик по этой трансляции отсутствует, трансляция удаляется и адрес возвращается в пул. Если требуется создать трансляцию, а свободных адресов в пуле нет, то пакет отбрасывается. Иными словами, хорошо бы, чтобы число внутренних адресов было ненамного больше числа адресов в пуле, иначе высока вероятность проблем с доступом наружу. 3. Dynamic NAT with overload или PAT. Работает почти также, как dynamic NAT, но при этом происходит трансляция много-в-один, задействуя при этом возможности транспортного уровня. Об этом подробнее на примере дальше. Поскольку я чаще всего работаю именно с железом Cisco, я опишу в статье именно особенности работы и возможные варианты NAT именно на этих железках. Давайте посмотрим, что у нас есть в этом случае.
1. inside source NAT
Самый распространенный и достаточно простой вариант. Допустим у нас есть такая топология: Другими словами, а) подсеть внутренних адресов — 10.0.0.0/8 б) подсеть внешних адресов — 11.0.0.0/8 и мы хотим транслировать каким-то образом внутренние адреса во внешние при прохождении трафика через маршрутизатор.
Что для этого нужно?
1. Мы явно указываем, что мы хотим транслировать. Т.е. какой трафик и от каких хостов. 2. Мы явно указываем, во что мы хотим траслировать, т.е. пул внешних адресов (или единственный адрес для статической трансляции).3. Помечаем внутренний и внешний интерфейс. 4. Включаем трансляцию. На п.3 я себе позволю остановиться подробнее, потому что именно здесь часто происходит непонимание.
Как это работает?
Итак, допустим мы решили, что будем транслировать всю 10ю сеть целиком в 11ю. Задали их соответствующим образом (настройки потом, сначала теория). И пометили наши интерфейсы как внутренний (inside) и внешний (outside). Теперь, давайте разберемся, что делает именно inside source NAT. На самом деле, в названии зашита половина действия 🙂 а именно: у пакета, пришедшего на inside интерфейс меняется source :). Но помните, мы говорили о том, что ответные пакеты должны доходить до нашего внутреннего хоста? Отсюда вторая половина действия: у пакета, пришедшего на outside интерфейс меняется destination. Рассмотрим прямую трансляцию. 1. Трафик, приходя на интерфейс, помеченный как inside, если он соответствует тому, что мы хотим транслировать, маркируется как возможно_транслируемый. Часто полагают, что в этот момент происходит трансляция, но это не так. 2. Следующим этапом, трафик подвеграется маршрутизации (PBR и обычной). И если при этом трафик направляется на интерфейс, помеченный как outside — только тогда происходит трансляция. Если трансляция динамическая, маршрутизатор проверяет ее наличие в таблице трансляций. Если ее там нет — создает, если уже есть — обнуляет счетчик неактивности. Если же пакет попадает на выход на интерфейс, не помеченный как outside — трансляция НЕ происходит. Теперь обратная трансляция. 1. Трафик, попадая на outside интерфейс, в противовес прямой трансляции, сначала подвергается NAT. Если трансляция существует (неважно, динамическая или статическая), в случае с inside source NAT, у него меняется destination. И только после этого трафик подвергается маршрутизации и перенаправляется по назначению. Поэтому маркировать интерфейсы как inside или outside нужно именно принимая во внимание механизм работы.Замечания и следствия. 1. Для обратной трансляции не обязательно наличие метки inside на каком-либо интерфейсе. Все равно, если прямая трансляция существует, обратная трансляция сработает до маршрутизации. Но когда будет существовать такая трансляция, ведь мы обсуждали, что трафик должен пройти через inside интерфейс для создания прямой трансляции? Отсюда 2. Трафик самого роутера подвергается трансляции, если он попадает на интерфейс, помеченный как outside и удовлетворяет правилу NAT. И это сколь полезно, столь и опасно. С одной стороны, мы можем транслировать трафик роутера как и любой другой. С другой стороны, многие хотят описать трафик, подлежащий трансляции как permit any, но тогда и, например, пакеты протоколов маршрутизации будут транслироваться, что приведет к сбою. 3. Интерфейсы типа loopback маршрутизатора трактуются как и любые другие, мы можем метить их как inside или outside, заворачивать на них трафик и получать от этого профит 🙂 Теперь посмотрим общую конфигурацию, а потом еще несколько частных случаев.
Конфигурация inside source NAT
inside source dynamic NAT
1. Указываем, что транслировать. Для этого создаем access-list, перечисляющий трафик. Например, в нашем случае достаточно одной строчки:(config)# access-list 100 permit ip 10.0.0.0 0.255.255.255 any
Замечание. В ACL могут встречаться строчки deny. Вопреки распространенному заблуждению, трафик удовлетворяющей данной строчке не дропается, а просто не подвеграется трансляции. Так же, ACL может быть стандартным и расширенным, нумерованным и именованным. 2. Создаем пул из адресов, указывая стартовый и конечный адрес. Например так:(config)# ip nat pool NAME_OF_POOL 11.1.1.10 11.1.1.20 netmask 255.255.255.0
Замечания. 1. Стартовый и конечный адрес в пуле могут совпадать, тогда трансляция будет в 1 адрес. 2. Опция netmask, хотя и является обязательной, по моему мнению — рудимент. Она позволяет вырезать из диапазона адресов в пуле те адреса, которые являются адресами подсети или бродкастными при данной маске. 3. Маркируем интерфейсы. В нашем случае достаточно(config)# interface fa 0/0 (config-if)# ip nat inside
и (config)# interface fa 0/1 (config-if)# ip nat outside
4. создаем собственно трансляцию: ip nat inside source list 100 pool NAME_OF_POOL
вуаля 🙂 Если мы теперь обратимся например с хоста 10.1.1.1 к хосту 11.1.1.2, то получим такую трансляцию:Router#sh ip nat translations Pro Inside global Inside local Outside local Outside global tcp 11.1.1.10:55209 10.0.1.1:55209 11.1.1.2:23 11.1.1.2:23
Интересно, что хотя в таблице явно записаны source port и destination port, трансляция создается целиком для адреса. И на время ее жизни в таблице трансляция, пакеты снаружи могут проходить на внешний адрес (inside global) Например, пинг с некоторого адреса во внешней сети на наш inside global будет успешным (на время жизни трансляции):R4#ping 11.1.1.10 Type escape sequence to abort. Sending 5, 100-byte ICMP Echos to 11.1.1.10, timeout is 2 seconds: !!!!!
Иными словами, открывается трансляция единожды и к некоторому хосту, после этого некоторое время действует для любого адреса извне.
inside source dynamic NAT with overload
П. 1,2 и 3 — как в предыдущем разделе. 4. Создаем собственно трансляцию: ip nat inside source list 100 pool NAME_OF_POOL overload
Видим, что добавилось всего одно слово: overload. Но оно существенно изменило схему работы трансляции. Как было сказано, PAT — это трансляция много-в-мало или даже много-в-один. Но чтобы можно было отличить трафик одного соединения от другого, маршрутизатор будет менять не только IP-адреса, но еще и TCP/UDP порты.Замечание. Схема работы с портами (когда меняется source, когда destination) — такая же, как и схема работы с IP-адресами. Другими словами, при обращении изнутри наружу меняется source IP и source port, запись об этом вносится в таблицу трансляций. При обратной трансляции — все меняется наоборот. Посмотрим, что изменилось:R3#sh ip nat translations Pro Inside global Inside local Outside local Outside global tcp 11.1.1.11:21545 10.0.1.1:21545 11.1.1.2:23 11.1.1.2:23 tcp 11.1.1.11:49000 10.0.2.1:49000 11.1.1.2:23 11.1.1.2:23
Видим, что разные внутренние адреса (10.0.1.1 и 10.0.2.1) странслировались в один внешний (11.1.1.11). Замечания. 1. Кажется, что source-port не был изменен, как обещали, непорядок :). На деле, маршрутизатор пытается сохранить source port всеми доступными средствами. В частности, если порт inside global адреса уже был занят, он возьмет следующий адрес в пуле и проверит его порт на занятость. И только не найдя адреса со свободным портом возьмет следующий свободный. 2. Поведение такой трансляции отличается от поведения обычного dynamic NAT еще и тем, что доступ снаружи на inside global адрес невозможен. Именно это я имел ввиду, когда говорил о некоторой повышенной безопасности при использовании PAT, т.к. фактически все соединения инициируются изнутри нашей сети, а снаружи нам могут приходить только ответы на них. 3. Если мы получили у провайдера не целый блок адресов, а один несчастный адрес, который тут же и назначили внешнему интерфейсу маршрутизатора, можно не городить огород с пулом в один адрес, а сразу писать например так:(config)# ip nat inside source list 100 interface fa0/1 overload
inside source static NAT and PAT
Много упоминалось о статических трансляциях, давайте наконец их обсудим.Зачем это нужно? Мы обсудили, что если в случае dynamic NAT трансляция не создана и в случае PAT, доступ извне невозможен. Если даже в случае dynamic NAT трансляция создана, то inside global адрес может меняться. И обращаться к нашему внутреннему хосту по какому-то внешнему адресу невозможно. Тем не менее, нередки ситуации, когда внутри корпоративной сети есть сервер, доступ которому извне по статическому внешнему адресу жизненно необходим. В таком случае, можно выставить его прямиком в Интернет, назначив глобальный адрес. Но часто это не очень удобно, например по соображениям безопасности. И в таких случаях нам на помощь приходит static NAT. Он создает двустороннюю и постоянную трансляцию. Так что наш хост всегда будет доступен по одному внешнему адресу и эта трансляция никогда не вылетит из таблицы трансляций по таймауту.собственно настройка. Сразу создаем трансляцию:(config)# ip nat inside source static 10.0.1.1 11.1.1.21
Маркируем интерфейсы и вуаля!R3#sh ip nat translations Pro Inside global Inside local Outside local Outside global icmp 11.1.1.21:14 10.0.1.1:14 11.1.1.2:14 11.1.1.2:14 --- 11.1.1.21 10.0.1.1 --- ---
Как видим, появилось две записи — одна постоянная, другая (чисто информативная) — временная, вызванная трафиком изнутри наружу.Замечание. Появление таких информативных записей можно отключить командой(config)# no ip nat create flow-entries
Идем дальше. Часто бывает, что нужно выставить наружу не целый адрес, а только один порт (например 80й для www-сервера). Никаких проблем, можно создать и статическую PAT-трансляцию для некоторых портов:(config)# ip nat inside source static tcp 10.0.1.1 80 11.1.1.21 80 (config)# ip nat inside source static udp 10.0.1.1 5060 11.1.1.21 7877
Видим, что порты одного и того же внешнего адреса можно пробрасывать на разные порты внутренних, и управлять трансляцией портов при этом тоже возможен. В заключение добавлю, что изменять различные таймауты для NAT можно командойRouter(config)#ip nat translation ? arp-ping-timeout Specify timeout for WLAN-NAT ARP-Ping dns-timeout Specify timeout for NAT DNS flows finrst-timeout Specify timeout for NAT TCP flows after a FIN or RST icmp-timeout Specify timeout for NAT ICMP flows max-entries Specify maximum number of NAT entries port-timeout Specify timeout for NAT TCP/UDP port specific flows pptp-timeout Specify timeout for NAT PPTP flows routemap-entry-timeout Specify timeout for routemap created half entry syn-timeout Specify timeout for NAT TCP flows after a SYN and no further data tcp-timeout Specify timeout for NAT TCP flows timeout Specify timeout for dynamic NAT translations udp-timeout Specify timeout for NAT UDP flows
Объемистая статейка получилась, придется разбить на несколько частей. Конечно inside source NAT многократно обсужден и расписан, но надеюсь, что даже не совсем новичкам удастся найти в статье что-то полезное. Надо было начать с некоторой базы, пусть и общеизвестной. В следующей статье мы обсудим inside destination NAT, если конечно статья найдет отклик и поддержку. С уважением, Подкопаев Илья P.S. Я открыт для пожеланий по улучшению статьи и исправлению неточностей/ошибок. P.P.S. Ссылки: 1. форум сайта anticisco.ru 2. Cisco NAT order of operations
NAT (Network address translation) – технология трансляции сетевых адресов. Технология NAT позволила решить наибольшую проблему протокола IPv4: к середине 1990-х годов пространство IPv4-адресов могло быть полностью исчерпано. Если бы технологию NAT не изобрели то, рост Интернета значительно замедлился бы. Конечно, на сегодня создана новая версия протокола IP – IPv6. Данная версия поддерживает огромное количество IP-адресов, что существование NAT – бессмысленно. Однако, до сих пор довольно много организаций используют в своей работе протокол IPv4 и полный переход на IPv6 состоится не скоро. Поэтому есть смысл изучить технологию NAT.
Трансляция сетевых адресов NAT позволяет хосту, не имеющего “белого IP”, осуществлять связь с другими хостами через Интернет. Белый IP-адрес представляет из себя зарегистрированный, уникальный, глобальный IP-адрес в сети Интернет. Есть также “серые IP-адреса”, которые используются в частной сети и не маршрутизируются в сети Интернет. Поэтому необходима технология NAT, которая будет подменять серый IP-адрес на белый. Диапазон “серых IP-адресов” представлен в таблице.
Трансляция NAT заменяет частные IP-адреса открытыми зарегистрированными IP-адресами в каждом пакете протокола IP.
Осуществляя трансляцию NAT, маршрутизатор изменяет IP-адрес отправителя в тот момент, когда пакет покидает частную сеть. Маршрутизатор также изменяет адрес получателя каждого пакета, который возвращается в частную сеть. Программное обеспечение Cisco IOS поддерживает несколько разновидностей трансляции NAT:
- Статическая трансляция NAT – каждому частному IP-адресу соответствует один публичный IP. При использовании статической трансляции маршрутизатор NAT просто устанавливает взаимно однозначное соответствие между частным и зарегистрированным IP-адресом, от имени которого он выступает.
- Динамическая трансляция NAT – преобразование внутренних Ip-адресов во внешние происходит динамически. Создается пул возможных публичных IP-адресов и из этого пула динамически выбираются Ip-адреса для преобразования.
- Трансляция адресов портов PAT – позволяет выполнить масштабирование для поддержки многих клиентов с использованием всего лишь нескольких открытых IP-адресов. PAT транслирует сетевой адрес в зависимости от TCP/UDP-порта получателя.
Рассмотрим более подробно каждый из видов трансляции.
Статическая трансляция NAT делает точное соответствие между частным и публичным Ip-адресом. Рассмотрим на примере.
Провайдер ISP компании назначает ей зарегистрированный номер сети 200.1.1.0. Соответственно маршрутизатор NAT должен сделать так, чтобы этот частный адрес выглядел таким образом, как если бы находился в сети 200.1.1.0. Для этого маршрутизатор изменяет IP-адрес отправителя в пакетах, которые как на рисунке пересылаются слева направо. В данном примере маршрутизатор изменяет частный Ip-адрес 10.1.1.1 на открытый 200.1.1.1. Другому частному адресу 10.1.1.2 соответствует публичный 200.1.1.2. Далее рассмотрим настройку статического NAT в Cisco.
Настройка статической трансляции NAT на оборудовании Cisco по сравнению с другими ее вариантами требует наименьших действий. При этом нужно установить соответствие между локальными (частными) и глобальными (открытыми) IP-адресами. Кроме того, необходимо указать маршрутизатору, на каких интерфейсах следует использовать трансляцию NAT, поскольку она может быть включена не на всех интерфейсах. В частности, маршрутизатору нужно указать каждый интерфейс и является ли он внутренним или внешним.
На схеме видно, что пользователь получил от провайдера адрес 100.0.0.0 сети класса C. Вся эта сеть с маской 255.255.255.0 настроена на последовательном канале между пользователем и Интернетом. Поскольку это двухточечный канал, в данной сети используется только 2 из 254 действительных (возможных) IP-адресов.
Конфигурация для роутера NAT_GW:
NAT_GW>enable - переходим в расширенный режим NAT_GW#configure terminal - переходим в режим конфигурации NAT_GW(config)#interface fa0/0 - настройка интерфейса в сторону частной сети NAT_GW(config-if)#description LAN - описание интерфейса NAT_GW(config-if)#ip address 192.168.1.1 255.255.255.0 - задаем шлюз по-умолчанию NAT_GW(config-if)#no shutdown - включаем интерфейс физически NAT_GW(config-if)#ip nat inside - настраиваем интерфейс как внутренний NAT_GW(config-if)#exit NAT_GW(config)#interface fa0/1 - настройки интерфейса в сторону провайдера NAT_GW(config-if)#description ISP - описание интерфейса NAT_GW(config-if)#ip address 100.0.0.253 255.255.255.0 - задаем Ip и маску NAT_GW(config-if)#no shutdown - включаем интерфейс физически NAT_GW(config-if)#ip nat outside - настраиваем интерфейс как внешний NAT_GW(config-if)#exit NAT_GW(config)#ip nat inside source static 192.168.1.2 100.0.0.1 - статическое сопоставление адресов NAT_GW(config)#ip nat inside source static 192.168.1.3 100.0.0.2 - статическое сопоставление адресов NAT_GW(config)#ip nat inside source static 192.168.1.4 100.0.0.3 - статическое сопоставление адресов NAT_GW(config)#ip route 0.0.0.0 0.0.0.0 100.0.0.254 - статический маршрут в сторону провайдера
Статические соответствия создаются с помощью команды ip nat inside source static. Ключевое слово inside означает, что NAT транслирует адреса для хостов, находящихся во внутренней части сети. Ключевое слово source означает, что NAT транслирует IP-адреса в пакетах, поступающих на ее внутренние интерфейсы. Ключевое слово static означает, что эти параметры определяют статическую запись, которая никогда не удалится из таблицы NAT в связи с истечением периода времени. При создании записей статической трансляции NAT маршрутизатору необходимо знать, какие интерфейсы являются внутренними (inside), а какие внешними (outside). Подкоманды интерфейса ip nat inside и ip nat outside соответствующим образом идентифицируют каждый интерфейс.
Для просмотра важной информации о NAT существует две команды show ip nat translations, show ip nat statistics.
Первая команда выводит три записи статической трансляции NAT, созданной в конфигурации. Вторая команда выводит статистическую информацию, такую, как количество активных в данный момент записей в таблице трансляции. Эта статистика также включает в себя количество повторных попаданий (hit), которое увеличивается на единицу с каждым пакетом, для которого NAT должна транслировать адреса.
Перейдем далее к динамической трансляции сетевых адресов NAT. Динамическая трансляция создает пул возможных глобальных внутренних адресов и определяет критерий соответствия для определения того, какие внутренние глобальные IP-адреса должны транслироваться с помощью NAT. Например, в схеме ниже был установлен пул из пяти глобальных IP-адресов в диапазоне 200.1.1.1 – 200.1.1.5. Трансляция NAT также настроена для преобразования всех внутренних локальных адресов, которые начинаются с октетов 10.1.1
При настройке динамической трансляции NAT на оборудовании Cisco по-прежнему требуется идентификация каждого интерфейса как внутреннего, так и внешнего, но уже не нужно задавать статическое соответствие. Для указания частных IP-адресов, подлежащих трансляции, динамическая трансляция NAT использует списки управления доступом ACL (про них я писал ранее), а также определяет пул зарегистрированных открытых IP-адресов, которые будут выделяться из этого. Итак, алгоритм настройки динамической трансляции:
- Настроить интерфейсы, которые будут находится во внутренней подсети, с помощью команды ip nat inside.
- Настроить интерфейсы, которые будут находится во внешней подсети, с помощью команды ip nat outside.
- Настроить список ACL, соответствующий пакетам, поступающим на внутренние интерфейсы, для которых должна быть применена трансляция NAT
- Настроить пул открытых зарегистрированных IP-адресов с помощью команды режима глобального конфигурирования ip nat pool имя первый-адрес последний-адрес netmask маска-подсети.
- Включить динамическую трансляцию NAT, указав в команде глобального конфигурирования ip nat inside source list номер-acl pool имя-пула
Схема будет использоваться такая же как и в прошлый раз. Новая конфигурация для роутера NAT_GW:
NAT_GW>enable - переходим в расширенный режим NAT_GW#configure terminal - переходим в режим конфигурации NAT_GW(config)#interface fa0/0 - настройка интерфейса в сторону частной сети NAT_GW(config-if)#description LAN - описание интерфейса NAT_GW(config-if)#ip address 192.168.1.1 255.255.255.0 - задаем шлюз по-умолчанию NAT_GW(config-if)#no shutdown - включаем интерфейс физически NAT_GW(config-if)#ip nat inside - настраиваем интерфейс как внутренний NAT_GW(config-if)#exit NAT_GW(config)#interface fa0/1 - настройки интерфейса в сторону провайдера NAT_GW(config-if)#description ISP - описание интерфейса NAT_GW(config-if)#ip address 100.0.0.253 255.255.255.0 - задаем Ip и маску NAT_GW(config-if)#no shutdown - включаем интерфейс физически NAT_GW(config-if)#ip nat outside - настраиваем интерфейс как внешний NAT_GW(config-if)#exit NAT_GW(config)#ip nat pool testPool 100.0.0.1 100.0.0.252 netmask 255.255.255.0- создаем динамический пул NAT_GW(config)#access-list 1 permit 192.168.1.1 0.0.0.255 - создаем список доступа 1, в котором разрешаем транслировать Ip-адреса из подсети 192.168.1.1/24 NAT_GW(config)#ip nat inside source list 1 pool testPool - включаем динамическую трансляцию NAT_GW(config)#ip route 0.0.0.0 0.0.0.0 100.0.0.254 - статический маршрут в сторону провайдера
Следующий вид трансляции – трансляция адресов портов PAT (Port Address Translation). Про этот вид NAT я расскажу в следующей статье, когда мы будем подключать локальную подсеть к Интернету. Тема довольно большая и важная. PAT является наиболее популярным видом NAT’a.
Доброго времени суток, дорогие читатели! Ну, что давайте про NAT.
Сегодня затронем подробнее тему несколько болезненную и довольно непонятную, но более непонятную, чем болезненную.
В большей степени эта проблема касается тех, кто играет в многопользовательские игры и коротко эта проблема звучит примерно так: «ПОЧЕМУ КО МНЕ НИКТО НЕ ЗАХОДИТ?». Для других эта проблема выглядит несколько иначе, а именно:
- Почему не качает торрент?
- Почему пользователи/друзья/знакомые/неизвестные личности не могут подключиться к FTP, WEB, VOIP (TS, Mamble, ведро) и прочим серверам, которые вы так долго пытались настроить и даже проверяли что у вас все работает?
- Почему ваш личный домашний сервер пустует? Может это вселенский заговор?
Но, однако, нет никакого заговора, виновник всех этих бед находится рядом с вами и хитро подмигивает вам лампочками, а зовут его… роутер, да-да, тот самый, который раздает вам интернет на все ваши (и может быть соседские) девайсы.
Если коротко, то пользователи из интернета просто не могут к вам подключиться, потому что ваш роутер их не пускает, но он делает это не просто из прихоти, а потому, что не знает о том, что все эти люди хотят подключиться именно к вам. Вот он и думает, что они что-то хотят от него самого.
Да, только что я вам обрисовал для чего нужен NAT. А теперь о том, что это такое.
Содержание:
Общее определение
NAT (Network Address Translation) — это такой механизм, который позволяет роутеру определять какие сервисы находятся за роутером и должны быть доступны из интернета, чтобы пользователи оттуда могли этими сервисами пользоваться (определение из вики я брать не стал, т.к. оно заумное и не всем понятное).
NAT присутствует во всех роутерах и серверных операционках в том или ином виде. В роутерах это обычно называется port forwarding, в линуксах iptables, на виндовых серверах — в специальной оснастке. А теперь давайте поговорим о различных типах NAT.
Тип первый, Static NAT
Static NAT не требуется для дома, а нужен в том случае, если провайдер выделил несколько IP адресов (внешние или «белые» адреса) вашей компании, и вам нужно, чтобы некоторые серверы всегда были видны из интернета, при этом их адреса бы не менялись.
Т.е. происходит преобразование адресов 1-1 (один внешний IP назначается одному внутреннему серверу). При такой настройке ваши серверы всегда будут доступны из интернета на любом порту.
Кстати говоря о портах, попробую несколько углубиться в эту тему, но не слишком сильно. Дело в том, что любой сервис, любая программа обращается к компьютеру, серверу, роутеру или сервису (будь то почта, веб-страничка или любой другой сервис) не только по IP адресу, но и по порту. Например, чтобы вам открыть страничку google.com со своего компьютера, вам надо ввести две вещи: IP адрес (DNS имя) и.. порт.
Но постойте, возмутитесь вы, ведь никакого порта вы не вводите и все отлично открывается!
Так в чем же дело в статике?
Дело в том, что, нет, в DNS записи порт не прячется, как некоторые могли бы подумать, этот самый порт ваш браузер сам подставляет в адресную строку вместо вас. Вы можете легко это проверить. Введите в адресной строке google.com:80 и увидите, что страничка гугла открылась, но волшебные «:80» внезапно исчезли.
Так вот, чтобы пользователям из интернета вас видеть и иметь возможность к вам подключаться, они должны знать две вещи: ваш IP адрес и ваш порт, на котором расположен ваш сервис.
При статическом NAT вам будет фиолетово какой порт использует сервер или программа, т.к. сервер становится полностью доступен из интернета. Чтобы уже ограничить используемые порты, настраивается на этом сервере межсетевой экран.
Если провести параллель, то IP адрес — это адрес вашего дома, а порт — это номер вашей квартиры. Таким образом, чтобы люди могли к вам попасть, им нужно знать эти две вещи, иначе они вас просто не найдут.
Схема работы статического NAT
Попробую рассказать о схеме работы статического NAT.
Например, провайдер выдал вам четыре IP адреса 87.123.41.11, 87.123.41.12, 87.123.41.13, 87.123.41.14, а у вас есть три сервера и роутер. Вы назначаете роутеру, например, первый адрес из этого диапазона (87.123.41.11), а остальные делите между серверами (сервер 1 — .12, сервер 2 — .13, сервер 3 — .14).
Чтобы пользователи из интернета могли подключаться на эти серверы, им достаточно будет ввести внешние IP адреса серверов. Например, когда пользователь подключается на адрес 87.123.41.12, то роутер перенаправляет его на сервер 1 и пользователь уже общается с сервером, хотя не знает что реальный адрес сервера на самом деле другой (192.168.1.2). Такая запись в NAT таблице роутера будет храниться всегда.
Преимущества данного способа:
- реальные адреса серверов будут скрыты;
- Ваши серверы всегда будут видны в интернете.
Недостатки:
- Злоумышленники могут на них попытаться пробиться или осуществлять какие-нибудь атаки;
- Требуется несколько внешних адресов, что может быть затратно.
Тип второй, Dynamic NAT
Динамический NAT отличается от статического немногим. Он используется почти также, но с тем лишь исключением, что ваши сервера не видны из интернета, но самим серверам этот интернет нужен. Суть его в том, что вам также выдаются несколько внешних IP адресов от провайдера, после чего роутер сам распределяет адреса между «нуждающимися».
Т.е. как только сервер или компьютер захотел выйти в интернет, роутер смотрит на свой список внешних адресов, выданных провайдером, и выдает один адрес из этого списка, при этом помечает что вот он выдал такой-то внешний адрес такому-то серверу или компьютеру (таблица NAT).
При этом срок жизни такой записи длится очень короткое время и как только сервер/компьютер перестал требовать доступ в интернет, этот адрес удаляется из таблицы NAT роутера.
Существенный недостаток в том, что количество серверов и компьютеров, которым требуется доступ в интернет, не должен сильно превышать кол-во выданных провайдером внешних адресов.
Недостаток и преимущества динамики
Ведь как только у роутера закончатся адреса в списке, он не сможет пустить новые компьютеры или серверы в интернет, пока не освободится хотя бы один внешний адрес.
В данном примере провайдер выдал нам всего два внешних адреса: 87.123.41.11 и 87.123.41.12. В этом случае мы IP 87.123.41.11 назначаем роутеру, а оставшийся адрес будет автоматически отдаваться тому серверу, который первым попросит доступ в интернет (в данном примере это был сервер 2), остальные серверы будут ждать, когда первый закончит и этот IP адрес освободится.
Преимущества данного способа:
- Всякие злоумышленники не смогут определить по каким адресам доступны ваши серверы, т.к. их адреса будут все время меняться;
- Не нужно вручную назначать IP адреса, роутер сам распределит.
Недостатки:
- Требуется несколько внешних адресов;
- Кол-во хостов в вашей сети не должно быть сильно больше, чем выданных провайдером IP адресов.
Тип третий, Port Address Translation (PAT), также известный как NAT Overload или NAT Masquerading
Это именно то, что актуально для обычного рядового пользователя. Суть данного метода в том, что вам провайдер выдает только один внешний адрес (например 87.123.41.12), при этом вы каждому компьютеру или серверу назначаете какой-нибудь порт.
Например, нам нужно, чтобы пользователи из интернета могли подключаться к торрент-клиенту на ПК 1 и 2, к серверу Teamspeak на сервере 1, серверу FTP на сервере 2, веб-сайту на сервере 3 (по протоколу http и https), плюс ко всему на ПК 1 и 2 нужен будет удаленный доступ. Теперь затронем немного тему внутренних и внешних портов (да, такое тоже есть).
Внутренний порт — это порт, который использует программа на том компьютере или сервере, на котором находится. Внешний порт — это порт, который вы хотите открыть на роутере, чтобы на него подключались пользователи. Часто внутренний и внешний порты совпадают, но далеко не всегда.
Еще немного про порты и другие нюансы
Многие программы (не только лишь все) имеют вшитые порты без возможности перенастройки, либо, к примеру, у вас есть два Веб-сервера на винде (так называемый IIS), которые работают на 80 порту каждый и вам нужно дать доступ из интернета на оба сервера.
Здесь вы откроете на роутере одному серверу порт 80, а оставшемуся вам придется выбрать другой порт (например 8080).
Итого, на роутере мы настраиваем порты таким образом:
Имя | Приложение | Внутренний IP | Внутренний порт | Внешний IP | Внешний порт |
Сервер 1 | Teamspeak | 192.168.1.2 | 9987* | 87.123.41.12 | 9987 |
Сервер 2 | FTP сервер | 192.168.1.3 | 21* | 87.123.41.12 | 21000 |
Сервер 3 | Веб-сервер | 192.168.1.4 | 80* | 87.123.41.12 | 80 |
Сервер 3 | Веб-сервер | 192.168.1.4 | 443* | 87.123.41.12 | 444 |
ПК 1 | uTorrent | 192.168.1.10 | 26000 | 87.123.41.12 | 26000 |
ПК 2 | Bit-Torrent | 192.168.1.20 | 26100 | 87.123.41.12 | 26100 |
ПК 2 | Game Server | 192.168.1.20 | 27015* | 87.123.41.12 | 27015 |
ПК 1 | RDP | 192.168.1.10 | 3389** | 87.123.41.12 | 33891 |
ПК 2 | RDP | 192.168.1.20 | 3389** | 87.123.41.12 | 33892 |
Где * — стандартный порт, который использует программа (т.е. вы ее установили и ничего не настраивали);
** — стандартный порт, который использует сервис и который нельзя сменить.
Наглядная схемка ниже:
Теперь я постараюсь объяснить почему я написал именно эти порты.
Немного деталей про порты
Суть:
- Для сервера Teamspeak (TS) я порт не менял, т.к. такой сервер у нас один и пользователям не придется вообще вводить его порт. Они просто вбивают у себя адрес 87.123.41.12 и попадают на наш сервер TS, удобно и практично;
- Для FTP сервера я порт поменял, т.к., строго говоря, FTP-сервер не должен быть доступен по стандартному порту, на него могут лазить недобросовестные люди. А так вы говорите тем, кому надо, чтобы подключались на 87.123.41.12:21000 и они попадут на ваш FTP-сервер;
- Для Веб-сервера я http порт не менял опять же из-за удобства, чтобы пользователям не надо было вводить адрес вместе с портом в адресной строке. Они просто вводят 87.123.41.12 и подключаются на ваш Веб-сервер. Порт HTTPS же я поменял для наглядности. Пользователям, чтобы попасть на ваш Веб-сервер по защищенному каналу, придется вводить в адресной строке адрес 87.123.41.12:444;
- С торрентами в общем-то все просто, какой порт настроен в самой программе, такой и настраивается на роутере;
- Порт игрового сервера, где в качестве примера я взял обычный стимовский игровой сервер (Dedicated Server), я также не менял, а оставил стандартный;
- А вот с RDP ситуация интересная. Дело в том, что на каждом компьютере служба RDP работает по порту 3389 и это никак не поменять без своего RDP сервера (такие тоже бывают). Поэтому, чтобы иметь возможность подключаться на ПК 1 и 2 я задал на роутере порты 33891 и соотв. 33892, ибо так проще помнить где какой используется. Таким образом, введя в RDP клиенте адрес 87.123.41.12:33891 мы попадем на ПК 1, а введя 87.123.41.12:33892 мы соотв. попадем на ПК 2.
Подытожив все это получаем, что удаленным пользователям всеравно какие у нас внутренние порты, они о них не знают и знать не могут. Эта информация нужна только нашему роутеру, чтобы он мог пересылать запросы туда, куда они и должны попадать.
Преимущества и недостатки третьего варианта
Теоретически, вы можете назначить одному IP адресу до 131072 (2 * 2^16) приложений. Почему я говорю «приложений», а не компьютеров/серверов?
Потому что один комп или сервер, как вы уже заметили выше, может использовать несколько различных приложений (при этом одно приложение может использовать несколько портов), при этом каждый порт может быть двух типов: TCP и UDP.
Углубляться в это в рамках этой статьи я не буду, в этом нет необходимости.
Для любой программы есть хелп, в котором написано какие порты ей нужны для работы, если их нельзя сменить. Многие приложения позволяют вам самим назначить какие порты какого типа использовать, таким образом упрощая вашу задачу. Для остальных же есть такой замечательный ресурс, как portforward.com.
- Преимущество такого метода в том, что вы открываете доступ из интернета именно для определенной программы на определенном компьютере/сервере, все остальные порты компьютера/сервера остаются закрытыми;
- Недостаток в том, что требуется все порты открывать вручную (иногда программы делают это за вас при помощи технологии UPnP, но такое бывает не всегда).
Послесловие
Получилось несколько сумбурно, да и тема довольно непростая, но надеюсь теперь при слове NAT вас не будет бросать в дрожь 🙂
Как и всегда, если есть какие-то вопросы, мысли, дополнения и всё такое прочее, то добро пожаловать в комментарии к этой записи.
PS: За существование статьи отдельное спасибо другу проекта и члену нашей команды под ником “barn4k“
Подписка:Используемые источники:
- https://habr.com/post/108931/
- https://netclo.ru/nastroyka-nat-v-cisco/
- https://sonikelf.ru/vse-chto-vy-xoteli-znat-o-nat-no-boyalis-sprosit-nat-pat-snat-dnat/