SOCKS5 "transparent" via netfilter / iptables

SOCKS5 "transparent" via netfilter / iptables - réseaux et sécurité - Linux et OS Alternatifs

Marsh Posté le 28-05-2008 à 15:27:15    

Bonjour à tous !
 
Le voilà enfin, ce jour où je vais devoir mettre les mains dans le cambouis pour titiller iptables  :D  
J'utilise une machine virtuelle, sous Mandriva 2008 Spring, et je souhaiterais que tout le trafic réseau sortant passe au travers d'un tunnel SSH utilisé comme SOCKS5.  
L'idée étant que de n'importe quel endroit où j'utilise ma VM, je puisse profiter d'accès réseaux sécurisés relayés via mon serveur perso à la maison.
 
J'ai pensé à une solution, mais n'ayant jusqu'ici jamais touché iptables (je n'ai que quelques notions), je me demande si cela sera réalisable, le but étant d'arriver à cette situation :
 
- Un tunnel SSH en mode SOCKS5 sur localhost:8888, dirigé sur une adresse IP externe (mon serveur perso) sur le port 3389  
ssh -D 8888 -p 3389 adr_ip_externe
Je souhaite que cette connexion sorte directement au travers d'eth0
 
- Une redirection de tous les flux sortants par eth0, quel que soit le protocole ou le port (hors port dest 3389) sur le localhost:8888
Pour cela, je pensais utiliser iptables.
 
 
Le but étant de rendre le SOCKS5 complètement "transparent" vis à vis de l'intégralité du système de la VM.
 
L'un de vous aurait-il un avis sur la chose, et éventuellement quelques débuts de pistes, que je puisse creuser ?
Merci d'avance  :jap:


Message édité par whiterabbit le 30-05-2008 à 15:20:34
Reply

Marsh Posté le 28-05-2008 à 15:27:15   

Reply

Marsh Posté le 30-05-2008 à 15:45:22    

Après quelques recherches et lectures de man et howto, je suis presque arrivé à mon but, mais il doit me manquer un petit quelque chose.
Voici les règles que j'applique via iptables :
 
1) Je bloque tout par défaut

iptables -P INPUT   DROP
iptables -P OUTPUT  DROP
iptables -P FORWARD DROP


 
2) J'autorise le trafic sur la boucle locale

iptables -A OUTPUT -p all -o lo -j ACCEPT
iptables -A INPUT  -p all -i lo -j ACCEPT


 
3) J'autorise les connexions pour SSH (sur les ports 22 par défaut et 3389 pour des besoins perso)

iptables -A OUTPUT -p tcp -o eth0 --dport 22   -j ACCEPT
iptables -A INPUT  -p tcp -i eth0 --sport 22   -j ACCEPT
iptables -A OUTPUT -p tcp -o eth0 --dport 3389 -j ACCEPT
iptables -A INPUT  -p tcp -i eth0 --sport 3389 -j ACCEPT


 
Jusqu'ici tout va bien, tout est bloqué à l'exception de ma connexion SSH, c'est ensuite que ça se complique un petit peu :
 
4) Je redirige via un DNAT l'intégralité du trafic généré vers le SOCKS ouvert par SSH en local, sur le port 8888 :
 
--> Pour l'UDP :

iptables -t nat -A OUTPUT -p udp -o eth0 -j DNAT --to-destination 127.0.0.1:8888


--> Pour le TCP, je crée les les règles de manière à ne pas prendre en compte les connexions sur les ports 22 et 3389 :

iptables -t nat -A OUTPUT -p tcp -o eth0 --dport 0:21       -j DNAT --to-destination 127.0.0.1:8888
iptables -t nat -A OUTPUT -p tcp -o eth0 --dport 23:3388    -j DNAT --to-destination 127.0.0.1:8888
iptables -t nat -A OUTPUT -p tcp -o eth0 --dport 3390:65535 -j DNAT --to-destination 127.0.0.1:8888


 
Là, je bloque un peu : les paquets sont bien redirigés vers le SOCKS (un petit iptables -vL -t nat m'indique bien de l'activité sur la plage couvrant le port 80 lorsque je tente d'accèder à une page web), mais il doit y avoir un problème pour le retour ...
 
Faut-il que je mette en place un SNAT, en plus du DNAT ?
 
 

Reply

Marsh Posté le 30-05-2008 à 16:10:05    

whiterabbit a écrit :

Après quelques recherches et lectures de man et howto, je suis presque arrivé à mon but, mais il doit me manquer un petit quelque chose.
Voici les règles que j'applique via iptables :
 
[...]
 
3) J'autorise les connexions pour SSH (sur les ports 22 par défaut et 3389 pour des besoins perso)

Citation :

iptables -A OUTPUT -p tcp -o eth0 --dport 22   -j ACCEPT
iptables -A INPUT  -p tcp -i eth0 --sport 22   -j ACCEPT
iptables -A OUTPUT -p tcp -o eth0 --dport 3389 -j ACCEPT
iptables -A INPUT  -p tcp -i eth0 --sport 3389 -j ACCEPT




 
Deja a ce niveau la ca va pas, tu autorises n'importes quel paquet entrant qui aurait pour port source le port 22 ou 3389, or rien n'indique que ce soit bien une connexion ssh/rdesktop deja etablie...
Il faut plutot utiliser:
iptables -A INPUT -p tcp -i eth0 -m state --state ESTABLISHED -j ACCEPT
(il faut avoir les bons modules iptables avec, mais normalement ils sont toujours fournis copmilés ou en module avec les kernels des différentes distribs.)


Message édité par P-Y le 30-05-2008 à 16:10:39
Reply

Marsh Posté le 30-05-2008 à 16:20:05    

Merci pour ta réponse ... il est vrai que je n'ai pas trop restreint à ce niveau.
En fait, j'ai oublié de préciser que le système sur lequel je fais ces manips est virtualisé, et qu'il accède au réseau via un NAT géré par la VM, elle même hébergée sur une machine qui est sur un réseau protégé par firewall.  
Il n'est donc pas accessible directement depuis l'extérieur ... je pensais donc, peut être à tort, que ce n'était pas indispensable, dans mon cas, de prendre en compte l'état de la connexion sur les règles INPUT.
 
Pour mon problème, j'ai l'impression que les paquets DNATés ne retrouvent pas leur chemin au retour ...


Message édité par whiterabbit le 30-05-2008 à 16:23:16
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed