Proxy-Server für ausgehende Verbindungen unter Linux für PHP festlegen

Diese Anleitung beschreibt wie Sie die IDNT Compute Cloud Proxy Server für ausgehende HTTP oder FTP Verbindungen in PHP konfigurieren.

Einführung

Ausgehende Verbindungen zu externen Seiten sind aus Sicherheitsgründen standardmäßig gesperrt. Dies erschwert zum Beispiel das Nachladen von Schadsoftware über eine von einem Angreifer gefundene Sicherheitslücke. Wir raten den Zugriff auf externe Systeme über unserer Proxy Server durchzuführen und diesen explizit nur an den Stellen im Programm zu ermöglichen, an welchen dieser auch benötigt wird. Die Proxy-Server können bereits einen Großteil möglicher Bedrohungen unterbinden.

In dieser Anleitung stellen wir Ihnen verschiedene Verfahren zur Konfigurationd der Proxy-Server vor.


Systemweite Konfiguration

Die meisten Programme wie zum Beispiel wget nutzen automatisch die über folgende Umgebungsvariablen konfigurierte Proxy Server:

http_proxy Proxy-Server und Port für unverschlüsselte HTTP-Verbindungen
https_proxy Proxy-Server und Port für sichere TLS HTTP-Verbindungen
ftp_proxy Proxy-Server und Port für FTP-Verbindungen
rsync_proxy Proxy-Server und Port für das RSYNC-Protokoll
no_proxy Umgehungsliste (Netzwerke, für welche kein Proxy verwendet werden soll)

Die Angabe des Proxy-Servers erfolgt in folgendem Format: PROTOKOLL://SERVER:PORT

Die no_proxy Variable kann eine mit Komma separierte Liste von Hostnamen, IP-Adressen oder Netzwerken enthalten. Zumindest localhost bzw. 127.0.0.1 sollten hier aufgeführt sein.

Einige wenige Programme nutzen die gleichen Namen jedoch in Großschreibung.

Die oben genannten Umgebungsvariablen werden für die verwendeten Linux-Distribution automatisch bei dem Erstellen einer Maschine konfiguriert. Unter Centos haben wir die Proxy-Server-Konfiguration bei dem Erstellen des Systems automatisch in der Datei /etc/profile.d/proxy.sh hinterlegt. Beispiel:

http_proxy=http://proxy.compute.cloud.idnt.net:8080
HTTP_PROXY=$http_proxy
ftp_proxy=$http_proxy
FTP_PROXY=$http_proxy
https_proxy=$http_proxy
HTTPS_PROXY=$http_proxy
no_proxy=localhost,127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16
NO_PROXY=$no_proxy
export ftp_proxy FTP_PROXY http_proxy HTTP_PROXY https_proxy HTTPS_PROXY no_proxy NO_PROXY

Durch diese Konfiguration ist nach dem Anmelden auf er Kommandozeile automatisch der richtige Proxy-Server konfiguriert.

Hinweis Nutzen Sie bitte immer den angegebenen Hostnamen (proxy.compute.cloud.idnt.net) und niemals IP-Adressen. Die IP-Adressen können je nach Standort und Verfügbarkeit einzelner Server unterschiedlich sein.


Konfiguration für PHP

Für den Zugriff auf externe Ressourcen aus PHP wird meist die interne file API oder curl verwendet. Die oben genannten Umgebungsvariablen stehen standardmäßig nicht in der Umgebung von PHP zur Verfügung. In den folgenden beiden Beispielen wird der Proxy-Server manuell für den jeweiligen Url Abfruf gesetzt.

Die interne File API verwenden

Beispiel Aufruf:

$content = file_get_contents('https://www.idnt.net/de-DE')

Um einen Proxy-Server für diesen Aufruf zu konfigurieren, ist ein stream context erforderlich, welchen Sie wie folgt erstellen:

$options = array(
    'http' => array(
        'proxy' => 'tcp://proxy.compute.cloud.idnt.net',
        'request_fulluri' => true,
    ),
);
$context = stream_context_create($options);
$content = file_get_contents('https://www.idnt.net/de-DE', false, $context)

Weitere Informationen zu den stream context Optionen finden Sie auch direkt unter http://php.net/manual/de/context.php

Proxy global setzen

Warnung! Wir raten den Proxy nach Möglichkeit nicht global zu setzen. Nutzen Sie diese Methode nur, wenn Sie die Anwendungen ausgiebigen Sicherheitstests unterzogen haben.

Wenn Sie den Proxy-Server global setzen möchten, können Sie die Optionen per stream_context_set_default setzen:

stream_context_set_default($context)

Um dies nicht innerhalb des Programmcodes machen zu müssen und den Proxy zentral konfiguriere zu können, ist auch folgende Variante möglich. Erstellen Sie an geeigneter Stelle außerhalb des Webserver- Root- Verzeichnis ein PHP-Script mit folgendem Inhalt:

<?php
        $context = array(
            'http' => array(
                'proxy' => 'tcp://proxy.compute.cloud.idnt.net',
                'request_fulluri' => true,
        );
        stream_context_set_default($context);
?>

Fügen Sie in der Datei php.ini folgende Konfigurationsanweisung hinzu um das Sript global mit einzufügen:

auto_prepend_file=<PFAD ZU SCRIPT>

cURL verwenden

Folgendes Beispiel ruft die Url http://www.idnt.net/de-DE/ ohne Proxy-Server ab:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.idnt.net/de-DE");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
$data = curl_exec($ch);
curl_close($ch);
echo $data;

Um den Proxy-Server zu konfigurieren, erweitern Sie die Optionen einfach wie folgt:

curl_setopt($ch, CURLOPT_PROXY, 'proxy.compute.cloud.idnt.net:8080');
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);

Weitere Informationen zu curl_setopt finden Sie unter http://php.net/manual/de/function.curl-setopt.php.


Proxy-Server global in PHP setzen

Warnung! Wir raten den Proxy nach Möglichkeit nicht global zu setzen. Nutzen Sie diese Methode nur, wenn Sie die Anwendungen ausgiebigen Sicherheitstests unterzogen haben.

Um den Proxy-Server global zu setzen, müssen die Umgebungsvariablen lediglich in der PHP Umgebung verfügbar gemacht werden. Wie dies funktioniert hängt von der verwendeten PHP-Installation ab:

Proxy-Umgebungsvariablen für Apache mit mod_php setzen

Über das Modul mod_env können beliebige Umgebungsvariablen gesetzt werden. Fügen Sie einfach die folgenden Zeilen zur Apache Konfiguration hinzu:

SetEnv http_proxy http://proxy.compute.cloud.idnt.net:8080
SetEnv https_proxy http://proxy.compute.cloud.idnt.net:8080
SetEnv ftp_proxy http://proxy.compute.cloud.idnt.net:8080
SetEnv no_proxy localhost,127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16

Starten Sie Apache hiernach neu.

Proxy-Umgebungsvariablen für PHP-FPM setzen

Hier können wir direkt die systemweite Konfiguration aus der Umgebun übernehmen. Fügen Sie einfach die folgenden Zeilen in Ihre FPM Konfiguration (z.B. php-fpm.d/www.conf) ein:

env[http_proxy] = $http_proxy
env[https_proxy] = $https_proxy
env[ftp_proxy] = $ftp_proxy
env[no_proxy] = $no_proxy

Starten Sie php-fpm hiernach neu.


Sie können uns hier mit Ihrer Bewertung ein kurzes Feedback zukommen lassen. Die Eingabe is optional, wird nicht veröffentlicht und erfolgt anonym (sofern Sie keinen Namen mit angeben).
Ihre Bewertung: