iptables redirige les requêtes externes vers 127.0.0.1

41

J'ai un service fonctionnant sur 127.0.0.1 avec le port 2222. Je dois transférer toutes les demandes vers 192.168.2.2:2222 (adresse IP extérieure) uniquement à partir du sous-réseau 192.168.1.0/24 à 127.0.0.1:2222.

J'essaie de l'utiliser, mais ça ne marche 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 le faire fonctionner?

UPD: Modifier le schéma d'adresse.

SimWhite
la source
Nous avons besoin de clarification. D'où vient le trafic? Où va le trafic à l'origine? Où le trafic devrait-il aller? Au moment où je l'ai lu, vous souhaitez que le trafic allant de 192.168.1.0/24 à 127.0.0.1:2222 soit redirigé vers 12.23.34.45:2222. Mais la réponse de Warren suppose que vous souhaitez que le trafic de 192.168.1.0/24 à 12.23.34.45:2222 soit redirigé vers 127.0.0.1:222
Patrick, le
1
Le trafic provient du sous-réseau 192.168.1.0/24 en 192.168.2.2:2222 et doit être traduit en service sur 127.0.0.1:2222. Je suis corrigé schéma d'adresse.
SimWhite
1
Vous voulez une règle qui autorise le trafic à se connecter 2222sur l'interface de bouclage depuis un sous 192.168.1.0/24- réseau ? Ce n'est pas simplement un type de règle d'installation. Voir ici: debuntu.org/…
slm
Oui. Si j'ai bien compris, je dois ajouter une règle de masq? Le transfert IP est déjà activé, bien sûr.
SimWhite
Pourquoi ne pas l'exécuter sur une "vraie" IP et filtrer le trafic provenant de sources indésirables? C'est à quoi servent les pare-feu, essentiellement ...
vonbrand le

Réponses:

60

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

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

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

Par défaut, cette valeur est 0ce qui indique au noyau de ne pas router le trafic externe destiné à 127.0.0.0/8. Ceci 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 2222la correspondance de destination, ce qui signifie que si votre machine tente de communiquer avec un autre hôte sur le port 2222 (c.-à-d. Le trafic sortant), elle sera également redirigée. Vous devez soit changer le -dmatch -d 192.168.2.2, soit ajouter -i eth0(ou quel que soit votre numéro de portable).

Patrick
la source
8
Cette information est étonnamment difficile à trouver.
Wren T.
Oui, des informations très difficiles à trouver! Merci! Mais je n'ai pas route_localnet. Y a-t-il eu d'autres noms pour cela? (sous Linux 2.6.30) ls /proc/sys/net/ipv4/conf/lan/: accept_redirects arp_accept arp_filter arp_notify disable_policy force_igmp_version log_martians medium_id proxy_arp secure_redirects shared_media accept_source_route arp_announce arp_ignore bootp_relay disable_xfrm expédition mc_forwarding promote_secondaries rp_filter send_redirects tag
IMZ - Ivan Zakharyaschev
Je vois, le correctifroute_localnet est plus récent (7 juin 2012) que mon noyau (2.6.30-std-def-alt15 # 1 SMP Mon Dec 14 14:45:48 UTC 2009). Ok, je vais simplement réaliser la redirection de port souhaitée (de l’extérieur vers l’intérieur) avec un processus de redirection comme netcat( nc) xinetd, ou les options de redirection de port de ssh(cette dernière option est inefficace et stupide, bien sûr, mais je le mentionne, parce que, eh bien, cette possibilité est là).
imz - Ivan Zakharyaschev
2
Mes 2 centimes: vous pouvez activer ce paramètre pour toutes les interfaces avecsysctl -w net.ipv4.conf.all.route_localnet=1
Dmitriusan
Comme d'autres, cette information était difficile à trouver. Merci, si j'avais trouvé cela plus tôt, m'aurait épargné une tonne d'effort.
Stephen Simpson
3

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 interfaces réelles. Essayez d'utiliser REDIRECT.

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

dresende
la source
C'est probablement la meilleure réponse sans le sysctl vaudou ...
Lester Cheung
N'aide toujours pas si le port 222 est uniquement écouté sur localhost (la règle ne changera pas l'adresse de destination)
sanmai
Dans ce cas, utilisez-j DNAT --to-destination w.x.y.z:222
dresende
2

Que faire si la bonne réponse avec route_localnetne fonctionne pas? ..

Si votre noyau n'inclut pas le correctifroute_localnet , alors ... mettez-le à niveau!

Ou bien, il existe d'autres moyens de transférer le trafic arrivant d'une interface à un autre sur une autre interface (en particulier vers localhost) en exécutant un processus qui écoute sur l'interface externe et transfère le trafic.

netcat( nc), xinetdet ssh(et peut-être davantage) sont tous des exemples de programmes capables de le faire (bien que choisir sshserait étrange et inefficace).

J'ai écrit une configuration xinetdpour 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 correspond au 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!

imz - Ivan Zakharyaschev
la source