1. Гость, мы просим Вас ознакомиться с Правилами Форума и Отказом от ответственности!

Как показать внешний IP адрес сервера.

Тема в разделе 'PHP', создана пользователем wsok, 21 янв 2015.

  1. TopicStarter Overlay

    wsok Программист Пользователи

    Сообщения:
    606
    Лайки:
    173
    Пол:
    Мужской
    Репутация:
    3
    Скрин с примером работы скрипта: (специально для недалеких людей, которые плюются мол IP 192.168... локальные, скрипт тестировался на локалке, но с точки зрения сервера 192.168.0.32 это внешний IP по которому я обращался к нему с другой машины, а 192.168.0.56 IP клиента который обратился к серверу)
    011.jpg

    Демо работы скрипта: http://vps.wsok.net/ip.php

    Как известно для получения IP адреса посетителям используется суперглобальная переменная окружения




    Код:
    $_SERVER['REMOTE_ADDR']
    Ну, а если требуется вывести IP адрес именно сервера(внешний), где выполняется пхп скрипт? Сразу кто то из вас скажет, так есть же ещё одна суперглобальная переменная окружения!
    Код:
    $_SERVER['SERVER_ADDR']
    Конечно! Так то оно так, но есть одна проблема, она покажет только локальный IP адрес сервера, обычно это 127.0.0.1, но речь то идет о внешнем его IP по которому к нему и производится доступ пользователей(внешние подключения). К сожалению в PHP нету суперглобальных переменных, которые покажут внешний IP сервера, да их и не может быть по одной простой причине - никогда заранее неизвестно как сконфигурирован сетевой интерфейс, там может быть целый набор IP адресов, включая и IPv6, но нам ведь нужно получить конкретный IP - именно тот, который используется для внешней связи.

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

    Код:
    <?
    echo "Ваш IP: ". $_SERVER['REMOTE_ADDR']."<hr>";
    echo "IP этого сервера (используя SERVER_ADDR):". $_SERVER['SERVER_ADDR']."<hr>";
    
    
    $eth = "eth0"; //используемый сетевой интерфейс сервера (доступные сетевые интерфйсы можно вывести командой ifconfig в консоли управления SSH)
    
    
    $ips = "ip a s $eth | grep \"inet\" | cut -d \"/\" -f 1 | cut -c 10-"; //формируем команду для запроса
    
    
    Ob_start();
    passthru ($ips);
    $ip = ob_get_contents(); //тут сервер вернул нам строчку в которой содержаться его ip адреса.
    ob_end_clean();
    
    
    $iip = explode("\n", $ip); //получаем массив данных из переменной $ip
    
    
    //echo $ip; //Если неправильно показывает IP вашего сервера, раскоментируйте эту строчку убрав два слеша "//" в её начале,
    //после чего обратитесь к скрипту, он покажет список IP адресов разделенных пробелами. Для выбора просто укажите его порядковый номер(ниже читайте)
    
    
    echo "IP этого сервера(Внешний): ".$iip[0]; //отображение IP сервера, массив данных берется из переменной $ip, порядок номеров IP адресов от нуля и выше(по умолчанию 0 в переменной $iip[0]).
    ?>

    И так, вот собственно и он, что мы в нем делаем? для начала показываем пользователю его IP адрес, полученный с помощью переменной:
    Код:
    $_SERVER['REMOTE_ADDR']
    Затем пытаемся получить IP адрес сервера, где и лежит этот скрипт с помощью переменной:
    Код:
    $_SERVER['SERVER_ADDR']
    И терпим отчасти неудачу, так как ожидали получить внешний IP адрес сервера, а не локальный.

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

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

    PS: В скрипте используется команда, которая может быть отключена на обычном хостинге, поэтому этот скрипт предназначен для владельцев серверов у которых есть доступ к SSH. Но тем не менее есть альтернативный вариант, пример ниже:

    Этот скрипт использует для своей работы сторонний сервис 2ip.ru, но не все любят использовать сторонние сервисы, для них вариант выше, но если тот вариант не подходит Вам по ряду причин, то следующий скрипт может быть полезным:
    Скрипт был взят из интернет источников, но с небольшим дополнением id="d_clip_button" в тег big, так как видимо этот сервис ранее не использовал вложенные директивы в теге big.
    Код:
    <?
    $text = file_get_contents('http://2ip.ru');
    preg_match_all('#<big id="d_clip_button">(.+)</big>#iU', $text, $r);
    $text=$r[1][0]; //
    echo "Наш IP:".$text;
    ?>
    Демо пример: http://vps.wsok.net/2ip.php
    Последнее редактирование: 21 янв 2015
  2. HolaRiva Пользователи

    Сообщения:
    232
    Лайки:
    62
    Пол:
    Женский
    Репутация:
    0
    Страна:
    Russian Federation Russian Federation
    Конечно полезно. Но я не могу понять где именно можно его использовать?
    Мол хотите ддосить меня - вот мой айпи. И ненужны вам всякие определяшки.
    Скриптов, цмс не разу не встречал которым может потребоваться внешний айпи
    salitypw нравится это.
  3. salitypw Программист Пользователи

    Сообщения:
    673
    Лайки:
    458
    Пол:
    Мужской
    Репутация:
    8
    Команда:
    Easy Game Protection
    Страна:
    Japan Japan
    Может просто стоит правильно настраивать сервер? :)

    [​IMG]
    [​IMG]
    [​IMG]
    --- добавлено: 21 янв 2015 в 15:49 ---
    P. S. С каких пор IP вида 192.168.*.* стал внешним? :^)

    [​IMG]
    Последнее редактирование модератором: 29 янв 2015
    NetSpirit и Тыщ нравится это.
  4. HolaRiva Пользователи

    Сообщения:
    232
    Лайки:
    62
    Пол:
    Женский
    Репутация:
    0
    Страна:
    Russian Federation Russian Federation
    На локалке он тестировал видимо
    Последнее редактирование модератором: 29 янв 2015
    wsok нравится это.
  5. TopicStarter Overlay

    wsok Программист Пользователи

    Сообщения:
    606
    Лайки:
    173
    Пол:
    Мужской
    Репутация:
    3
    Именно, для локалки IP на скрине считались внешними, но дилетантам не понять, они сразу ищут повод для разбирательств )
    --- добавлено: 21 янв 2015 в 16:35 ---
    Ну для специфических целей проекта пригодится, вам может и не нужен, но кто то из веб мастеров ищет способ получения внешнего ип и вовсе не обязательно отображать его. Например можно использовать и для других дел, не обязательно для отображения всем.
    --- добавлено: 21 янв 2015 в 16:40 ---
    Если так считаете, можете поделиться своим опытом по настройке сервера, а не передергивать тему.
    --- добавлено: 21 янв 2015 в 16:45 ---
    Для таких как Вы в начале первого поста добавил курсивом примечание.
    Последнее редактирование модератором: 29 янв 2015
  6. salitypw Программист Пользователи

    Сообщения:
    673
    Лайки:
    458
    Пол:
    Мужской
    Репутация:
    8
    Команда:
    Easy Game Protection
    Страна:
    Japan Japan
    Может стоит называть вещи своими именами?

    Зато "не делетанты" :
    1) Называют частные диапазоны адресов "внешными".
    2) Получают содержание страницы другого сайта через http враппер
    3) Пишут откровенный быдлокод (статика в двойных кавычках, перебор массивов конструкцией вида: for ($i=0 ; $i<count($array) ; $i++) {} , объявление кода short open tag и т. д.)
  7. TopicStarter Overlay

    wsok Программист Пользователи

    Сообщения:
    606
    Лайки:
    173
    Пол:
    Мужской
    Репутация:
    3
    Кстати, небольшая заметка о скрипте, который берет данные с сетевого интерфейса, если сервер за роутером стоит и прочими проксиподобными делами, то скрипт не будет отображать реальную информацию. Например, в моем случае как видим скрипт отображает не вполне ожидаемую информацию:
    ip222.jpg

    В строке как видим указан мой внешний ip, а скрипт показывает внешний ip с точки зрения серверной машины. Причина этому в том, что между моим внешним IP и сервером в локалке находится роутер с пробросом портов. В итоге получаем такой странный результат ). В принципе и это тоже можно настроить при желании.
    --- добавлено: 21 янв 2015 в 17:18 ---
    1. Увы не переубедили, потому свое примечание в первом посте и оставлю в таком тоне.
    2. Мне без разницы как вы меня поняли и т.д. я тестировал скрипт в условия локальной сети и в примечании указал что к чему, хоть и сам понимаю, что данный диапазон адресов локальный, но в условиях теста в локальной сети можно было опустить некоторые условности.

    и ещё, да может пример данный вам и быдлокод (который взяли из одного из скриптов моих), но это мой быдлокод...
    И напоследок:
    Последнее редактирование модератором: 29 янв 2015
  8. salitypw Программист Пользователи

    Сообщения:
    673
    Лайки:
    458
    Пол:
    Мужской
    Репутация:
    8
    Команда:
    Easy Game Protection
    Страна:
    Japan Japan
    [​IMG]

    Аналог женского "Ой, все!" ? :D
  9. TopicStarter Overlay

    wsok Программист Пользователи

    Сообщения:
    606
    Лайки:
    173
    Пол:
    Мужской
    Репутация:
    3
    Ого, спасибо Кеп, просвятил! Получите медаль за звание Капитан Очевидность.
    [​IMG]

    Просто не считаю нужным с быдлом обсуждать свой быдлокод...
    4elovek нравится это.
  10. Unix Пользователи

    Сообщения:
    1.028
    Лайки:
    331
    Пол:
    Мужской
    Репутация:
    6
    Страна:
    Ukraine Ukraine
    Ты хочешь сказать что ддосеры юзают 2ip.ru?)
    Скинь свой домен, которым ты скрываешь айпишку, ради интереса
    Последнее редактирование модератором: 29 янв 2015
    wsok нравится это.
  11. salitypw Программист Пользователи

    Сообщения:
    673
    Лайки:
    458
    Пол:
    Мужской
    Репутация:
    8
    Команда:
    Easy Game Protection
    Страна:
    Japan Japan
    При чем тут вообще DDoS и 2ip.ru ? На трех скринах я показал, что в $_SERVER['SERVER_ADDR'] находится реальный внешний адрес сервера.
  12. Unix Пользователи

    Сообщения:
    1.028
    Лайки:
    331
    Пол:
    Мужской
    Репутация:
    6
    Страна:
    Ukraine Ukraine
    Последнее редактирование модератором: 29 янв 2015
  13. salitypw Программист Пользователи

    Сообщения:
    673
    Лайки:
    458
    Пол:
    Мужской
    Репутация:
    8
    Команда:
    Easy Game Protection
    Страна:
    Japan Japan
    Какое отношение ко мне имеет комментарий HolaRiva ?
    --- добавлено: 21 янв 2015 в 21:30 ---
    Я сказал, что достаточно настроить WEB сервер, чтобы в $_SERVER['SERVER_ADDR'] содержался внешний адрес сервера, а не 127.0.0.1
    Последнее редактирование модератором: 29 янв 2015
  14. Unix Пользователи

    Сообщения:
    1.028
    Лайки:
    331
    Пол:
    Мужской
    Репутация:
    6
    Страна:
    Ukraine Ukraine
    Ну сори, не правильно понял.
  15. Deron Old school Пользователи

    Сообщения:
    1.123
    Лайки:
    533
    Пол:
    Мужской
    Репутация:
    4
    [​IMG] [​IMG]
    dpakon1 нравится это.
Черновик сохранён Черновик удалён
Similar Threads
  1. StAlKeR7779
    Ответов:
    87
    Просмотров:
    18.026
  2. uragan
    Ответов:
    5
    Просмотров:
    1.936
  3. New-X
    Ответов:
    13
    Просмотров:
    4.358
  4. Specter
    Ответов:
    10
    Просмотров:
    2.305
  5. VG_13
    Ответов:
    2
    Просмотров:
    1.049
Загрузка...

Поделиться этой страницей