Ich suchte schon länger nach einer zentralen Möglichkeit, einen im Internet stehenden Server jederzeit per Port Knocking erreichen zu können ohne dafür verschiedene Clients für diverse Betriebssysteme auf einem USB-Stick herumschleppen oder aber feststellen zu müssen, dass der Client im gegenwärtigen Netzwerk nicht funktioniert, da die Knock-Pakete aus irgendwelchen Gründen gefiltert werden.
Da eine Suche nach einer Lösung in PHP erstaunlicherweise zu keinem Ergebnis führte (hat das wirklich noch niemand implementiert?), möchte ich meine Version niemandem vorenthalten:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | function knock($ip, $port, $protocol, $timeout = 10) { ($protocol == 'tcp') ? ($protocol = SOL_TCP) : ($protocol = SOL_UDP); ($protocol == SOL_UDP) ? ($mode = SOCK_DGRAM) : ($mode = SOCK_STREAM); if (!$socket = @socket_create(AF_INET, $mode, $protocol)) { return false; } socket_set_blocking($socket, true); socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array("sec" => $timeout, "usec" => 0)); if (!@socket_connect($socket, $ip, $port)) { return false; } @socket_close($socket); return true; } |
Wichtig ist, bei der Wahl der Ports zu beachten, dass viele Webhoster nicht sämtliche ausgehenden Pakete zulassen. Notfalls muss man also auf die "üblichen Verdächtigen" wie HTTP, FTP etc. setzen, die auf jeden Fall in beide Richtungen geöffnet sind.