Я пытался запустить сервер для развертывания облачной службы. Большинство моих операций основаны на IP-адресе клиента. Когда я использовал godaddy, скрипт, возвращавший ip клиента, работал нормально (php, переменная $ _SERVER). Теперь на моем сервере он возвращает 192.168.1.1 (мой маршрутизатор / шлюз). Почему это? Я использую Apache, PHP5, Ubuntu Server 12.04 LTS. Заранее благодарен за помощь.
Вы используете шпильку NAT, которая должна переписать исходный IP-адрес. Если вы собираетесь подключиться к внешнему IP-адресу изнутри, исходный IP-адрес всегда должен быть IP-адресом шлюза. В противном случае возвратные пакеты никогда не вернутся на исходную машину.
Мой вам совет - просто не делайте этого. Если вы хотите подключиться к локальному компьютеру, используйте его локальный IP-адрес.
Этот ответ объясняет ту же проблему.
Вот что произошло бы, если бы вы не использовали SNAT:
Запрос исходит от машины, имеющей только частный IP-адрес, поэтому у него есть частный исходный IP-адрес.
Пункт назначения не является локальным, поэтому запрос отправляется на шлюз.
Шлюз перезаписывает только пункт назначения (это неправильно!) И отправляет пакет на сервер.
Сервер видит запрос с локального IP-адреса, поэтому он отправляет ответ на локальный IP-адрес.
Локальный компьютер видит ответ с локального IP-адреса на пакет, отправленный на удаленный IP-адрес, и игнорирует ответ.
Шпилька NAT - это форма двойного NAT, использующая как SNAT, так и DNAT. Он не может работать без SNAT. Ответы также должны быть преобразованы в NAT, что означает, что источник должен быть преобразован в NAT, чтобы получать ответы на шлюз.
С помощью tcpdump проверьте, как выглядят пакеты, достигающие сервера. Возможно, на шлюзе был активирован SNAT.
Редактировать 1
Это относится к случаю, когда доступ осуществляется извне локальной сети, так что SNAT возможен, но не необходим.