Я работаю с API, для которого требуется внешний IP-адрес машины. Насколько мне известно, среда PHP, которую я использую, может получить только наш внутренний IP-адрес.
Вариант в таблице использует внешний сервис, такой как whatismyip.com, чтобы сообщить нам:
wget -q -O - http://whatismyip.com/automation/n09230945.asp
Меня беспокоит, что произойдет, если это не удастся. Есть ли надежный способ определения IP-адреса машины, не полагаясь на внешние службы?
Нет. Поскольку NAT должен быть прозрачным, это во многом исключает возможность выполнения любых действий на самом компьютере. Вы можете делать ставки (сравнивать IP-адреса с определенными частными областями), но это тоже не является доказательством.
поскольку вы говорите «внутренний» и «внешний», я предполагаю, что вы используете какой-то брандмауэр, который работает за вас. если это так, невозможно определить из вашего локального скрипта, какой у вас IP-адрес, потому что, как только сетевые пакеты покидают ваш ящик, вы не можете сказать, что это произойдет.
простое решение - использовать несколько внешних серверов (некоторый бесплатный хостинг) или иметь внешний сервер, который вы вызываете из php и возвращает вам IP-адрес, как указано в массиве SERVER, который содержит эту информацию. если у вас более одного сервера, вы можете позвонить на следующий и так далее.
Это больше будет вопросом для StackOverflow, но я все равно укушу! Предполагая, что нет перенаправления портов или балансировки нагрузки, вы можете использовать $_SERVER['SERVER_ADDR']
переменная, чтобы получить IP-адрес, на котором запущен скрипт.
Еще одна проблема заключается в том, что это может быть не IP-адрес, с которого исходят какие-либо соединения из скрипта. Возьмем, к примеру, если у вас есть сервер с первичным IP-адресом 192.0.2.1 и вторичным IP-адресом 192.0.2.2 для SSL-сайта, на котором выполняется сценарий. Когда вы используете указанную выше переменную, возвращаемый IP-адрес будет 192.0.2.2, но когда вы создадите исходящее соединение в sciprt, он будет с 192.0.2.1, если вы специально не привязаны к 192.0.2.2.
Вы можете настроить другой сервер с другим интернет-провайдером и написать свою собственную версию whatismyip.com, работающую на оборудовании, которое вы контролируете.
Лучше всего использовать более одного внешнего источника для информации об IP. В дополнение к whatismyip большинство, если не все, провайдеры DDNS (например, DynDNS) имеют аналогичную услугу. Если вы не можете получить информацию с одного сайта, просто попробуйте следующий в списке.