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.
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).
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
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!