Firewall blockt Skript

Datum: 19.10.2013

Das Problem trat auf einem CentOS-Server mit Apache auf. Die Ausführung des Skripts auf der Kommandozeile als root klappte problemlos, der Aufruf über den Webserver allerdings nicht. Grund war ein Socket-Timeout beim Aufruf von fopen.

Folgende triviale Gründe für das Scheitern des Verbindungsaufbaus wurden zuvor ausgeschlossen:

Da root das Skript ausführen konnte, nicht jedoch der Webserver, stellte sich die Frage, unter welchem Benutzer Apache das Skript ausführte:

print "posix_uid: " . posix_getuid() . "\n";

Das Ergebnis war nicht die UID von Apache, wie erwartet, sondern des eigentlichen Benutzers, der die Website betreibt. Offenbar wurde PHP nicht als Modul sondern als CGI ausgeführt.

Damit blieb noch zu prüfen, ob der Benutzer generell ein Problem mit dem Verbindungsaufbau hatte oder ob PHP schuld daran war. Das läßt sich leicht bewerkstelligen, indem man wget eine Seite holen läßt, die definitiv existiert und erreichbar ist:

sudo -u benutzer wget -c http://flashcom.at/index.html

Schlug in diesem Fall allerdings auch fehl. Die naheliegende Überprüfung der Firewall ergab, dass lediglich root Verbindungen nach außen aufbauen konnte.

iptables -L
Chain OUTPUT (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            OWNER UID match root

Die Lösung des Problems war eine zusätzliche Firewall-Regel, die dem Benutzer ebenfalls Verbindungen erlaubte:

/sbin/iptables -A OUTPUT -m owner --uid-owner benutzer -j ACCEPT

Verweise & weiterführende Links

Fragen, Anmerkungen, Korrekturen zu diesem Artikel »