Ceci est un autre petit memo sur les iptables. Ici, nous allons voir comment rediriger toutes les requêtes sortantes vers un port local de notre machine. Le but est de proposer une solution pour accéder à des services qui se trouvent derrière un firewall, alors que l’on possède par exemple une connexion ssh.

Ce memo complète le précédent sur la redirection de paquets qui nous sont destinés.

Petit rappel : mise en place du NAT

Pour créer une passerelle, il faut activer le transfert de paquet et la translation d’adresses :

sysctl net.ipv4.ip_forward=1
iptables -A POSTROUTING -o eth0 -j MASQUERADE

Mise en place d’un tunnel transparent

On procède ici en deux étapes : d’abord la création du tunnel en tant que tel :

ssh -L port_local:ip_destination:port_destination user@host

port_local : c’est le port de notre machine sur lequel le service sera disponible
ip_destination : c’est l’ip (ou le nom dns) de la machine à laquelle nous voulons avoir accès
port_destination : c’est le port de la machine à laquelle nous voulons avoir accès
user@host : ce sont les utilisateurs et la machine sur laquelle nous allons nous connecter pour accéder à notre destination finale

Ensuite, nous allons automatiser la redirection des paquets avec iptables :

iptables -t nat -A OUTPUT -d $ip_destination -p tcp \
  --dport $port_destination -j REDIRECT --to-ports $port_local
iptables -t nat -A PREROUTING -d $ip_destination -p tcp \
  --dport $port_destination -j REDIRECT --to-ports $port_local

La première ligne est pour nous : elle permet à la machine elle-même d’accéder dorénavant au nouveau service comme d’habitude.
La deuxième ligne est pour le nat à proprement parler : elle permet de rediriger automatiquement les paquets des machines qui nous utilisent comme passerelle.

Plus d’informations sur le fonctionnement des iptables : iptables tutorial, très complet.