J'ai une passerelle Linux exécutant le NAT pour mon réseau domestique. J'ai un autre réseau vers lequel j'aimerais transmettre des paquets de manière transparente, mais uniquement vers / depuis des ports IP / spécifiques (c'est-à-dire pas un VPN). Voici quelques exemples d'adresses IP et de ports avec lesquels travailler:
Source Router Remote Gateway Remote Target
192.168.1.10 -> 192.168.1.1 -> 1.2.3.4 -> 192.168.50.50:5000
J'aimerais que la machine source puisse parler à des ports spécifiques sur la cible distante comme si elle était directement routable depuis le routeur. Sur le routeur, eth0 est le réseau privé et eth1 est accessible sur Internet. La passerelle distante est une autre machine Linux dans laquelle je peux ssh et elle peut être acheminée directement vers la cible distante.
Ma tentative de solution simple consiste à configurer la redirection de port ssh sur le routeur, telle que:
ssh -L 5000:192.168.50.50:5000 1.2.3.4
Cela fonctionne bien pour le routeur, qui peut maintenant se connecter localement au port 5000. Ainsi, "telnet localhost 5000" sera connecté à 192.168.50.50:5000 comme prévu.
Maintenant, je veux rediriger le trafic de la source et de l'entonnoir via le tunnel ssh maintenant établi. J'ai tenté une règle NAT pour cela:
iptables -t nat -D PREROUTING -i eth0 -p tcp -s 192.168.1.10 --dport 5000 -d 1.2.3.4 -j DNAT --to-destination 127.0.0.1:5000
et puisque le routeur est déjà ma passerelle NAT, il a déjà la règle de postrouting nécessaire:
-A POSTROUTING -s 192.168.1.0/24 -o eth1 -j MASQUERADE
La plupart des questions et réponses sur ce site ou ailleurs semblent traiter des ports de serveur de transfert ou du NAT en épingle à cheveux, que je travaille bien ailleurs, et qui ne s'appliquent pas à cette situation. Je pourrais certainement DMZ transmettre des ports cibles distants via une passerelle distante, mais je ne veux pas que les ports soient accessibles sur Internet, je veux qu'ils soient accessibles uniquement via le tunnel SSH sécurisé.
La meilleure réponse que je puisse trouver concerne le rejet de paquets martiens dans le noyau Linux:
iptables, comment rediriger le port depuis le bouclage?
J'ai activé la journalisation des martiens et confirmé que le noyau rejette ces paquets en tant que martiens. Sauf qu'ils ne le sont pas: je sais exactement à quoi servent ces paquets, d'où ils viennent et où ils vont (mon tunnel ssh).
La solution "détournée" qui y est présentée s'applique à cette question initiale, mais ne s'applique pas à mon cas.
Cependant, lors de la rédaction / recherche de cette question, j'ai contourné mon problème en utilisant la liaison IP source SSH comme suit:
ssh -L 192.168.1.1:5000:192.168.50.50:5000 1.2.3.4
iptables -t nat -D PREROUTING -i eth0 -p tcp -s 192.168.1.10 --dport 5000 -d 1.2.3.4 -j DNAT --to-destination 192.168.1.1:5000
Puisque je n'utilise pas de bouclage, cela contourne le rejet martien.
Je poste toujours la question ici pour deux raisons:
- Dans l'espoir que quelqu'un qui essaie de faire quelque chose de similaire à l'avenir puisse trouver cela dans leurs recherches et cette solution de contournement pourrait les aider.
- Je préfère toujours l'idée de garder ma connexion vers l'avant du port ssh liée uniquement au bouclage et de pouvoir y router via iptables. Puisque je sais exactement ce que sont ces paquets et où ils vont, ne devrais-je pas avoir un moyen de les signaler comme tels pour que le filtrage martien Linux ne les rejette pas? Toutes mes recherches sur ce sujet conduisent à rp_filter, ce qui n'a pas aidé du tout dans mes tests. Et même si cela a fonctionné, il n'est pas spécifique aux paquets exacts que j'essaie d'autoriser.
Je suis intéressé à contribuer ma question et solution de contournement à la recherche générale pour sauver quelqu'un d'autre les heures de recherche que j'ai faites uniquement pour aboutir à des impasses, ainsi que j'espère que quelqu'un répondra à la partie bouclée / martienne de ma question qui reste ouverte tome.