Forum: PC-Programmierung Ping-Ersatz in PHP


von Frank (Gast)


Lesenswert?

Ich habe mir für das per VPN erreichbare NAS in der Firma ein PHP-Script 
gebaut, das per WOL den Server wecken kann. Das finktioniert im Prinzip.

Nun, auf den Geschmack bekommen, möchte ich auch sehen, ob der Server 
nun schon gestartet ist. Da ein echtes ICMP per purem PHP wohl nicht 
möglich ist, habe ich ein Socket erzeugt und versuche mit diesem auf den 
Port 139 ("windows net share") zu connecten. Klappt das, trenne ich die 
Verbindung sofort wieder und ich kann das Ergebnis in Form einer 
grafischen "LED" anzeigen.

Bei mir zuhause mit einem XP-Rechner und einem Qnap-NAS als Webserver 
klappt das problemlos. In der Firma läuft WinServer 2012 R2 und eine 
Synology als Webserver - da geht das nicht. Da bekomme ich immer den 
Error 101 ("Network is unreachable"), was aber so dirket Quatsch ist.

Wohl gemerkt, die WOL-Routine funktioniert in beiden Umgebungen, nur das 
Pseudo-Ping nicht. Woran könnte das liegen? Die Firewall ist für lokale 
Adressen auf dem Server aus.

von Jörg E. (jackfritt)


Lesenswert?

Ich meine Socket für Ping benötigen unter linux auch root rechte. Dort 
geht es leider ohne root auch nicht.
Warum sollte es unter windows anders sein?

von Frank (Gast)


Lesenswert?

Jörg Esser schrieb:
> Ich meine Socket für Ping benötigen unter linux auch root rechte.
> Dort
> geht es leider ohne root auch nicht.
> Warum sollte es unter windows anders sein?

Ich mache ja kein echtes Ping, sondern versuche per TCP auf einen 
offenen Port der Windows-PC zu connecten.

Zuhause benutze ich ein Qnap-NAS (Linux) und einen XP-PC. Geht.
Im Büro benutze ich ein Synology-NAS (Linux) und einen W2K12-Rechner. 
Heht nicht.

Win-Firewalls sind aus.

Ich sehe da nicht wirklich einen tiefgreifenden Unterschied, obwohl er 
offenbar besteht. Nur wo?

von bluppdidupp (Gast)


Lesenswert?

Ich würde mal stattdessen Port 445 versuchen (SMB/CIFS direkt über TCP), 
Kommunikation über Port 139 ist mit mehr Overhead verbunden und 
eigentlich veraltet (aber aus Kompatibilitätsgründen manchmal zusätzlich 
aktiv)

Jörg Esser schrieb:
> Ich meine Socket für Ping benötigen unter linux auch root rechte. Dort
> geht es leider ohne root auch nicht.
> Warum sollte es unter windows anders sein?

Raw-Sockets sind dort (unter halbwegs aktuellen Windows-Versionen) 
selbst mit Admin-Rechten stark eingeschränkt ;D
Es gibt zum Pingen allerdings APIs die keine speziellen Berechtigungen 
erfordern (Die "IcmpSendEcho"-Funktionen - oder eben "ping.exe" aufrufen 
;D)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Frank schrieb:
> Ich mache ja kein echtes Ping, sondern versuche per TCP auf einen
> offenen Port der Windows-PC zu connecten.

Du hast bislang nicht erwähnt, wo Dein PHP-Script läuft. Auf dem 
Webserver des jeweiligen NAS? Daß der bei NAS unterschiedlicher 
Hersteller unterschiedlich konfiguriert sein könnte, das hast Du schon 
in Betracht gezogen?

von ich (Gast)


Lesenswert?

versuch mal ein wget auf eine kleine Datei

von Frank (Gast)


Lesenswert?

