fragen stichworte

iptables dnat funktioniert nicht für https

Ich habe einen http-Server, der die Ports 8080 (http) und 8081 (https) an 127.0.0.1

überwacht

Ich habe diese iptables-Regeln, um von/nach $external_ip umzuleiten:

iptables -t nat -A PREROUTING -i eno1 -p tcp -d $external_ip --dport 80  -j DNAT --to-destination 127.0.0.1:8080
iptables -t nat -A PREROUTING -i eno1 -p tcp -d $external_ip --dport 443 -j DNAT --to-destination 127.0.0.1:8081
  • HTTP (80 zu/von 8080) funktioniert einwandfrei
  • HTTPS (443 bis/von 8081) funktioniert nicht

Der Server ist eine Tomcat-Instanz, die Apache-APR-Bibliotheken zur Handhabung von https-Verbindungen verwendet.

fehlt mir etwas?

UPDATE: Ketten für Tabelle NAT: $ iptables -t nat -L -n -v

Chain PREROUTING (policy ACCEPT 1111 packets, 69838 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   14   724 REDIRECT   tcp  --  eno1   *       0.0.0.0/0            101.0.105.178        tcp dpt:80 redir ports 8080
    6   360 REDIRECT   tcp  --  eno1   *       0.0.0.0/0            101.0.105.178        tcp dpt:443 redir ports 8081

Chain INPUT (policy ACCEPT 1064 packets, 66008 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 9 packets, 596 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 9 packets, 596 bytes)
 pkts bytes target     prot opt in     out     source               destination         

antworten

Ich kann sehen, dass deine Regeln korrekt sind. Die Möglichkeit, den Datenverkehr Ihrer Firewall zu blockieren, wurde bei Ihrer Kommentierung überprüft. Die NAT-Regel wurde mehrmals wie in dem in der Ausgabe von iptables -t nat -L -n -v gezeigten Zähler für Bytes und Pakete angezeigt.

Sie müssen sicherstellen, dass Sie lokal auf den Port 443 zugreifen können, und Sie können überprüfen, ob Ihr Webserver diesen Port mit netstat -lnp abhört.

Workaround (Art von)

Entweder iptables, Tomcat oder Apache APR hört nicht gerne von der Loopback-Schnittstelle.

Ich habe es schließlich mit einer anderen Schnittstelle als lo (127.0.0.1)

gemacht  
iptables -t nat -A PREROUTING -i eno1 -p tcp -d $external_ip --dport 80  -j DNAT --to-destination $local_ip:8080
iptables -t nat -A PREROUTING -i eno1 -p tcp -d $external_ip --dport 443 -j DNAT --to-destination $local_ip:8081

In meinem Fall habe ich eine Dummy-Schnittstelle (Linux-Modul: Dummy) verwendet, weil ich wollte, dass Tomcat von einer "privaten" IP "hört".

Ich poste dies als eine Antwort für zukünftige Leute, die dasselbe Problem haben wie ich, aber ich markiere diese Antwort nicht als die akzeptierte, da ich weder das Problem des Loopbacks lösen noch eine Erklärung dafür liefern kann Warum funktioniert es gut mit http, aber nicht mit https?