Есть ли в PHP возможность использовать уникальную идентификацию маршрутизатора пользователя? - PullRequest
1 голос
/ 26 ноября 2010

Есть ли в PHP способ использовать уникальную идентификацию маршрутизатора пользователя? Я хотел бы знать, какие пользователи находятся на одном маршрутизаторе.

Ответы [ 3 ]

4 голосов
/ 26 ноября 2010

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

Предполагается следующее:

  • У вас есть два входных маршрутизатора
  • Ваш веб-сервер имеет только один интерфейс Ethernet
  • Вы пытаетесь определить, через какой маршрутизатор прошел трафик

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

2 голосов
/ 26 ноября 2010

Вы можете получить IP-адрес пользователя, используя $_SERVER['REMOTE_ADDR'], а затем использовать утилиту traceroute, чтобы получить прыжки и проверить маршрутизаторы, которые вы хотите найти, если вы знаете IP-адреса обоих из них.

Предполагается, что маршрутизатор не транслирует адреса для них, в противном случае это не будет работать, так как он полагается на возможность возврата через маршрутизатор к пользователю. Если любой из маршрутизаторов может вернуться к пользователю, он не будет работать вообще. Тем не менее, подходит для коммутируемых пользователей.

<?php
$ip = $_SERVER['REMOTE_ADDR'];
$router1IP = "123.123.123.123";

$output = array();
exec('traceroute -n ' . $ip, $output, $result);

if ($result == 0) {
    $outputText = implode("\n", $output);
    if (preg_match("/" . preg_quote($router1IP) . "/", $output)) {
        echo "Router 1";
    } else {
        echo "Router 2";
    }
}
?>
1 голос
/ 26 ноября 2010

Лучшее, что вы можете сделать, - это определить IP-адрес пользователя, используя $_SERVER['REMOTE_ADDR']. Если IP-адрес соответствует маршрутизатору, вам повезло.

...