Hallo,
für alle, die - wie ich - vor dem Problem standen (oder stehen), dass sie auf ihren Web Server (hier: NGINX) auf dem Raspberry Pi und auf ihren Fritzbox-Fernzugang über dieselbe IP und (Pseudo-)Domäne (z. B. DSL-Zugang mit Dynamic DNS Provider) zugreifen wollen, hier ein paar Gedanken und eine mögliche Lösung. Ich gehe dabei davon aus, dass der Raspi mit einer internen IP(v4)-Adresse hinter der Fritzbox sitzt, und der Zugriff von außen nur per Port-Weiterleitung der Fritzbox über die öffentliche IP (bzw. dynamische DNS-URL) möglich ist:
- Der unabhängige Zugriff auf beide Dienste ist möglich, wenn auf derselben IP-Adresse unterschiedliche Ports verwendet werden (z. B. 80 für NGINX und 450 für die Fritzbox).
Problem: Aus vielen (z. B. Firmen-)Umgebungen ist der Zugriff nur über die Standard-Ports 80 (ungeschützt) und 443 (mit SSL geschützt) möglich. Diese führen hier jedoch unweigerlich zu Konflikten.
- Der unabhängige Zugriff auf beide Dienste ist möglich, wenn beide Geräte über unterschiedliche IPv6-Adressen verfügen, die von außen sichtbar sind. IPv6-Adressen des Heimnetzes (Fritzbox) können in der Fritzbox explizit mittels IPv6-Freigaben extern bekannt gemacht werden.
Problem: IPv6 ist nicht überall verfügbar.
Somit ist eine etwas universellere Lösung erforderlich. Dabei macht man sich die Eigenschaft zunutze, dass NGINX mit sog. 'Virtual Hosts' unterschiedliche Host-URLs (z. B. http://mydomain.dyndns.net und http://fb.mydomain.dyndns.net) selbst bei identischer IP-Adresse individuell auflösen kann, und zudem als Proxy fungieren kann. Voraussetzung für Ersteres ist, dass der Dynamic-DNS-Anbieter Host-Namen zusammen mit Sub-Host-Namen für dieselbe dynamische DNS-Adresse anbietet (wie z. B. mit http://mydomain.dyndns.net und http://fb.mydomain.dyndns.net). Ich habe hier gute Erfahrungen mit dem Gratisangebot von DTDNS (http://www.dtdns.com) gemacht: Dieser erlaubt, dass beliebige Sub-Hosts auf dieselbe IP-Adresse wie der eigentliche Host gemappt werden (sie nennen das 'wildcards'). Eine generelle Einführung in die Virtual Hosts gibt es z. B. hier: http://www.farinspace.com/nginx-virtual-host/.
Die Proxy-Konfiguration sorgt dann dafür, dass der Zugriff auf die externe IP-Adresse auf die entsprechende interne Adresse umgeleitet wird.
Meine NGINX-Koniguration sieht so aus:
server {
listen 80;
server_name fb.<my_URL>;
return 301 https://$server_name$request_uri; # enforce HTTPS
}
server {
listen 443 ssl; # HTTPS
server_name fb.<my-URL>;
## SSL certificate
ssl_certificate /srv/ssl/server.crt;
ssl_certificate_key /srv/ssl/server.key;
location / {
proxy_pass http://192.168.178.1; # local FritzBox IP
#proxy_set_header X-Real-IP $remote_addr;
#proxy_set_header Host 'fritz.box';
#proxy_redirect http://fritz.box/ https://fb.<my-URL>/;
}
auth_basic 'my-URL Fritzbox';
auth_basic_user_file /etc/nginx/htpasswd;
}
Display More
Die Fritzbox läuft hier unter 192.168.178.1, und wird über den Proxy unter https://fb.<my-URL> erreicht. NGINX auf dem Raspi wird über die reguläre Port-Weiterleitung (typischerweise http(s)://<my-URL> auf Ports 80 und 443) erreicht.
Die Konfigurationsdatei für die Fritzbox wurde inspiriert von http://umija.org/20110002. Anstelle von <my-URL> muss natürlich die eigene dynamische Host-Adresse, z. B. mydomain.dyndns.net, stehen. Entgegen dem unteren Beispiel des vorigen Links wird jedoch ein Sub-Host anstelle eines Unterverzeichnisses verwendet. was mit einem NGINX Virtual Host gut funktioniert. Die im obigen Code auskommentierten Zeilen wurden ebenfalls vom vorigen Link inspiriert, scheinen aber unnötig zu sein. Die Variante mit dem Unterverzeichnis (/fb/) habe ich nicht zum Laufen gebracht.
Die obige Code enthält noch die folgenden zwei Features:
- Wenn man auf die URL regulär (ohne https) zugreift, wird man automatisch auf https (mit SSL) umgeleitet. Da das Fritzbox-Passwort wahrscheinlich unverschlüsselt übertragen wird, ist das sinnvoll.
- In den letzten Zeilen ('auth_basic'...) wird noch eine zusätzliche (einmalige) Authentisierung vor dem Zugriff auf die Fritzbox erzwungen. Dies ist eine zusätzliche Vorsichtsmaßnahme, da man jetzt auf die Fritzbox von außen so zugreift, als käme der Zugriff aus dem Heimnetz (die Fritzbox denkt weiterhin, der Zugriff käme aus dem Heimnetz). Die notwendige Konfiguration findet man z. B. unter http://www.howtoforge.com/basic-http-aut…tion-with-nginx.
Man sollte die Fritzbox auf jeden Fall so konfigurieren, dass sie unbedingt eine Benutzeranmeldung (mit Passwort) erzwingt. Mit der zusätzlichen Authentisierung mit auth_basic hat man dann doppelte Sicherheit.
Das reguläre Web-Angebot von NGINX läuft als weiterer Virtual Host. Dessen Konfigurationsdatei ist Standard, und wir hier nicht gezeigt. Beide Konfigurationsdateien befinden sich im Verzeichnis /etc/nginx/sites-available, und werden mit symbolischen Datei-Links aus /etc/nginx/sites-enabled verlinkt.
Ob eine entspr. Konfiguration auch mit anderen Web Servern möglich ist, weiß ich nicht. Das Proxy-Feature von NGINX ist dafür sicherlich sehr hilfreich.