Skip to content

Два сетевых механизма связанных с NAT

В данном посте пойдет речь про два не связанных напрямую между собой сетевых механизма:

  • Hairpin NAT
  • Proxy ARP

Стоит заметить, что их использование необходимо только в определенных случаях NAT, далее будет описано подробнее.

Hairpin NAT

hairpin-nat.png

Сценарий:

  • веб сервер и клиент находятся за общим 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 клиент думает, что разговаривает с публичным интерфейсом веб сервера, а веб сервер думает, что разговаривает с внутренним интерфейсом роутера.

Источник 1

Источник 2

Proxy ARP

proxy-arp.png

Сценарий:

  • для публикации серверов (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 адресам, которые вы укажите, вне зависимости от адреса самого интерфейса на который, они будут приходить.

Источник 1