Внешний IP-адрес клиента

Звучит смешно, но как я могу получить внешний IP-адрес от клиента?

Я пробовал несколько вещей, но не работал для меня.

в первую очередь я пытался

request.getRemoteAddr()

и я получаю результат как: 0:0:0:0:0:0:0:1

на втором месте я пытался

InetAddress ip = InetAddress.getLocalHost();
ip.getHostAddress());

и я получаю результат как: 127.0.0.1

на третьем месте я пытался

        URL whatismyip = new URL("http://checkip.dyndns.org:8245/");
        BufferedReader inIP = new BufferedReader(new InputStreamReader(whatismyip.openStream()));

        String IPStrOld = inIP.readLine(); //IP as a String
        String IPStrNewest = IPStrOld.replace("<html><head><title>Current IP Check</title></head><body>Current IP Address: ", "");
        String IPStr = IPStrNewest.replace("</body></html>", "");

но я получаю только внешний IP сервера

и за последнее место

        URL whatismyip = new URL("http://automation.whatismyip.com/n09230945.asp");
        BufferedReader inIP = new BufferedReader(new InputStreamReader(whatismyip.openStream()));
        String ip = inIP.readLine();

это то же самое, я получаю только внешний IP сервера

Итак, в чем дело?


person Denees    schedule 12.08.2011    source источник
comment
Что точно вы подразумеваете под внешним IP-адресом клиента? Можете привести конкретные примеры? Например, что, если клиент обращается к серверу через локальную сеть? Если это недопустимый сценарий, это должно быть объяснено в вопросе. Под конкретными примерами я подразумеваю, что вы должны указать, где находится клиент (т. е. какой тип сети), как он достигает сервера, какие IP-адреса задействованы и какой из них вы пытаетесь заполучить.   -  person Lasse V. Karlsen    schedule 12.08.2011
comment
IP-адрес роутера, надеюсь, теперь понял?. где находится клиент - вот что я хочу знать :) + IP клиента т.е: 103.456.768.22   -  person Denees    schedule 12.08.2011
comment
@hoss Хорошо, тогда, когда клиент делает запрос к вам, произойдет преобразование адреса (NAT или прокси-сервер), и ваш сервер примет удаленное подключение пользователя. Это соединение должно предоставить вам переведенный адрес клиента. Следовательно, я утверждаю, что ответ jzd является правильным, и есть дополнительная проблема, которую необходимо решить. Каков тип вашего объекта запроса?   -  person Jérôme Verstrynge    schedule 12.08.2011
comment
хорошо, вот это запрос HttpServletRequest = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST);   -  person Denees    schedule 12.08.2011


Ответы (3)


Если ваш клиент использует NAT (трансляцию сетевых адресов), у него может не быть внешнего адреса. Чаще всего, по моему опыту, так и есть. На работе мои веб-запросы проходят через прокси, поэтому веб-сервер может определить только этот адрес. Дома я использую NAT через сервер, поэтому у этого ноутбука, на котором я печатаю, нет внешнего адреса. Ближе всего то, что возвращается от whatismyip, адреса моего сервера, через который я иногда могу перенаправлять порты, которые идут на мой ноутбук.

