web-dev-qa-db-fra.com

La redirection de port iptables ne fonctionne pas pour localhost

Je veux rediriger tout le trafic du port 443 vers le port interne 8080. J'utilise cette configuration pour iptables:

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

Cela fonctionne pour tous les clients externes. Mais si j'essaie d'accéder au port 443 à partir de la même machine, j'obtiendrai une erreur de connexion refusée.

wget https://localhost

Comment puis-je étendre la règle iptables pour rediriger également le trafic local?

55
Chris

PREROUTING n'est pas utilisé par l'interface de bouclage, vous devez également ajouter une règle OUTPUT:

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
70
Andy

Pour rediriger les paquets de l'hôte local vers une autre machine, la règle:

 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

fonctionnera, MAIS vous devez également activer cette option dans le noyau:

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

Sans ce noyau, cela ne fonctionnera pas.

10
user420606

Que dis-tu de ça?

iptables -t nat -A OUTPUT -d 127.0.0.1 -p tcp --dport 443 -j REDIRECT --to-port 8080

3
Athanasios

Vous avez dit que vous obtenez connexion refusée erreur. Cela signifie qu'il n'y a aucun processus local d'écoute sur le port auquel vous essayez de vous connecter! Pour vérifier les processus d'écoute, utilisez la commande:

$ Sudo netstat -lnp | grep 8080

Après avoir appliqué la règle, vous devriez avoir un processus d'écoute sur le port 8080 pour vous connecter.

Il semble que vous devriez plutôt avoir la règle suivante:

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

N'oubliez pas que vous envoyez depuis l'hôte local. Vous devez donc rediriger le paquet de sortie.

2
Khaled