Irgendwie habe ich wohl nicht genau genug beschrieben, was mein Problem 
ist, denn die Antworten gehen ziemlich durcheinander - so dass ich nicht 
einschätzen kann, welche Hinwiese nützlich sind und welche unpassend.

Also nochmal:

Mittels PHP-Skript, das auf dem Webserver eines NAS läuft, soll per WOL 
ein Windows-Server geweckt werden. DAS funktioniert.

Zusätzlich soll auf der Mini-Webseite dargestellt werden, ob bzw. wann 
der Server "erwacht" und betriebsbereit ist. Dazu würde sich ein Ping 
anbieten, was aber per PHP nativ nicht möglich ist.

Also habe ich nach einer Alternative gesucht. Die besteht darin, einen 
TCP-Socket zu öffnen und ein Connect auf einen offenen Port der 
Windows-Maschine zu versuchen, ohne irgendwelche Protokolle 
nachzustellen. Alleine die Tatsache, dass ein Connect möglich ist (und 
der ohne jede Kommunikation gleich wieder geschlossen wird - wie bei 
einem Portscanner), sollte ja nachweisen, dass der Server "lebt".

Diese Technik habe ich zuhause zwischen einem Qnap und einem XP-PC 
getestet und sie funktioniert. Im Büro zwischeneiner Synology und einem 
Windows-Server 2012 geht Nichts.

Vermutlich liegt das an der Konfiguratuion der Synology, denn der Server 
hat offene Ports (ist ja im LAN), wie ein Portscan beweist.

Aber wo kann ich da suchen? Wer konfiguriert ein PHP so, dass keine 
Sockets funktionieren?

von Reinhard S. (rezz)


Lesenswert?

Frank schrieb:
> Aber wo kann ich da suchen?

Lad auf beiden mal eine PHP-Datei mit
1
<?php
2
phpinfo();
3
?>
hoch und vergleich die Einstellungen. Achtung, dieses Wissen ist noch 
aus PHP4-Zeiten, kann also veraltet sein.

> Wer konfiguriert ein PHP so, dass keine
> Sockets funktionieren?

Braucht man die für einen "normalen" Webserver? Ja eigentlich nicht, und 
was abgeschalten ist kann auch nicht missbraucht werden.

von Frank (Gast)


Lesenswert?

Ich habe das mit der Funktion phpinfo gemacht und es gibt tatsächlich 
Unterschiede zwischen Qnap und Synology. In der Wirkung muss das aber 
nur TCP-Sockets betreffen, denn die WOL-Funktion klappt auf beiden 
Systemen - die wird mit UDP-Sockets realisiert.

Auf den Qnap (PHP-TCP-Sockets funktionieren) sieht das "configure 
command" so aus (sorry für das unformatierte Chaos, is aber so):
1
'./configure' '--prefix=/root/daily_build/4.0.2/Model/TS-220/../../NasMgmt/HTTP/php5' '--with-config- file-path=/etc/config/php.ini' '--with-config-file-scan-dir' '--with-apxs2=/usr/local/apache/bin/apxs' '--enable-ftp' '--enable-sockets' '--with-gettext' '--with-zlib' '--with-jpeg-dir' '--with-png-dir' '--with-gd' '--with- freetype-dir=/usr' '--enable-gd-native-ttf' '--enable-mbstring' '--with-openssl-dir' '--with-libxml-dir=/opt /cross-project/arm/marvell/arm-none-linux-gnueabi/libc/marvell-f/usr' '--enable-sqlite-utf8' '--with- mysql=/root/daily_build/4.0.2/Model/TS-220/../../DataService/DBMS/mysql' '--enable-shared' '--with- mcrypt' '--enable-zend-multibyte' '--with-iconv=/opt/cross-project/arm/marvell/arm-none-linux-gnueabi /libc/marvell-f/usr' '--enable-exif' '--with-pdo-mysql=/root/daily_build/4.0.2/Model/TS-220/../../DataService /DBMS/mysql' '--with-curl=/root/daily_build/4.0.2/Model/TS-220/../../SysUtil/curl-7.21.0' '--with- curlwrappers=/root/daily_build/4.0.2/Model/TS-220/../../SysUtil/curl-7.21.0' '--with-xsl=/opt/cross-project /arm/marvell/arm-none-linux-gnueabi/libc/marvell-f/usr' '--with-openssl' '--with-pic=yes' '--with-mysqli' '--enable-calendar' '--enable-bcmath' '--with-ldap=/opt/cross-project/arm/marvell/arm-none-linux-gnueabi /libc/marvell-f/usr' '--with-imap=/opt/cross-project/arm/marvell/arm-none-linux-gnueabi/libc/marvell-f/usr' '--with-imap-ssl=/opt/cross-project/arm/marvell/arm-none-linux-gnueabi/libc/marvell-f/usr' '--enable-dba' '--enable-dbase' '--enable-shmop' '--enable-wddx' '--enable-zip' '--with-xmlrpc' '--enable-soap' '--enable- pcntl'

Auf der Synology (PHP-TCP-Sockets funktionieren nicht) sieht das 
"configure command" so aus:
1
'./configure.syno' '--host=i686-linux-gnu' '--target=i686-linux-gnu' '--build=i686-pc-linux' '--with- ldap=shared,/usr/syno' '--with-ldap-sasl=/usr/syno' '--prefix=/usr/syno/php' '--with-apxs2=/usr /syno/apache/bin/apxs' '--disable-cgi' '--with-config-file-path=/usr/syno/etc' '--with-config-file-scan- dir=/usr/syno/etc/php' '--with-libxml-dir=/usr/syno' '--with-bz2=/usr/syno' '--with-zlib=shared,/usr/syno' '--enable-bcmath=shared' '--enable-syno_compiler=shared' '--enable-calendar=shared' '--with- curl=shared,/usr/syno' '--enable-dba=shared' '--enable-exif=shared' '--enable-ftp=shared' '--with- gd=shared' '--with-jpeg-dir=/usr/syno' '--with-png-dir=/usr/syno' '--with-freetype-dir=/usr/syno' '--enable- gd-native-ttf' '--with-gettext=shared' '--with-iconv=shared,/usr/syno/libiconv' '--with-imap=shared,/source /imap-2007e' '--with-imap-ssl=shared,/usr/syno' '--enable-mbstring=shared' '--with-mcrypt=shared,/usr /syno' '--with-mysql=shared,/usr/syno/mysql' '--with-mysqli=shared,/usr/syno/mysql/bin/mysql_config' '--with-openssl=shared,/usr/syno' '--with-pdo-mysql=shared,/usr/syno/mysql' '--with- pdo-pgsql=shared,/usr/syno/pgsql' '--with-pgsql=shared,/usr/syno/pgsql' '--enable-shmop=shared' '--enable-soap=shared' '--enable-sockets=shared' '--enable-wddx=shared' '--with-xmlrpc=shared' '--enable-zip=shared' '--with-sqlite3=static,/usr/syno/sqlite3' '--with-pdo-sqlite=static,/usr/syno/sqlit

Abgesehen davon, dass es sichtbare Unterschiede gibt, wie ändere ich die 
auf der Synology? Bin kein Linux-Experte ...

von Jörg E. (jackfritt)


Lesenswert?

@Uhu
Genau so habe ich es nach missglückten Versuchen mit der PingSocket 
Version von php.net auch gemacht. Allerdings braucht php die rechte für 
exec. ;)
Kann bei ihm also auch nach hinten losgehen.

von Roland P. (pram)


Lesenswert?

Kannst du in /proc/net/arp nachsehen ob die IP "online" ist?
Die Info ist ggf. etwas zeitverzögert.

Gruß
Roland

von matschbirne (Gast)


Lesenswert?

Frank schrieb:

Lade einfach eine Datei per file_get_contents, das hat auch einen 
Timeout.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.