web-dev-qa-db-fra.com

iptables redirige les requêtes externes vers 127.0.0.1

J'ai un service fonctionnant sur 127.0.0.1 avec le port 2222. J'ai besoin de transmettre toutes les demandes à 192.168.2.2:2222 (hors IP) uniquement à partir du sous-réseau 192.168.1.0/24 à 127.0.0.1:2222.

J'essaie de l'utiliser, mais cela ne fonctionne pas.

$ iptables -t nat -I PREROUTING -p tcp -d 192.168.1.0/24 --dport 2222 -j DNAT --to-destination 127.0.0.1:2222

Comment puis-je faire en sorte que cela fonctionne?

UPD: Modifier le schéma d'adresse.

46
SimWhite

La règle iptables que vous utilisez fonctionnera, mais vous devez apporter une modification supplémentaire:

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

(en remplaçant eth0 avec le nic 192.168.2.2 réside sur)

Par défaut, cette valeur est 0, qui demande au noyau de ne pas router le trafic externe destiné à 127.0.0.0/8. C'est juste pour la sécurité car un tel trafic n'est pas normal.


Remarque supplémentaire: votre règle iptables actuelle est trop large. Votre règle spécifie -d 192.168.1.0/24 --dport 2222 comme correspondance de destination, ce qui signifie que si votre machine essaie de parler à un autre hôte sur le port 2222 (c'est-à-dire le trafic sortant), il sera également redirigé. Vous devez soit modifier le -d correspondre à -d 192.168.2.2, ou ajoutez -i eth0 (ou quel que soit votre nic).

65
Patrick

Vous pouvez rediriger vers localhost mais pas vers le bouclage (127.0.0.0/8). Le bouclage est une échappatoire. Vous devez rediriger vers l'une de vos véritables interfaces. Essayez d'utiliser REDIRECT.

iptables -t nat -A PREROUTING ..... -j REDIRECT --to-port 222

3
dresende

Et si la bonne réponse avec route_localnet ne fonctionne pas? ..

Si votre noyau ne comprend pas le patch pour route_localnet , alors ... mettez à jour le noyau!

Ou il existe d'autres façons de transférer le trafic provenant d'une interface vers un autre port sur une autre interface (en particulier, vers localhost) en exécutant un processus qui écouterait sur l'interface externe et transmettrait le trafic.

netcat (nc), xinetd et ssh (et peut-être plus) sont tous des exemples de programmes capables de le faire (bien que choisissant ssh serait étrange et inefficace).

J'ai écrit une configuration pour xinetd pour cela. Maintenant, ce service est automatiquement mis en place:

# cat /etc/xinetd.d/z-from-outside 
# default: off
# description: Forward connections to the z port.
service z-from-outside
{
    disable         = no
    socket_type     = stream
    type        = UNLISTED
    wait            = no
    user            = nobody
    bind        = vaio.ob
    port        = 7070
    redirect    = localhost 7070
}
# 

(vaio.ob est le nom de cet hôte sur l'interface réseau externe.)

Après un service xinetd reload, vérifions qu'il écoute:

# lsof -i -P | fgrep 7070
xinetd    556      root    6u  IPv4 1797906      0t0  TCP vaio.ob:7070 (LISTEN)
sshd    27438 tun_zzoom    4u  IPv4 1059100      0t0  TCP localhost.localdomain:7070 (LISTEN)
# 

Et en effet, les connexions passent!