
Ich habe eine DDNS-Subdomäne sub1.dom1.com
mit der statischen IP (fiktive IP) 99.88.77.66.55
.
Ich habe eine dom2.com
extern gehostete Domäne mit einem DNS-CNAME-Eintrag, sub2.dom2.com
der sub3.dom2.com
auf dieselbe (wiederum fiktive) IP verweist 99.88.77.66.55
.
Bei 99.88.77.66.55
habe ich ein LAN hinter meiner Firewall. In diesem LAN habe ich drei Server:
- Ein Webserver mit lokalem FQDN von
www.local.lan
mindestens192.168.1.3:80
- Ein Anwendungsserver mit lokalem FDQN von
app.local.lan
mindestens192.168.1.4:8069
- Ein Dateiserver mit lokalem FQDN von
fs.local.lan
mindestens192.168.1.5:2430
Zur Verdeutlichung siehe das Diagramm unten. Alle drei Server laufen als virtuelle Server in Jails auf demselben freeBSD-System (freeNAS).
Was ich erreichen möchte
Gemäß dem obigen Diagramm möchte ich einen Reverse-Proxy-Server hinzufügen, der in einem Jail auf dem oben genannten System ausgeführt wird. Anfragen aus dem WAN müssen basierend auf dem im HTTP-Header angegebenen Hostnamen an den entsprechenden Server weitergeleitet werden.
Überlegungen
- Standard-Hafenweiterleitung:Derzeit greife ich auf diese Server über eine einfache Portweiterleitung auf dem LAN-Router zu. Normalerweise ist das eine akzeptable Lösung, aber wenn es notwendig wird, das Netzwerk aus der Ferne zu stören, wird es zu einer Herausforderung, klare WAN-zu-LAN-Port-Beziehungen beizubehalten. Außerdem ist es für andere Benutzer als mich, die auf diese Server zugreifen müssen, einfacher, sich keine Portnummern merken zu müssen.
- DD-WRT-Anwendung:Da auf meinem Router die DD-WRT-Firmware läuft und ein 4-GiB-USB-Laufwerk installiert ist, habe ich mir überlegt, ob ich auf dem Router einen Reverse-Proxy-Server installieren und ausführen kann, beispielsweise mit Pound oder etwas Ähnlichem. Ich habe im Internet ausführlich nach Möglichkeiten gesucht, dies zu tun. Das Problem, auf das ich gestoßen bin, ist, dass die meisten Anleitungen oder Tutorials veraltet sind und nicht funktionierende Links zu den erforderlichen Ressourcen enthalten.
- Apache/Nginx:Beide scheinen eine praktikable Lösung zu sein. Wie bei den DD-WRT-Lösungen, die ich recherchiert habe, enthalten viele der Anleitungen jedoch entweder defekte oder gar keine Links zu den erforderlichen Ressourcen. Das andere Hindernis, das ich bei den Apache- oder Nginx-Optionen vor mir habe, ist, dass die meisten Anleitungen und Tutorials davon ausgehen, dass ich bereits alles über Apache oder Nginx weiß. Ich beginne ohne vorherige Erfahrung mit einer der beiden Plattformen und bin bereit zu lernen und zu experimentieren, um die Dinge zum Laufen zu bringen. Die Anleitungen und Tutorials zeigen meist nur die
server
Abschnitte des erforderlichen Codes. Außerdem wird davon ausgegangen, dass Sie die erforderlichen Abhängigkeiten bereits kennen und wissen, wie diese implementiert werden.
Schritte, die ich bereits unternommen habe
Nginx: Beispiel aus meiner nginx.conf-Datei. Es ist nur ein Teil. Es gibt andere server
Abschnitte für die anderen Server mit den geänderten relevanten Details.
#nginx.conf
events {
worker_connections 1024;
}
http {
server {
listen 80;
server_name sub1.dom1.com #I've also tried www.lan.lan, here.
access_log off;
error_log off;
location / {
proxy_pass http://192.168.1.3:80/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_ass_x_forwarded_for;
proxy_max_temp_file_size 0;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_ready_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}
}
Beim Verbindungsversuch wird jedoch der Fehler 502 – Bad Gateway zurückgegeben.
Apache: Wichtig zu beachten ist, dass ich dies mit Apache22 versucht habe. Meine neueste httpd.conf-Datei sieht folgendermaßen aus:
LoadFile /usr/local/bin/libxml2.so
LoadModule proxy_html_module libexec/apache22/mod_proxy_html.so
LoadModule xml2enc_module libexec/apache22/mod_xl2enc.so
<VirtualHost *:80>
ServerName sub1.dom1.com
ServerAlias sub1.dom.com
ProxyPass / http://192.168.1.3:80/
ProxyPassReverse / http://192.168.1.3:80
</VirtualHost>
<VirtualHost *:80>
ServerName sub2.dom2.com
ServerAlias sub2.dom2.com
ProxyPass / http://192.168.1.4:8069/
ProxyPassReverse / http://192.168.1.4:8069
</VirtualHost>
<VirtualHost *:80>
ServerName sub3.dom2.com
ServerAlias sub3.dom2.com
ProxyPass / http://192.168.1.5:2430/
ProxyPass / http://192.168.1.5:2430
</VirtualHost
Wenn ich versuche, Apache22 zu starten, verwende ich:
service apache22 start
Ich erhalte folgendes:
Invalid command 'ProxyPass', perhaps misspelled or defined by a module not included in the server configuration
Nach langer Recherche weiß ich, dass dies höchstwahrscheinlich daran liegt, dass ich nur eines der vielen erforderlichen mod_proxy
Module geladen habe, nämlich das mod_proxy_html
Modul. Der Grund dafür ist, dass ich nach umfangreicher Suche nur einen funktionierenden Link für dieses spezielle Modul finden konnte.
Pfund: Beim Versuch, ipkg auf DD-WRT zu installieren, traten Probleme auf. Dies könnte an der Atheos-Architektur meines Routers liegen. Wie bereits erwähnt, stieß ich auch auf viele defekte Links.
Ok, nachdem ich die langatmige Erklärung hinter mich gebracht habe, kann ich nun sagen, was ich von der Community erwarte.
Da ich mit Nginx am nächsten gekommen bin, wie kann ich meine nginx.conf
Datei richtig einrichten, damit sie das tut, was ich versuche? Was verursacht den 502-Fehler und wie behebe ich ihn?
Antwort1
Für die Nginx-Lösung:
server_name
sollte immer der angeforderte Hostname sein (im HTTP-Header).
- Sie können hier ein einfügen,
*
um den Inhalt auf jeder Domäne/jedem Host verfügbar zu machen.
proxy_pass
sollte nicht mit einem enden /
, außer in besonders erforderlichen Fällen.
Am häufigsten habe ich gesehen 502 Bad gateway
, dass Nginx keine Verbindung zum Upstream herstellen kann ( proxy_pass
).
- Haben Sie Ihre Firewall-Richtlinie für DMZ->LAN überprüft?
- Haben Sie
error.log
nach Hinweisen gesucht?