Vraag iptables port redirect werkt niet voor localhost


Ik wil al het verkeer omleiden van poort 443 naar de interne poort 8080. Ik gebruik deze configuratie voor iptables:

iptables -t nat -I PREROUTING --source 0/0 --destination 0/0 -p tcp \
         --dport 443 -j REDIRECT --to-ports 8080

Dit werkt voor alle externe klanten. Maar als ik probeer om toegang te krijgen tot de poort 443 van dezelfde machine krijg ik een fout in de verbinding geweigerd.

wget https://localhost

Hoe kan ik de iptables-regel uitbreiden om ook lokaal verkeer door te sturen?


47
2017-12-11 11:41


oorsprong


Dit onderwerp biedt een meer algemeen antwoord: serverfault.com/questions/380447/iptables-preroute-localhost - Jeroen
Kan iemand met een rep een backslash toevoegen aan de opdracht vóór de regeleinde? - Ciro Santilli 新疆改造中心 六四事件 法轮功


antwoorden:


PREROUTING wordt niet gebruikt door de loopback-interface, u moet ook een OUTPUT-regel toevoegen:

iptables -t nat -I PREROUTING -p tcp --dport 443 -j REDIRECT --to-ports 8080
iptables -t nat -I OUTPUT -p tcp -o lo --dport 443 -j REDIRECT --to-ports 8080

63
2017-12-11 12:34



Geen behoefte aan de eerste regel. De lokaal gegenereerde pakketten worden niet doorgegeven via de PREROUTING-keten. - Khaled
Ik voegde de initiële regel voor compeletion sake toe, omdat hij wil dat ook extern verkeer wordt omgeleid. De regel heeft geen bron / bestemming nodig als ze alleen zeggen om alle IP's te accepteren - Andy
oh appologieën Ik heb je antwoord niet gezien toen ik antwoordde. - Andy
Hoi Andy, ik krijg nog steeds verbinding met server.com | <ip> |: 443 ... mislukt: verbinding geweigerd. - Chris
Hallo Chris, is dat het verbinden met localhost | 127.0.0.1 | 443 of is dat het domein? Als de laatste en u het vanaf uw server uitvoeren, hebt u mogelijk een probleem met de interne routering. U kunt dit controleren door wget te proberen server.com:8080 (hoewel ik veronderstel dat de reden dat u poort doorstuurt, is omdat het extern is geblokkeerd?). Mijn eigen VPC heeft dat probleem, maar u kunt eventueel een oplossing verzinnen door het domein te definiëren als 127.0.0.1 in uw / etc / hosts-bestand. - Andy


Om pakketten om te leiden van localhost naar een ander apparaat, geldt de regel:

 iptables -t nat -A OUTPUT -o lo -d 127.0.0.1 -p tcp --dport 443 -j DNAT  --to-destination 10.x.y.z:port

zal werken, MAAR je moet ook deze optie inschakelen in de kernel:

sysctl -w net.ipv4.conf.all.route_localnet=1

Zonder die kernelinstelling zal het niet werken.


7
2018-06-16 02:24



Dat zou ook werken. Ik denk dat het schoner is om alles in iptables te doen. - quadruplebucky
Eigenlijk is de kernel-instelling genoodzakelijk als de bestemming zich op een andere machine bevindt, een VM of een externe machine regelt.
het is niet als je de twee regels hebt zoals Andy hierboven suggereerde. - quadruplebucky
Sorry, ik had het over het geval van doorsturen naar een andere machine waar DNAT niet werkt. Ik keek naar dit antwoord voor een oplossing voor een probleem toen ik probeerde iets door te sturen dat dacht dat het verbinding maakte met localhost met een containter op dezelfde computer. Bijvoorbeeld het uitvoeren van de nameserver in een container voor lokale query's.
Eigenlijk is het 'afhankelijk van de kernelversie> = 3.6, blijkbaar. - quadruplebucky


Wat denk je hiervan?

iptables -t nat -A OUTPUT -d 127.0.0.1   -p tcp --dport 443 -j REDIRECT - naar-poort 8080


2
2017-12-11 17:28





Je zei dat je het krijgt Verbinding geweigerd fout. Dit betekent dat er geen lokaal proces luistert op de poort waarmee u verbinding probeert te maken! Gebruik de volgende opdracht om de luisterprocessen te controleren:

$ sudo netstat -lnp | grep 8080

Na het toepassen van de regel, zou u een proces moeten hebben dat op poort 8080 luistert om verbonden te worden.

Het lijkt erop dat u in plaats daarvan de volgende regel zou moeten hebben:

$ iptables -t nat -I OUTPUT --source 0/0 --destination 0/0 -p tcp
                                       --dport 443 -j REDIRECT --to-ports 8080

Vergeet niet dat u verzendt vanaf de lokale host. U moet dus het uitvoerpakket omleiden.


1
2017-12-11 11:44



Bedankt voor je antwoord. Het proces luistert naar poort 8080. Daarom wil ik al het verkeer naar die poort omleiden. - Chris
Weet je zeker dat het proces ook luistert op de loop-interface? Het kan alleen maar luisteren op je fysieke interface. Meestal zal uw webserver moeten luisteren naar 0.0.0.0 in plaats van bijvoorbeeld 192.168.10.0 - MrMajestyk