ICMP - Ping

Smokers

Grünschnabel
Hallo,

es geht mir um folgendes.
Ich bin gerade dabei ein kleines Script zu schreiben, bei dem man die IP Adresse
eines PCs / Servers angibt und dann getestet werden soll ob der Erreichbar ist und welche Ports offen sind.

Portscan etc alles schon recht gut realisiert, jedoch läuft der Ping derzeit als TCP Ping auf Port 80 was natürlich Nonsens ist da nicht jeder Rechner 80 offen hat / nutzt.

Sprich ich möchte es per ICMP realisieren.

Im Forum hier habe ich folgendes Script gefunden:


PHP:
<?php
function calcchecksum($packet)
{
    if (strlen($packet)%2!=0)
        {
            $packet.="\x00";
        }
    $wordrow=unpack("n*",$packet);
    $checksum=array_sum($wordrow);
    while ($checksum>>16)
        {
            $checksum=($checksum>>16)+($checksum&0xffff);
        }
    $packedsum=pack("n",~$checksum);
    return $packedsum;
}

function incsequenceno($sequenceno)
{
    if (ord($sequenceno{1})==255)
        {
            return chr(ord($sequenceno{0})+1)."\x00";
        }
    else
        {
            return $sequenceno{0}.chr(ord($sequenceno{1})+1);
        }
}

$socket=socket_create(AF_INET,SOCK_RAW,1);
socket_connect($socket,"localhost",NULL);
$type="\x08";
$code="\x00";
$identifier="\x00\x00";
$sequenceno="\x00\x00";
for ($x=0;$x<4;$x++)
    {
        $data="";
        for ($y=0;$y<7;$y++)
            {
                $data.=chr(rand(0,255));
            }
        $data.="\x00\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37";
        $checksum="\x00\x00";
        $sequenceno=incsequenceno($sequenceno);
        $checksum=calcchecksum($type.$code.$checksum.$identifier.$sequenceno.$data);
        $packet=$type.$code.$checksum.$identifier.$sequenceno.$data;
        socket_write($socket,$packet);
    }
socket_close($socket);
?>

Jedoch weis ehrlich gesagt nicht so wirklich wie ich damit umgehen soll ^^°

Habe es mir schon ein wenig umgeschrieben als Funktion sodass nicht "locahost" angepingt wird sondern natürlich die übergebene IP.

Jedoch weis ich nicht wie ich diese Funktion dann "auswerten" kann.
Das Result bleibt immer NULL ^^

Könnte mir da jem. mal kurz auf die Sprünge helfen?
Bin noch Recht neu bei PHP hoffe allerdings hier Hilfe zu bekommen *g* =]

Vielen Dank im voraus.

Smoki
 
Ein ICMP-Ping mit PHP ist zwar machbar (hab ein Script dafuer daheim liegen, und koennte es sogar mal gepostet haben), braucht aber root-Rechte da ein normaler User keinen Socket oeffnen darf. Das nur mal am Rande.

Wenn ich so schau koennte das sogar mein Script sein was Du da hast. ;) Wie gesagt, nur root darf pingen.
 
Mhh , das ist wirklich nicht so schön.....

Okay , gehen wir mal davon aus es würde als root ausgeführt werden.
*g*

Oder die Kiste würde Windows nutzen ^.^
 
Unter Windows hab ich das nicht getestet, hab ja mit Windows nicht so viel zu tun. ;)
Aber als root hat es bei mir geklappt.

Was genau willst Du denn jetzt haben? Dass Du den "echo reply" empfaengst und dann die Zeit auswertest?
 
Eigentlich will ich nur einen Ping absetzen, und schauen ob ein Response kommt.

Wenn nicht = Kiste offline
Wenn ja = Kiste online.

Sprich nur checken ob ein Response kommt.


Ich denke mal unter Windows sollte das kein Problem sein, da läuft eh fast alles mit Admin-Rechten.
 
Ob ein echo-reply ueber den gleichen Socket zurueck kommt weiss ich nicht, aber ich koennte es mir vorstellen. Ich denk mal genauere Infos dazu duerfte es in RFC 792 geben.

Wie Du im Script sehen koennen duerftest habe ich mich dort nicht mit der Auswertung der Replies beschaeftigt sondern einfach wild geschickt.
Dass es funktioniert hat konnte ich ueber Wireshark bestaetigen. ;)

Edit: Also wenn ich nach socket_write() auch socket_read() einsetze kann ich die Antworten lesen. Das Problem ist dass socket_read() scheinbar wartet bis was kommt, und falls nichts kommt dann eben wohl ewig wartet.

Edit 2: socket_recv() koennte eine Alternative darstellen.
 
Zurück