Archives mensuelles : février 2007

Rediriger un port avec iptables et ssh

Une petite démonstration de la puissance et de la souplesse de Linux :

Le contexte

Suite à un déménagement, ma connexion ADSL tardait à revenir, et mes mails commençaient à s’entasser sur un MX secondaire herbegé par un ami. Ne voulant pas attendre, je me décidais à utiliser une connexion internet RTC pour rapatrier mon courrier, mais je ne voulais pas modifier la configuration du serveur mail distant. De plus, l’adresse IP de la connexion RTC n’étant pas fixe, cela m’aurait obligé à modifier cette configuration à chaque connexion.

La solution

mxsecondaire essayait de se connecter à mxprincipal (dont l’ancienne IP fixe était A.A.A.A) de façon régulière.
Il fallait donc arriver à détourner de trafic de mxsecondaire à destination de mxprincipal:25 pour l’amener à bon port.

La solution consistait donc à:

  • Connecter mxprincipal à internet via un windows XP qui possédait un modem RTC
  • Ouvrir une session ssh de mxprincipal sur mxsecondaire, en activant le forward de ports de mxsecondaire:65000 vers mxprimaire:25
  • Sur mxsecondaire, détourner le trafic sortant vers A.A.A.A:25 et le renvoyer vers 127.0.0.1:65000
  • Attendre une saisie de l’utilisateur pour remettre tout correctement en place et se déconnecter

LA ligne de commande

Evidemment, en bon linuxien, il fallait que tout cela se fasse en une seule ligne de commande, lancée depuis mxprimaire

ssh mxsecondaire -R 65000:localhost:25 "iptables -A OUTPUT -t nat -p tcp -d A.A.A.A 
--dport 25 -j DNAT --to 127.0.0.1:65000 &&  echo "Appuyer sur entrée pour quitter" && 
read && iptables -D OUTPUT -t nat -p tcp -d A.A.A.A --dport 25 -j DNAT --to 127.0.0.1:65000"

Petite explication de texte:

ssh mxsecondaire -R 65000:localhost:25

On se connecte en ssh de mxprimaire vers mxsecondaire, en activant le forward du port 65000 distant vers le port 25 local, et en executant la commande indiquée après. Une fois l’éxécution de celle-ci terminée, la connexion ssh est fermée.

iptables -A OUTPUT -t nat -p tcp -d A.A.A.A --dport 25 -j DNAT --to 127.0.0.1:65000 

On dit au noyau de rediriger tout le traffic sortant à destination de A.A.A.A:25 vers le port 65000

echo "Appuyer sur entrée pour quitter" && read 

On attend l’appui sur entrée pour continuer (le temps que les emails soient rapatriés)

iptables -D OUTPUT -t nat -p tcp -d A.A.A.A --dport 25 -j DNAT --to 127.0.0.1:65000

On annule ce qui a été fait auparavant

Et voilà… En espérant que ça en inspirera d’autres.