Forum Clubic

Regle iptables - openvpn

Bonjour,

En espérant qu’une âme charitable voudra bien m’aider…

Je suis en train de faire quelques tests avec divers machine virtuel sous VMWare Server afin de reproduire au mieux l’environnement réel de ce que je souhaite mettre en place au final.

Je souhaite relier par VPN 2 serveurs à l’aide d’OpenVPN (serveur sous 2003, mais la n’est pas le problème), situé sous 2 réseaux différents.

Pour “simuler” le routeur situé entre ces 2 serveurs, j’ai installé une machine virtuel sous Debian avec 3 interfaces réseaux configuré et j’ai activé ip_forward. (je parle de la 3eme interface un peu plus loin)

Maintenant, ce que j’aimerai faire, c’est que les 2 réseaux soit complètement isolé l’un de l’autre, et ne puisse communiquer entre eux qu’au travers du VPN installé sur chacun des 2 serveurs.

J’aimerai donc bloqué toutes les communication entre ces 2 réseaux, sauf le port 1194 (le port d’openvpn) d’un des 2 serveurs, qui doit pouvoir être atteint par le second serveur, mais je patauge dans la création des quelques règles nécessaire. (et j’avoue que je ne comprends pas grand chose dans les différentes options, regle, table, etc… d’iptables)

Dernière chose, j’aimerai quand même que les serveurs accèdent à Internet par le biais d’une 3ème patte réseaux qui renvoit sur la “vrai” passerelle, à savoir ma Livebox… (d’ou la 3eme interface réseaux sur le “routeur”)

Donc pour récapitulé…
J’ai 3 sous-réseaux différent.
192.168.1.0/24 > accès au net via 192.168.1.1
10.0.1.0/24 > sous-réseaux pour serveur virtuel A avec le serveur OpenVPN,
10.0.2.0/24 > sous-réseaux pour serveur virtuel B avec le client OpenVPN

Le “routeur” comporte 3 cartes réseaux, une pour chacun des sous-réseaux, et pour l’instant les routes fonctionnent (le serveur A avec OpenVPN atteint le serveur web installé sur le serveur B (et le client OpenVPN)), par contre seul le “routeur” accède au net, pas les 2 serveurs virtuel derrière, qui arrive pourtant à communiquer entre eux et avec la machine hôte (mais pas avec les autres machines du réseaux 192.168.1.0)

Je suis pas sûr que mon message soit très clair en me relisant, mais si je le fait plus long ça va être un peu lourd à lire après (si c’est pas déjà le cas… lol), quoi qu’il en soit, si qqu’un souhaite m’aider mais à des problèmes à comprendre, qu’il n’hésite pas, j’y répondrai du mieux que je peux…

Par avance, merci.

j’veux bien t’aider mais fait un schema histoire de demeler le sac de noeud :slight_smile:

OK, j’ai fait un petit schéma rapidement pour essayer de déméler tout ça un peu…

J’espère que c’est suffisant…

Je refait un ptit résumé de ce que j’aimerai…

  • Que les sous-réseaux 10.0.1.0/24 et 10.0.2.0/24 puisse sortir sur le net
  • Que seul la machine 10.0.2.254 puisse accèder a la machine 10.0.1.254 sur le port 1194 uniquement, toutes les autres communications entre les deux réseaux (10.0.1.0 et 1.0.2.0) ne doivent pas être possible.

Et ci-dessous le “superbe” schéma fait en 10mn chrono sur visio…

http://img525.imageshack.us/img525/7172/schemaclubicgo2.th.png
Edité le 07/08/2007 à 08:09

alors je dirais :


#on drop tout
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

#toujours ouvrir localhost
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

#seule 10.0.2.254 accède a 10.0.1.254 sur le port 1194
iptables -A FORWARD -i eth2 -p tcp --dport 1194 -s 10.0.2.254 -d 10.0.1.254 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth1 -p tcp --sport 1194 -s 10.0.1.254 -d 10.0.2.254 -m state --state ESTABLISHED -j ACCEPT

# 10.0.2.0/24 sort sur le net (on sors vers toutes les adresses sauf le réseau d'en face)
iptables -A FORWARD -i eth2 -p tcp -s 10.0.2.0/24 -d !10.0.1.0/24 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth0 -p tcp -d 10.0.2.0/24 -m state --state ESTABLISHED -j ACCEPT


voila, ya pas tout mais c’est un début
Je suppose que la LiveBox fait le NAT donc j’ai pas mis la régle sur la passerelle. Si c’est pas le cas, google un peu, la régle de NAT est facile a mettre en place.
le script que j’utilise est la


[wiki.linuxwall.info...](http://wiki.linuxwall.info/doku.php?id=ressources:articles:netfilter_advance)

Edité le 07/08/2007 à 14:55

Merci beaucoup pour ton aide plus que précieuse…

J’ai repris ce que tu m’avais dit et l’ai plus ou moins refait a ma sauce pour me permettre de comprendre comment il fallait faire.

J’ai activé le NAT sur la passerelle, car la livebox ne connait pas les reseaux 10.0… et tout fonctionne (enfin faut encore que je test le serveur vpn, mais vu qu’il faut maintenant que j’apprenne a le configurer, c’est la prochaine étape… lol), en tout cas, après test avec un serveur http sur chacune des 2 machines serveur virtuel, ça fonctionne en changeant juste le port 1194 avec le 80, donc ça devrait être ok avec ce que j’ai fait.

Pour le script que j’ai fait, je le met ici pour info, et peut etre pour d’eventuel conseil ou info sur des erreurs que j’aurai commise (ça serait etonnant qu’il y en ai pas).


#nettoyage
iptables -t nat -F POSTROUTING
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD

#on drop tout
iptables -t nat -P POSTROUTING ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

#nat pour les reseaux sur eth1 et eth2
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 192.168.1.200

#toujours ouvrir localhost
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

#ouverture de ssh sur reseau prive physique
iptables -A INPUT -i eth0 -p tcp -d 192.168.1.200 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -s 192.168.1.200 -m state --state ESTABLISHED -j ACCEPT

#ouverture du port pour le serveur openvpn (10.0.1.254) depuis le client vpn (10.0.2.254)
iptables -A FORWARD -i eth2 -p tcp -s 10.0.2.254 -d 10.0.1.254 --dport 1194 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth1 -p tcp -s 10.0.1.254 --sport 1194 -d 10.0.2.254 -m state --state ESTABLISHED -j ACCEPT

#communication des reseaux 10.0.1.0/24 et 192.168.1.0/24
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT

#communication des reseaux 10.0.2.0/24 et 192.168.1.0/24
iptables -A FORWARD -i eth2 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth2 -j ACCEPT

#sorti de la passerelle sur le net
iptables -A INPUT -i eth0 -j ACCEPT
iptables -A OUTPUT -o eth0 -j ACCEPT

J’aurai juste une question tout de même… j’imagine qu’il y a un ordre a utiliser pour toutes ces regles, et je n’ai pas trouvé dans quel sens etait lu les regles par le noyau… puis-je avoir qq indications sur le fonctionnement a ce niveau ?

Et une dernière question, pour que ceci soi actif a chaque demarrage du linux, quel est la meilleure solution ?

  • Rajouté un up sh /var/lib/iptables/active dans /etc/network/interfaces (ou alors avec iptables-save et iptables-restore, mais l’essentiel de la question est surtout dans quel fichier placé la commande ?)
  • Rajouté un fichier de script qq part ailleurs ? (mais dans ce cas, ou ?)

Juste au cas ou d’autre lirait ça en debutant…, durant mes essais je me suis vite rendu compte qu’il pouvait etre sympa d’avoir un fichier qui efface toutes les regles, en cas d’erreur… j’ai donc créé un fichier “flushrules” ou j’ai repris le debut du fichier (parti #nettoyage) et ou j’ai mis un ACCEPT pour INPUT, OUTPUT et FORWARD

Merci en tout cas pour tout.

attention


#sorti de la passerelle sur le net 
iptables -A INPUT -i eth0 -j ACCEPT 
iptables -A OUTPUT -o eth0 -j ACCEPT

est trop permif !!! tu laisse tout rentrer et tout sortir, c’est dangereux

pour les regles, il faut appliquer la politique par defaut puis les regles d’ouverture. j’ai jamais teste dans l’autre sens parce que ca serait pas logique…

perso, je lance les regles via un script (regarde le lien plus haut) que je lance a chaque demarrage depuis /etc/init.d/rc2.d/S50iptables-rules

histoire de faire les choses bien, j’ai bridé un peu la sortie vers le net pour que ce soit moins permissif, mais etant donné que je suis chez moi dans un lan privé ou y a 2 machines, et que je fait uniquement des tests, c’etait peu important :slight_smile:


#sorti de la passerelle sur le net
iptables -A INPUT -i eth0 -d 192.168.1.200 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -s 192.168.1.200 -m state --state ESTABLISHED,RELATED -j ACCEPT

juste que je ne suis pas sur que le RELATED soit vraiment utile dans ce cas

merci pour le temps passé a répondre à mes questions et peut etre a une prochaine fois…

le RELATED n’agit que dans le cas d’une connection attendue apres une autre, comme par exemple la connection TCP-DATA qui est relative a la TCP-CONTROLE (cette derniere etant sur le port 21)