1

GoDaddy共有LinuxサーバーでPHPを実行しているWebサイトがあります。ユーザーが会社のVPNに接続しているかどうかを確認する必要があります。$ _SERVER ['REMOTE_ADDR']を実行するだけで、クライアントのIPアドレスがわかります。ただし、tracertを使用してさらに深く掘り下げることができれば、2番目のホップが企業のIPアドレスとして表示されます。

PHPを使用してWebページからtracerouteを実行し、ユーザーが会社のスプリットトンネルVPNに接続しているかどうかを判断することはできますか?

4

2 に答える 2

10

PHPでtracerouteプログラムを作成する

http://www.adayinthelifeof.nl/2010/07/30/creating-a-traceroute-program-in-php/

サイトがダウンした場合の要点は次のとおりです。

<?php

define ("SOL_IP", 0);
define ("IP_TTL", 2);    // On OSX, use '4' instead of '2'.

$dest_url = "www.google.com";   // Fill in your own URL here, or use $argv[1] to fetch from commandline.
$maximum_hops = 30;
$port = 33434;  // Standard port that traceroute programs use. Could be anything actually.

// Get IP from URL
$dest_addr = gethostbyname ($dest_url);
print "Tracerouting to destination: $dest_addr\n";

$ttl = 1;
while ($ttl < $maximum_hops) {
    // Create ICMP and UDP sockets
    $recv_socket = socket_create (AF_INET, SOCK_RAW, getprotobyname ('icmp'));
    $send_socket = socket_create (AF_INET, SOCK_DGRAM, getprotobyname ('udp'));

    // Set TTL to current lifetime
    socket_set_option ($send_socket, SOL_IP, IP_TTL, $ttl);

    // Bind receiving ICMP socket to default IP (no port needed since it's ICMP)
    socket_bind ($recv_socket, 0, 0);

    // Save the current time for roundtrip calculation
    $t1 = microtime (true);

    // Send a zero sized UDP packet towards the destination
    socket_sendto ($send_socket, "", 0, 0, $dest_addr, $port);

    // Wait for an event to occur on the socket or timeout after 5 seconds. This will take care of the
    // hanging when no data is received (packet is dropped silently for example)
    $r = array ($recv_socket);
    $w = $e = array ();
    socket_select ($r, $w, $e, 5, 0);

    // Nothing to read, which means a timeout has occurred.
    if (count ($r)) {
        // Receive data from socket (and fetch destination address from where this data was found)
        socket_recvfrom ($recv_socket, $buf, 512, 0, $recv_addr, $recv_port);

        // Calculate the roundtrip time
        $roundtrip_time = (microtime(true) - $t1) * 1000;

        // No decent address found, display a * instead
        if (empty ($recv_addr)) {
            $recv_addr = "*";
            $recv_name = "*";
        } else {
            // Otherwise, fetch the hostname for the address found
            $recv_name = gethostbyaddr ($recv_addr);
        }

        // Print statistics
        printf ("%3d   %-15s  %.3f ms  %s\n", $ttl, $recv_addr,  $roundtrip_time, $recv_name);
    } else {
        // A timeout has occurred, display a timeout
        printf ("%3d   (timeout)\n", $ttl);
    }

    // Close sockets
    socket_close ($recv_socket);
    socket_close ($send_socket);

    // Increase TTL so we can fetch the next hop
    $ttl++;

    // When we have hit our destination, stop the traceroute
    if ($recv_addr == $dest_addr) break;
}

?>

あなたは根である必要があります。これは、Webサーバーから実行する場合はおそらく機能しないことを意味し、コマンドラインから実行する必要があります。

jthijssen@tarabas:~/traceroute$ sudo php traceroute.php
Tracerouting to destination: 199.6.1.164
  1   192.168.1.1      0.004 ms  192.168.1.1
  2   *                0.005 ms  static.kpn.net
  3   (timeout)
  4   139.156.113.141  0.005 ms  nl-asd-dc2-ias-csg01-ge-3-2-0-kpn.net
  5   195.190.227.221  0.005 ms  asd2-rou-1022.nl.euroringen.net
  6   134.222.229.105  0.005 ms  asd2-rou-1001.NL.eurorings.net
  7   134.222.97.186   0.007 ms  kpn-1402.xe-0-0-0.jun1.galilei.network.bit.nl
  8   213.154.236.75   0.012 ms  213.154.236.75
  9   199.6.1.164      0.012 ms  pub3.kernel.org

これはwww.kernel.orgへのtracerouteです。2番目のホップを削除しました(これが私の場所のIPであるため)。3番目のホップがタイムアウトを返しました。おそらく、そこにあるステーションは、使用するためにICMPパケットを返しませんでした。

上記のコードはgithubにあります:https ://github.com/jaytaph/traceroute

于 2013-02-06T12:57:12.440 に答える
2

PHPを使用して、サーバー上でtracerouteコマンドを実行できます。

<?php
$output = shell_exec("/usr/sbin/traceroute target");
echo "<pre>$output</pre>";
?>

次に、$outputの出力を解析します。

ソース: http: //php.net/manual/en/function.shell-exec.php

于 2012-09-17T17:00:04.197 に答える