Rediriger un port pour une IP spécifique avec iptables

07 février 2019

Toujours dans une optique de contourner des restrictions de pare-feu, on va voir un truc assez simple pour rediriger un port vers au autre uniquement pour les paquets provenant d’une IP donnée. Deux cas de figure où ça peut s’avérer utile :

C’est tout simple ça se fait avec une seule commande sur le serveur qu’on veut joindre :

iptables \
 -t nat \
 -I PREROUTING \
 --src <ip-source> \
 --dst <ip-du-serveur> \
 -p tcp \
 --dport <port-intial> \
 -j REDIRECT \
 --to-ports <port-bloqué>

On utilise donc iptables, l’outil qui permet de gérer les règle de pare-feu du noyau Linux, avec les arguments suivants :

Exemple, en admettant que l’IP publique de mon lieu de travail soit 1.2.3.4 et celle de mon serveur 5.6.7.8, et que je veuille faire passer le traffic pour mon serveur OpenVPN à travers le port 443 (initialement dédié au HTTPS) :

iptables \
 -t nat \
 -I PREROUTING \
 --src 1.2.3.4 \
 --dst 5.6.7.8 \
 -p tcp \
 --dport 443 \
 -j REDIRECT \
 --to-ports 1194

Alors bien évidemment, pour cet exemple il faut que depuis mon lieu de travail je n’ai pas besoin d’accéder au service HTTPS sur mon serveur (adieu la consultation de mon blog perso). Aussi, si le traffic est filtré par un proxy ça risque de ne pas fonctionner. Mais voilà ça peut parfois dépanner.

Pour virer cette règle, on remplace -I par -D, car on veut delete au lieu de insert :

iptables \
 -t nat \
 -D PREROUTING \
 --src 1.2.3.4 \
 --dst 5.6.7.8 \
 -p tcp \
 --dport 443 \
 -j REDIRECT \
 --to-ports 1194

Ou sinon, en utilisant le numéro de la règle :

# liste les règles de la table `nat`
iptables -t nat -L --line-numbers

# on supprime la règle `<num>` dans la chaîne `PREROUTING`
iptables -t nat -D PREROUTING <num>