Назад | Перейти на главную страницу

Сервер считает, что запрос идет от моего шлюза

Я пытался запустить сервер для развертывания облачной службы. Большинство моих операций основаны на IP-адресе клиента. Когда я использовал godaddy, скрипт, возвращавший ip клиента, работал нормально (php, переменная $ _SERVER). Теперь на моем сервере он возвращает 192.168.1.1 (мой маршрутизатор / шлюз). Почему это? Я использую Apache, PHP5, Ubuntu Server 12.04 LTS. Заранее благодарен за помощь.

Вы используете шпильку NAT, которая должна переписать исходный IP-адрес. Если вы собираетесь подключиться к внешнему IP-адресу изнутри, исходный IP-адрес всегда должен быть IP-адресом шлюза. В противном случае возвратные пакеты никогда не вернутся на исходную машину.

Мой вам совет - просто не делайте этого. Если вы хотите подключиться к локальному компьютеру, используйте его локальный IP-адрес.

Этот ответ объясняет ту же проблему.

Вот что произошло бы, если бы вы не использовали SNAT:

  1. Запрос исходит от машины, имеющей только частный IP-адрес, поэтому у него есть частный исходный IP-адрес.

  2. Пункт назначения не является локальным, поэтому запрос отправляется на шлюз.

  3. Шлюз перезаписывает только пункт назначения (это неправильно!) И отправляет пакет на сервер.

  4. Сервер видит запрос с локального IP-адреса, поэтому он отправляет ответ на локальный IP-адрес.

  5. Локальный компьютер видит ответ с локального IP-адреса на пакет, отправленный на удаленный IP-адрес, и игнорирует ответ.

Шпилька NAT - это форма двойного NAT, использующая как SNAT, так и DNAT. Он не может работать без SNAT. Ответы также должны быть преобразованы в NAT, что означает, что источник должен быть преобразован в NAT, чтобы получать ответы на шлюз.

С помощью tcpdump проверьте, как выглядят пакеты, достигающие сервера. Возможно, на шлюзе был активирован SNAT.

Редактировать 1

Это относится к случаю, когда доступ осуществляется извне локальной сети, так что SNAT возможен, но не необходим.