person sje397    schedule 12.08.2011
comment
и в итоге решения нет? в моем приложении мне нужно проверить из какой страны клиент и/или с какого IP он сделал этот заказ - person Denees; 12.08.2011
comment
Я так не думаю. Я в Австралии, а рабочий прокси в Сингапуре... творит чудеса с локализованными веб-сайтами :( - person sje397; 12.08.2011
comment
Нет, этот ответ неверен. Если пользователь выходит в Интернет через NAT, NAT назначит ему временный общедоступный IP-адрес и порт для всех подключений. Иначе интернет бы не работал. Этот адрес не является постоянным, но он существует. - person Jérôme Verstrynge; 12.08.2011
comment
Нет, @JVerstry, ты ошибаешься. Пакеты перезаписываются маршрутизатором при их передаче из внутренней сети во внешнюю или наоборот. Временного адреса нет. Прочтите ссылку, которую я дал. - person sje397; 12.08.2011
comment
Я согласен, но я не это имею в виду. Со стороны hoos, независимо от того, транслируется ли адрес NAT или прокси-сервером, этот адрес создается и должен быть виден для него. - person Jérôme Verstrynge; 12.08.2011
comment
NAT назначит ему временный общедоступный IP-адрес — это просто неправильно. Адрес, который видит веб-сервер, — это просто адрес моего сервера. Никакой другой информации мой сервер не передает - таблица трансляции находится на моем сервере, и только он знает, как перенаправить пакеты обратно на нужный внутренний сетевой адрес. - person sje397; 12.08.2011
comment
Путаница, вероятно, связана с формулировкой этого ответа. Что sje397 говорит, так это то, что клиент не получает своего личного общедоступного IP-адреса, а сопоставляется с существующим IP-адресом, уже используемым маршрутизатором NAT. Таким образом, здесь существует общедоступный адрес, но он не является собственностью клиентского устройства и не создается для клиента. В создании общедоступного IP-адреса обычно участвует провайдер сетевого подключения за пределами NAT-маршрутизатора. - person Lasse V. Karlsen; 12.08.2011
comment
100% согласен с вами. Это означает, что клиент ДЕЙСТВИТЕЛЬНО имеет внешний адрес с точки зрения глобальной сети. Это (чаще всего) комбинация публичного IP-адреса сервера + свободный порт. Мое понимание вопроса заключается в том, что хост не может получить доступ к этой комбинации адреса/порта со своей стороны, хотя должен. - person Jérôme Verstrynge; 12.08.2011
comment
@JVerstry - кажется, я знаю, о чем вы говорите, - но порт, вероятно, будет меняться для каждого соединения, так что это довольно бесполезно. - person sje397; 12.08.2011
comment
@ sje397 Верно, но это все еще ценная криминалистическая информация. Я думаю, что ОП необходимо уточнить. Если хост пытается получить свой собственный переведенный адрес, то ему нужен сервер на основе WAN с общедоступным IP-адресом, который может прочитать его и вернуть. - person Jérôme Verstrynge; 12.08.2011

Выполнение действий «whatismyip» для кода, запущенного на сервере, даст вам только адрес сервера.

Также,

http://www.rgagnon.com/javadetails/java-0363.html

Из этой ссылки:

<%
out.print( request.getRemoteAddr() );
out.print( request.getRemoteHost() );
%>

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

<%
out.print( request.getHeader("x-forwarded-for") );
%>
person jzd    schedule 12.08.2011
comment
request.getRemoteAddr() всегда получает IP-адрес как localhost (127.0.0.1), даже если это сервер или клиент. - person Denees; 12.08.2011
comment
? Это не соответствует тому, что вы сказали в своем вопросе. - person jzd; 12.08.2011
comment
возможно, но 0:0:0:0:0:0:0:1 это тоже неверный IP :) - person Denees; 12.08.2011
comment
Ответ @hoss jzd правильный. Теперь, если вы не получаете действительный IP-адрес из соединения, созданного по запросу пользователя, значит, ваша проблема исходит откуда-то еще. Если вы используете сокеты, вы сможете получить эту информацию, особенно если ваш клиент получает ответы от вашего сервера. - person Jérôme Verstrynge; 12.08.2011

Код:

    URL whatismyip = new URL("http://checkip.dyndns.org:8245/");
    BufferedReader inIP = new BufferedReader(new InputStreamReader(whatismyip.openStream()));
    String IPStrOld = inIP.readLine(); //IP as a String
    String IPStrNewest = IPStrOld.replace("<html><head><title>Current IP Check</title></head><body>Current IP Address: ", "");
    String IPStr = IPStrNewest.replace("</body></html>", "");

отлично работает для меня! Я получил свой IP-адрес маршрутизатора вместе с ним! (в строке вида XXX.XXX.XXX.XXX)

Код для сайта:

http://automation.whatismyip.com/n09230945.asp

больше не работает...

person Tarcisio    schedule 23.01.2013