
Ich verwende Apache, um eine Subdomäne auf einen Port ( mod_proxy
, mod_proxy_http
, mod_proxy_ajp
) umzuleiten, und IP-Tabellen, um den direkten Portzugriff außer auf mich und den lokalen Server einzuschränken.
Meine IP-Tabellen sehen folgendermaßen aus:
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP tcp -- !c-24-7-110-109.hsd1.ca.comcast.net anywhere tcp dpt:tproxy
ACCEPT tcp -- localhost anywhere tcp dpt:tproxy
DROP tcp -- !c-24-7-110-109.hsd1.ca.comcast.net anywhere tcp dpt:http-alt
DROP tcp -- !c-24-7-110-109.hsd1.ca.comcast.net anywhere tcp dpt:webmin
ACCEPT tcp -- localhost anywhere tcp dpt:webmin
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Der Kontext, den ich in diesem Beitrag verwenden werde, ist:
Sonatype Nexus:nexus.example.com => example.com:8081
Jenkins CI:jenkins.example.com => example.com:8080
Webmin:webmin.example.com => example.com:10000
Was bei mir derzeit funktioniert, ist, dass es keinen direkten Portzugriff außer für mich gibt. Ich möchte auch, dass das lokale System auf Ports zugreifen kann, und das ist, glaube ich, das, was ich jetzt habe. Ich verwende es mod_proxy_ajp
für Jenkins CI und Webmin und mod_proxy_http
für Sonatype Nexus.
Wenn ich direkte Ports besuche, wird jeder dieser Dienste problemlos geladen. Wenn ich jemand anderen gebeten habe, die Dienste zu laden, kann er das nicht, also funktioniert es.
Wenn ich jetzt jedoch versuche, auf eine der Subdomänen zuzugreifen, werde ich nicht endend geladen (Endlosschleife?).
Wenn ich jedoch ein Tracert auf der Subdomäne ausführe, endet es einwandfrei, sodass ich die Endlosschleife streichen kann.
Hier ist meine Sonatype Nexus Apache-Virtual-Host-Konfiguration:
<VirtualHost *:80>
ServerName nexus.majornoob.com
ServerAlias www.nexus.majornoob.com
ProxyRequests Off
ProxyPreserveHost On
ProxyPass / http://localhost:8081/
ProxyPassReverse / http://localhost:8081/
ProxyPassReverseCookiePath / /
ErrorLog /var/www/majornoob/error-nexus.log
LogLevel warn
CustomLog /var/www/majornoob/access-nexus.log combined
</VirtualHost>
und hier ist mein Jenkins:
<VirtualHost *:80>
ServerName jenkins.majornoob.com
ServerAlias www.jenkins.majornoob.com
ProxyRequests Off
ProxyPreserveHost On
ProxyPass / ajp://127.0.0.1:8080/
ProxyPassReverse / ajp://127.0.0.1:8080/
ProxyPassReverseCookiePath / /
ErrorLog /var/www/majornoob/error-jenkins.log
LogLevel warn
CustomLog /var/www/majornoob/access-jenkins.log combined
</VirtualHost>
Diese beiden Beispiele für virtuelle Hosts verwenden mod_proxy_ajp
bzw. mod_proxy_http
.
Kann mir jemand helfen herauszufinden, warum ich eine unendliche Last bekomme?
Danke.
bearbeiten:Kümmern Sie sich nicht um die Endlosschleife. Nach einiger Zeit erhielt ich die Fehlermeldung „503 Service Unavailable“.
Antwort1
Die iptables-Regeln werden der Reihe nach ausgewertet, von oben nach unten, wie gedruckt. Ihr Problem besteht darin, dass die Proxy-Verbindung von localhost stammt, was dieser Regel entspricht:
DROP tcp -- !c-24-7-110-109.hsd1.ca.comcast.net anywhere tcp dpt:tproxy
localhost
ist nicht c-24-7-...
, also wird die Verbindung abgebrochen. Das Proxy-Modul läuft irgendwann ab; wenn die Regel REJECT statt DROP wäre, würden Sie viel schneller eine Fehlermeldung erhalten (weil Sie explizit abgelehnt würden, anstatt dass der Verbindungsversuch einfach verschwindet).
Die Lösung ist ganz einfach: Ordnen Sie die Regeln so an, dass „Akzeptieren von lokalem Host“ vor „Ablehnen von irgendwo anders“ steht. (IP-Routing stimmt am genauesten überein, aber da iptables mehrstufig ist, ist das nicht unbedingt definiert.)
Ich würde im Allgemeinen empfehlen, eine erste Regel zu haben, die die gesamte Localhost-Kommunikation zulässt (über die Loopback-Schnittstelle, nur für den Fall, dass jemand etwas Seltsames über das Ethernet versucht); versuchen Sie hinzuzufügen
iptables -I INPUT -i lo -s localhost -d localhost -j ACCEPT
-I
um ( ) das oben in der Liste einzufügen .