Solution 1 :
J'ai supprimé ma réponse d'origine, car je n'étais pas entièrement convaincu qu'elle était correcte. J'ai eu depuis un peu de temps pour mettre en place un petit réseau virtuel de VMs pour simuler le réseau en question. Voici l'ensemble des règles de pare-feu qui ont fonctionné pour moi (en iptables-save
format, pour le nat
tableau uniquement) :
-A PREROUTING -d 89.179.245.232/32 -p tcp -m multiport --dports 22,25,80,443 -j DNAT --to-destination 192.168.2.10
-A POSTROUTING -s 192.168.2.0/24 -o ppp0 -j MASQUERADE
-A POSTROUTING -s 192.168.2.0/24 -d 192.168.2.10/32 -p tcp -m multiport --dports 22,25,80,443 -j MASQUERADE
Le premier POSTROUTING
La règle est un moyen simple de partager la connexion Internet avec le réseau local. Je l'ai laissé là pour être complet.
Le PREROUTING
règle et la seconde POSTROUTING
rule établissent ensemble les NAT appropriés, de sorte que les connexions au serveur via l'adresse IP externe puissent avoir lieu, que les connexions proviennent de l'extérieur ou de l'intérieur du LAN. Lorsque les clients du LAN se connectent au serveur via l'adresse IP externe, le serveur voit les connexions comme provenant de l'adresse IP interne du routeur (192.168.2.1).
Fait intéressant, il s'avère qu'il existe quelques variantes de la deuxième règle POSTROUTING qui fonctionnent également. Si la cible est changée en -j SNAT --to-source 192.168.2.1
, l'effet est (sans surprise) le même que le MASQUERADE
:le serveur voit les connexions des clients LAN locaux comme provenant de l'interface interne du routeur Adresse IP. En revanche, si la cible est changée en -j SNAT --to-source 89.179.245.232
, les NAT fonctionnent toujours, mais cette fois, le serveur voit les connexions des clients LAN locaux comme provenant du routeur externe Adresse IP (89.179.245.232).
Enfin, notez que votre PREROUTING
d'origine /DNAT
règle avec -i ppp0
ne fonctionne pas, car la règle ne correspond jamais aux paquets provenant des clients LAN (car ceux-ci n'entrent pas dans le routeur via le ppp0
interface). Il serait possible de le faire fonctionner en ajoutant un deuxième PREROUTING
règle uniquement pour les clients LAN internes, mais elle serait inélégante (IMO) et devrait toujours se référer explicitement à l'adresse IP externe.
Maintenant, même après avoir présenté une solution "NAT en épingle à cheveux" (ou "bouclage NAT", ou "réflexion NAT", ou tout ce que l'on préfère l'appeler) en détail, je continue de croire qu'une solution DNS à horizon partagé-- - avec des clients externes résolus sur l'adresse IP externe et des clients internes résolus sur l'adresse IP interne --- serait la voie la plus recommandée à suivre. Pourquoi? Parce que plus de gens comprennent le fonctionnement du DNS que de comprendre le fonctionnement du NAT, et une grande partie de la construction de bons systèmes consiste à choisir d'utiliser des parties qui sont maintenables. Une configuration DNS est plus susceptible d'être comprise, et donc correctement maintenue, qu'une configuration NAT obscure (IMO, bien sûr).
Solution 2 :
Je suis surpris qu'après presque 8 ans, personne n'ait expliqué comment procéder correctement en utilisant le système de configuration UCI utilisé par défaut dans OpenWRT.
La réponse de Steven Monday est correcte, mais elle utilise iptables
commandes directement, qui est une couche inférieure au système de configuration UCI, et qu'il vaut mieux laisser intacte par la plupart des utilisateurs d'OpenWRT si possible.
La bonne façon d'accéder aux serveurs internes via leurs combos IP/port publics à partir d'un autre hôte interne dans UCI est d'activer l'option de configuration reflection
sous chaque cible DNAT spécifique dans le fichier /etc/config/firewall
. Ce comportement est documenté ici.
Par exemple :
config redirect
option target 'DNAT'
option src 'wan'
option dest 'lan'
option proto 'tcp'
option src_dport '44322'
option dest_ip '192.168.5.22'
option dest_port '443'
option name 'apache HTTPS server'
option reflection '1'
Remarque :Selon la documentation OpenWRT indiquée, reflection
est activé par défaut. Lors de mes tests, ce n'était pas le cas.
Solution 3 :
Une solution courante consiste à faire pointer vos hôtes internes vers un serveur DNS local qui renvoie l'adresse "interne" correcte pour ces noms d'hôte.
Une autre solution - et nous l'utilisons là où je travaille sur nos pare-feu Cisco - consiste à réécrire les réponses DNS sur le pare-feu qui correspondent à ces adresses. Je ne pense pas qu'il existe des outils pour Linux qui font cela en ce moment.
Vous devriez pouvoir configurer le routage sur votre passerelle pour faire ce qu'il faut. Vous devrez peut-être configurer les serveurs pour qu'ils soient conscients de leur adresse IP mappée en externe (par exemple, en l'attribuant à une interface factice). Avec cette configuration, la communication d'un système interne à un autre système interne - en utilisant son adresse "externe" - passerait par le routeur.
Solution 4 :
Ce que vous demandez de faire s'appelle NAT Loopback
et cela nécessite que vous ajoutiez une règle SNAT pour que les paquets provenant de votre LAN vers votre serveur repassent par le routeur :
-A POSTROUTING -p tcp -s 192.168.2.0/24 -d 192.168.2.10 -m multiport --dports 22,25,80,443 -j SNAT --to-source 89.179.245.232