Ping-Ersatz in PHP

Gast #3623484
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.
Gast #3623539
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?
Gast #3623634
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)
Gast #3624310
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?
#3624418
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.
Gast #3624470
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 ...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren