Redirection de port Linux iptables ssh (rejet martien)

12

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:

  1. 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.
  2. 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.

marque
la source
À la suite de la lecture du post Meta sur UL vs SF, je remarque également la demande de Michael de ne pas crosspost. J'ai seulement transposé cela parce qu'il était spécifiquement marqué hors sujet à SF, donc s'il est plus approprié et possible de simplement déplacer la question d'origine et de fermer celle-ci, ce serait bien aussi.
Mark
est-ce que mettre net.ipv4.conf.default.rp_filter = 0 et net.ipv4.conf.all.rp_filter = 0 dans votre /etc/sysctl.conf et faire "sudo sysctl -p" résout votre problème?
Rui F Ribeiro
J'ai essayé d'appliquer ces deux directement, à savoir. 'sysctl net.ipv4.conf.default.rp_filter = 0', y compris également un pour mon interface privée spécifique. J'ai confirmé qu'ils sont définis via 'sysctl -a', cependant, les paquets martiens à 127.0.0.1 sont toujours rejetés. Et même si cela a fonctionné, ouvrir toutes mes interfaces aux martiens n'est PAS ce que je veux. Je ne veux même pas ouvrir une seule interface (privée albiet). Je sais exactement quels paquets martiens je veux autoriser et je souhaite / espère une expression NAT / mangle iptables pour me permettre d'accomplir cela.
Mark
Vous voudrez peut-être net.ipv4.conf.default.rp_filter = 2 et une autre règle iptables
Rui F Ribeiro

Réponses:

1

Le problème avec un DNAT vers 127.0.0.1:5000 est que lorsque le côté distant répond, ces paquets retournent dans le moteur de routage comme s'ils étaient originaires localement (à partir de 127.0.0.1) mais ils ont une adresse de destination extérieure. SNAT / MASQUERADE correspondant à l'interface externe les aurait interceptés et réécrits, mais les décisions de routage qui doivent être prises pour que les paquets arrivent à cette interface viennent en premier, et elles interdisent ces paquets qui sont faux par défaut. Le moteur de routage ne peut garantir que vous vous souviendrez de faire cette réécriture plus tard.

La chose que vous devriez pouvoir faire à la place est de rejeter toutes les connexions externes à 192.168.1.1:5000 à iptables INPUT autres que celles provenant de 192.168.1.10 en utilisant l' !argument avant la -sspécification de l'adresse source. Si vous utilisez la réinitialisation TCP comme mécanisme de rejet ( -j REJECT --reject-with tcp-resetau lieu de la destination ICMP par défaut inaccessible), elle sera largement identique à la situation où rien n'écoutait même sur cette adresse: combinaison de ports en ce qui concerne le monde extérieur.

Josip Rodin
la source
0

J'utiliserais openVPN pour créer un tunnel entre le routeur et RemoteGateway.

Ensuite, je voudrais, sur le routeur, ajouter un itinéraire:

route add -host RemoteTarget gw RemoteGateway-VPNaddress

utilisez une règle iptables simple partout où vous souhaitez limiter les ports auxquels vous autorisez Source à accéder.

Wayne Walker
la source