Как правильно настроить 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. Если же проблема остается, рассмотрите возможность временной деактивации брандмауэра на клиентских устройствах или на шлюзе для диагностики.
<pre><code class="bash">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</code></pre>
Похожие вопросы