IPTables - Port vers un autre ip & port (de l'intérieur)

10

J'ai actuellement un boîtier NAS fonctionnant sous le port 80. Pour accéder au NAS de l'extérieur, j'ai mappé le port 8080 au port 80 sur le NAS comme suit:

iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 10.32.25.2:80

Cela fonctionne comme un charme. Cependant, cela ne fonctionne que si j'accède au site Web depuis l'extérieur du réseau (au travail, dans une maison différente, etc.). Donc, lorsque je tape mywebsite.com:8080, IPTables fait le travail correctement et tout fonctionne bien.

Maintenant, le problème que j'ai est, comment puis-je rediriger ce port de l'intérieur du réseau? Mon nom de domaine mywebsite.compointe vers mon routeur (mon serveur Linux) de l'intérieur (10.32.25.1) mais je veux rediriger le port 8080 vers le port 80 sur 10.32.25.2 de l'intérieur.

Un indice?

Éditer # 1

En essayant d'aider à faciliter cette question, j'ai assemblé ce diagramme. N'hésitez pas à mettre à jour s'il est incorrect ou dénaturé ce que vous recherchez.

                                 iptables
                                     |                   .---------------.
    .-,(  ),-.                       v               port 80             |
 .-(          )-.        port 8080________               |               |
(    internet    )------------>[_...__...°]------------->|      NAS      |
 '-(          ).-'     10.32.25.2    ^   10.32.25.1      |               |
     '-.( ).-'                       |                   |               |
                                     |                   '---------------'
                                     |
                                     |
                                   __  _ 
                                  [__]|=|
                                  /::/|_|
David Bélanger
la source
@slm Exactement. Rien ne se produit sur 10.32.25.2:8080 car le serveur est sur le port 80. De l'extérieur, la NAT redirige du port 8080 vers le port 80 sur l'IP spécifiée (10.32.25.2). NET -> NAT: 8080 -> 10.32.25.2:80. J'ai besoin de la règle de l'intérieur et je ne sais pas quoi y mettre.
David Bélanger
@slm Oui. Je ne sais pas comment je peux réaliser quelque chose comme ça. Je veux dire 10.32.25.1:8080rediriger vers 10.32.25.2:80. Ma règle ci-dessus fonctionne de l'extérieur, mais pas de l'intérieur de mon réseau. Donc, si je suis au bureau, je peux accéder à mon NAS depuis website.com:8080 et c'est complètement transparent. De chez moi, website.com:8080 pointe vers 10.32.25.1 parce que c'est mon routeur aka serveur Linux. Je veux rediriger le port 8080 vers le NAS également sur le port 80 mais encore une fois, de manière transparente.
David Bélanger
@slm Oui, tout va bien et fonctionne. Je veux juste rediriger le port 10.32.25.1:8080 vers 10.32.25.2:80 depuis le réseau interne.
David Bélanger
mentionne également l'interface comme eth0 10.32.25.2, afin que nous puissions écrire l'utilisation d'iptables basée sur l'interface entrante
Rahul Patil
Opps désolé, je viens de voir .. vous avez déjà résolu le problème ..
Rahul Patil

Réponses:

13

J'ai finalement trouvé un guide pratique. Tout d'abord, j'ai dû ajouter -i eth1à ma règle "extérieure" (eth1 est ma connexion WAN). J'ai également dû ajouter deux autres règles. Voici finalement ce que je suis venu avec:

iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 8080 -j DNAT --to 10.32.25.2:80
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to 10.32.25.2:80
iptables -t nat -A POSTROUTING -p tcp -d 10.32.25.2 --dport 80 -j MASQUERADE
David Bélanger
la source
2
La deuxième règle n'est pas nécessaire, car la première règle contient déjà cela ...
machineaddict
1
La première règle limite la pré-route uniquement si elle arrive sur l'interface eth1. La deuxième règle est plus générale car elle s'applique à toutes les interfaces. Attention aux boucles!
tu-Reinstate Monica-dor duh
4

Vous avez également oublié de mentionner que le transfert de package doit être activé pour pouvoir effectuer le NAT de destination. Par défaut, il est généralement désactivé, donc les règles iptables ne fonctionneront pas. Il peut être activé en émettant:

echo 1 > /proc/sys/net/ipv4/ip_forward
Dmitriusan
la source
Merci beaucoup pour cela, j'aurais tiré mes cheveux pendant des heures!
ColinM
3

Autorisez d'abord le transfert avec

echo 1 > /proc/sys/net/ipv4/ip_forward

Ensuite, définissez des règles iptables avec

IF=eth1
PORT_FROM=8080
PORT_TO=80
DEST=10.32.25.2
iptables -t nat -A PREROUTING -i $IF -p tcp --dport $PORT_FROM -j DNAT --to $DEST:$PORT_TO
iptables -t nat -A POSTROUTING -p tcp -d $DEST --dport $PORT_TO -j MASQUERADE

Vous pouvez mettre ces lignes /etc/rc.localpar exemple. Remarque: étant donné que Debian Jessie le rend exécutable et active le service rc.local via

systemctl enable rc-local.service
rubo77
la source
0

Vous devez d'abord vérifier que le transfert est activé:

cat /proc/sys/net/ipv4/ip_forward

Sinon 1, exécutez echo 1 > /proc/sys/net/ipv4/ip_forward.

Si vous souhaitez que le trafic atteignant 10.32.25.1 sur les ports 80 et 443 soit transféré vers le port 80 de 10.32.25.2, vous devez utiliser la règle ci-dessous:

iptables -t nat -A PREROUTING -d 10.32.25.1 -p tcp -m multiport --dports 80,443 -j DNAT --to-destination 10.32.25.2:80
balon
la source