Как правильно настроить NAT для доступа к внутреннему сервису из локальной сети через внешний интерфейс?

У меня есть шлюз с двумя внешними интерфейсами и одним локальным интерфейсом:

- Eeth1: 192.168.1.2 
- Eeth2: 172.16.2.2 
- Leth0: 100.127.1.1 

В локальной сети установлен HTTP-сервер с IP-адресом: 100.127.1.2, а также имеются клиенты локальной сети с адресами, начинающимися с 100.127.1.15. 

При попытке доступа к внешним IP-адресам "извне" сайт открывается, однако при доступе к тем же внешним IP-адресам "изнутри" сайта открыть не удается. 

<i>PS: Это тестовый стенд в VirtualBox.</i>

Каковы возможные причины такого поведения и какие шаги можно предпринять для решения данной проблемы?
  • 9 сентября 2024 г. 12:03
Ответы на вопрос 2
Проблема, с которой вы столкнулись, связана с концепцией двойного NAT и тем, что трафик, исходящий из локальной сети на внешний IP, не возвращается обратно в локальную сеть через NAT. Чтобы обеспечить доступ из внутренней сети к сервисам, расположенным на внешнем IP, необходимо выполнить несколько шагов. Вот что рекомендуется сделать:

1. **Настройка NAT (Port Forwarding)**:
   Убедитесь, что на вашем шлюзе корректно настроено перенаправление портов (Port Forwarding). Это поможет перенаправить входящие запросы на внешний IP к вашему HTTP-серверу во внутренней сети. Например, если ваш HTTP-сервер работает на порту 80, вам нужно настроить следующее правило на вашем шлюзе:

   ```
   iptables -t nat -A PREROUTING -d <внешний_IP> -p tcp --dport 80 -j DNAT --to-destination 100.127.1.2:80
   iptables -A FORWARD -p tcp -d 100.127.1.2 --dport 80 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
   ```

   Замените `<внешний_IP>` на IP-адрес, который вы используете.

2. **Настройка 'Hairpinning' (NAT Reflection)**:
   Для доступа к внешнему IP из внутренней сети необходимо настроить 'hairpinning' или NAT Reflection. Это позволяет клиентам локальной сети обращаться к внешнему IP, и так, что трафик продолжается через NAT обратно в локальную сеть. Убедитесь, что ваш маршрутизатор или шлюз поддерживает эту функцию. Например, для iptables можно использовать следующий подход:

   ```
   iptables -t nat -A PREROUTING -d <внешний_IP> -p tcp --dport 80 -j DNAT --to-destination 100.127.1.2:80
   iptables -t nat -A POSTROUTING -p tcp -d 100.127.1.2 --dport 80 -j SNAT --to-source 100.127.1.1
   ```

3. **Проверка маршрутизации**:
   Убедитесь, что маршруты настроены правильно и что запросы внутри локальной сети корректно направляются к вашему шлюзу. Проверьте таблицы маршрутизации и убедитесь, что маршруты к локальной сети настроены правильно как на клиентских машинах, так и на шлюзе.

4. **Локальные DNS-настройки**:
   Если при доступе к внешнему IP вы используете доменное имя, убедитесь, что ваше DNS-имя правильно разрешается в локальной сети. Возможно, вам стоит добавить соответствующий A-запись для локальной сети, чтобы она указывала на локальный IP конфликтующий сервис.

5. **Отладка и логирование**:
   Включите логи iptables, чтобы просматривать пакеты, проходящие через вашу конфигурацию NAT, это поможет вам увидеть, что происходит с запросами и где могут возникать проблемы:

   ```
   iptables -A INPUT -j LOG --log-prefix "IPTables-INPUT: "
   iptables -A FORWARD -j LOG --log-prefix "IPTables-FORWARD: "
   iptables -A OUTPUT -j LOG --log-prefix "IPTables-OUTPUT: "
   ```

После выполнения этих шагов вы должны получить доступ к вашему внутреннему HTTP-серверу из локальной сети через внешний IP. Если же проблема остается, рассмотрите возможность временной деактивации брандмауэра на клиентских устройствах или на шлюзе для диагностики.
nft add rule inet nat postrouting oifname "Eeth1" counter masquerade
nft add rule inet nat prerouting iifname "Eeth1" tcp dport { 80, 8080, 443 } counter dnat ip to 100.127.1.2
nft add rule inet nat prerouting iifname "Leth0" ip saddr 100.127.1.0/24 ip daddr 192.168.1.2 tcp dport { 80, 8080, 443 } counter dnat ip to 100.127.1.2
nft add rule inet nat postrouting oifname "Leth0" ip saddr 100.127.1.0/24 ip daddr 100.127.1.2 tcp dport { 80, 8080, 443 } counter snat to 100.127.1.1
Похожие вопросы