Доступ к веб-сайту через общедоступный IP-адрес веб-сервера с ПК в той же локальной сети
Если две машины находятся в одной локальной сети (ПК и веб-сервер), почему необходимо включить "NAT loopback" на маршрутизаторе, чтобы ПК мог получить доступ к веб-сайту, размещенному на веб-сервере, используя публичный IP-адрес маршрутизатора (который пересылается через порт) на порт 80 к веб-серверу)? Эта статья о динамическом DNS прекрасно иллюстрирует настройку http://www.dyndns.com/support/kb/loopback_connections.html
(В примере они пытаются получить доступ к веб-серверу, используя URL-адрес www.example.com, для моего вопроса, который не имеет значения, я просто заинтересован в доступе к веб-серверу через общедоступный IP-адрес, при этом URL не используется)
Последнее предложение вышеприведенной статьи гласит: "Если они попытаются получить доступ к компьютеру через имя хоста www.example.com, маршрутизатор NAT попытается маршрутизировать это через свой интерфейс WAN, а затем обратно. В большинстве случаев это может привести к сбою. или верните веб-интерфейс для самого маршрутизатора, потому что маршрутизатор не понимает, что пытается сделать пользователь ".
Может кто-нибудь предложить техническое объяснение, почему маршрутизатор запутался? Что на самом деле происходит с пакетами, когда они достигают маршрутизатора в этой ситуации, чтобы запутать его?
Второй вопрос: если маршрутизатор поддерживает "NAT Loopback", что означает, что эта функция изменяется в маршрутизации, чтобы вы могли использовать публичный IP?
1 ответ
Вот пример. Некоторые маршрутизаторы, такие как Neufbox4 (маршрутизатор, предоставляемый французским интернет-провайдером) работают под управлением Linux. На этих маршрутизаторах программа "iptables" используется для настройки поведения NAT (iptables - это своего рода нож швейцарской армии для сетей Linux).
Предположим, у вас есть веб-сервер (порт TCP 80) позади маршрутизатора, который прослушивает адрес локальной сети 192.168.0.2, и вы добавили для него сопоставление портов (перенаправление). Это означает что-то вроде этого в терминах iptables:
iptables -t nat -A PREROUTING -i wan -p tcp --dport 80 -j DNAT --to-destination 192.168.0.2
Это означает, что "для каждого пакета, который поступает через интерфейс WAN, направленный на порт TCP 80, отправьте его на 192.168.0.2". Что именно то, что вы хотите. Все хорошо... пока.
Вы должны понимать, что IP-адрес, связанный с интерфейсом WAN маршрутизатора, является вашим общедоступным интернет-адресом. Например, если ваш IP-адрес в Интернете - 1.2.3.4, то интерфейс WAN на маршрутизаторе имеет IP-адрес 1.2.3.4.
Теперь предположим, что вы пытаетесь получить доступ к своему веб-серверу из локальной сети, например, с вашего персонального компьютера по адресу 192.168.0.3, используя свой собственный адрес в Интернете. Например, вы набираете " http://1.2.3.4/ " в своем браузере.
Что происходит, так это то, что ваш компьютер отправит пакет, направленный на 1.2.3.4, TCP-порт 80, по локальной сети. Маршрутизатор получит этот пакет. Но он не будет перенаправлять его на 192.168.0.2. Зачем? Поскольку приведенное выше правило iptables имеет дело только с пакетами, поступающими по интерфейсу WAN, а не из локальной сети!
Так что же будет потом? Ну, это зависит от других сетевых правил на маршрутизаторе. Вообще говоря, произойдет одно из двух:
Либо маршрутизатор увидит пакет, направленный на себя (помните, 1.2.3.4 является одним из IP-адресов маршрутизатора, так что это совершенно нормально). На большинстве маршрутизаторов имеется веб-сервер, прослушивающий порт 80 для интерфейса администрирования. Следовательно, этот веб-сервер будет обрабатывать пакет, а не веб-сервер в вашей локальной сети, и вместо вашего веб-сайта вы получите интерфейс администрирования.
Или маршрутизатор по какой-то причине отбросит пакет, просто потому что он не знает, как обрабатывать пакет, направленный на его адрес WAN на своем порту LAN.
Технически решение очень простое, оно состоит в правиле iptables вида:
iptables -t nat -A PREROUTING -i lan -d 1.2.3.4 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.2
Это означает, что "для каждого пакета, который поступает через интерфейс LAN, направленный на TCP-порт 80, И с адресом назначения 1.2.3.4, отправьте его на 192.168.0.2". Это то, что вы бы назвали "NAT loopback".
Однако большинство производителей маршрутизаторов, очевидно, не знают об этой проблеме и не внедрили это правило (или эквивалент в проприетарной системе маршрутизатора) в свой продукт...