====== Два сетевых механизма связанных с NAT ====== Источник: https://gamelton.com/2016/03/25/nat-related-issues/ В данном посте пойдет речь про два не связанных напрямую между собой сетевых механизма: Hairpin NAT и Proxy ARP. Стоит заметить, что их использование необходимо только в определенных случаях NAT, далее будет описано подробнее. ===== Hairpin NAT ===== {{:network:hairpin_nat.png?nolink|}} **Сценарий:** веб сервер и клиент находятся за общим NAT. Веб сервер опубликован на внешнем адресе 80.80.80.80 на порту 80. Внутренние IP адреса у клиента и сервера из одной подсети 10.10.10.0/24. Клиент не может подключиться к веб серверу по внешнему адресу. При этом от других клиентов (с мобильного телефона, из дома и пр.) доступ работает. **Причина:** * Клиент делает запрос к веб серверу ^ Адрес источника ^ Адрес получателя ^ | 10.10.10.50 | 80.80.80.80 | | внутренний адрес клиента | внешний адрес сервера | * Маршрутизатор изменяет адрес получателя (DNAT) и по таблице маршрутизации отправляет пакет в тот же интерфейс, из которого он пришел ^ Адрес источника ^ Адрес получателя ^ | 10.10.10.50 | 10.10.10.2 | | внутренний адрес клиента | внутренний адрес сервера | * Сервер получает запрос и по таблице маршрутизации выясняет, что он находится в одной подсети с клиентом (10.10.10.0/24) и отправляет ответ напрямую клиенту, минуя маршрутизатор ^ Адрес источника ^ Адрес получателя ^ | 10.10.10.2 | 10.10.10.50 | * Клиент, получив ответ с адреса, с которым он не общался до этого, отбрасывает его. **Решение:** Для того, чтобы разрешить обмен через внешний адрес сервера между клиентом и сервером, находящимися в одной внутренней подсети, следует применять изменение адресов отправителя (SNAT) и получателя (DNAT) — механизм названный hairpin NAT. * Клиент делает запрос к веб серверу ^Адрес источника ^ Адрес получателя ^ | 10.10.10.50 | 80.80.80.80 | | внутренний адрес клиента | внешний адрес сервера | * Маршрутизатор изменяет адрес получателя (DNAT) и адрес отправителя (SNAT) и по таблице маршрутизации отправляет пакет в тот же интерфейс из которого он пришел ^ Адрес источника ^ Адрес получателя ^ | 10.10.10.1 | 10.10.10.2 | | внутренний адрес маршрутизатора | внутренний адрес сервера | * Сервер получает запрос и по таблице маршрутизации отправляет ответ на маршрутизатор, т.к. его адрес значится источником ^ Адрес источника ^ Адрес получателя ^ | 10.10.10.2 | 10.10.10.1 | * Маршрутизатор изменяет адрес получателя (DNAT) и адрес отправителя (SNAT) и по таблице маршрутизации отправляет пакет в тот же интерфейс из которого он пришел ^ Адрес источника ^ Адрес получателя ^ | 80.80.80.80 | 10.10.10.50 | * Клиент получает ответ с адреса, на который он отправлял запрос, поэтому принимает его. Путем hairpin NAT клиент думает, что разговаривает с публичным интерфейсом веб сервера, а веб сервер думает, что разговаривает с внутренним интерфейсом роутера. * [[http://serverfault.com/a/557776|Источник 1]] * [[http://wiki.mikrotik.com/wiki/Hairpin_NAT|Источник 2]] ===== Proxy ARP ===== {{:network:proxy_arp.png?nolink|}} **Сценарий:** для публикации серверов (DNAT) используется целая подсеть 80.80.80.0/24 при этом внешнему интерфейсу маршрутизатора назначен адрес 80.80.80.1. Клиенты не могут подключиться к веб серверу по внешнему адресу. **Причина:** * Клиент из интернета делает запрос к внешнему адресу веб сервера ^ Адрес источника ^ Адрес получателя ^ | 50.50.50.50 | 80.80.80.80 | | внешний адрес клиента | внешний адрес сервера | * Запрос приходит на пограничный маршрутизатор провайдера, к которому подключен ваш маршрутизатор внешним интерфейсом. Маршрутизатор провайдера делает широковещательный ARP запрос в подсеть 80.80.80.0/24 с целью получить MAC адрес клиента с IP адресом 80.80.80.80. * Поскольку в подсети 80.80.80.0/254 нет интерфейса с адресом 80.80.80.80 маршрутизатор провайдера отправляет ошибку клиенту, что сервер недоступен. **Решение:** Для того, чтобы ваш маршрутизатор отвечал на ARP запрос необходимо на его внешнем интерфейсе настроить Proxy ARP. В этом случае ваш маршрутизатор будет отвечать на все ARP запросы по IP адресам, которые вы укажите, вне зависимости от адреса самого интерфейса на который, они будут приходить. [[http://kb.juniper.net/InfoCenter/index?page=content&id=KB21785|Источник 1]]