La différence, si j’ai bien compris, est que dans ton cas le redirecteur n’est pas “physiquement” entre la source et la destination, ce qui a des conséquences (voir plus bas).
Il y a principalement deux approches pour rediriger un port.
a) Redirection NAT avec iptables
Iptables modifie à la volée l’adresse et le port destination des paquets IP et ces derniers sont reroutés vers la nouvelle destination. Lorsque celle-ci n’est pas locale, la machine doit être configurée en routeur (sysctl net.ipv4.ip_forward=1). Les paquets de réponse doivent suivre le chemin inverse et repasser par la machine redirectrice pour remettre l’adresse et le port source originels (routage symétrique), par conséquent si le chemin normal depuis la destination finale vers la source initiale ne passe pas par la machine redirectrice (routage asymétrique), il faut aussi modifier l’adresse source des paquets redirigés avec l’adresse de la machine redirectrice. Exemple de redirection TCP de 192.0.2.33:1234 vers 192.0.2.77:5678 :
iptables -t nat -A PREROUTING -d 192.0.2.33 -p tcp --dport 1234 -j DNAT --to 192.0.2.77:5678
iptables -t nat -A POSTROUTING -d 192.0.2.77 -p tcp --dport 5678 -j SNAT --to 192.0.2.33
b) Redirecteur/proxy/relais de port
C’est une application qui écoute sur un port, et retransmet vers une autre adresse et optionnellement un autre port. Contrairement à la redirection NAT, d’un point de vue réseau il y a deux flux distincts, un entre la source et le redirecteur et un entre le redirecteur et le serveur final. Donc pas besoin de configurer la machine en routeur. L’adresse source des paquets redirigés est forcément l’adresse de la machine redirectrice ; l’adresse et le port source originels ne sont pas visibles par le serveur final.
Exemples de paquets utilisables :
rinetd | socat | redir | 6tunnel | stone | simpleproxy (redirecteur TCP)
socat | stone (redirecteur UDP)
6tunnel (redirecteur TCP IPv4 <-> IPv6)
Si le serveur final doit voir l’adresse source originelle, alors il faut utiliser le NAT d’iptables en combinaison avec un tunnel et du routage avancé entre le redirecteur et le serveur final, ce qui n’est pas transparent pour ce dernier.