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?
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
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.
Que dis-tu de ça?
iptables -t nat -A OUTPUT -d 127.0.0.1 -p tcp --dport 443 -j REDIRECT --to-port 8080
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.