Créer une passerelle avec les IPtables, puis cache DNS et DHCP Debian lenny et squeeze
Ça fait longtemps que j'ai mis ça en place au travail, rien de bien neuf.
Commençons par lister les intérêts d'installer une passerelle sur un serveur, et non simplement d'utiliser une box ou un rooter avancé:
- Certains éléments pourront être greffés sur cette passerelle. L'idéal pour un serveur smtp, c'est d'être sur la passerelle, il filtrera comme ça le port 25. Pareil pour un petit serveur web, c'est sa place idéale[1]
- Installer un proxy
- Faciliter la supervision des flux. Vous monitorez vos modems et rooters vous? un serveur linux, c'est plus simple
- Pouvoir aller plus loin dans les règles de filtrage.
- Un accès SSH sur la passerelle avec clé et pas mot de passe, vous donne une porte entièrement sécurisée sur votre LAN de l'extérieur.
- Pour le coté geek, et le plaisir du Do It Yourself
Pour la rédaction de ce billet, le réseau est virtuel, dans des virtualbox. L'installation du serveur avec deux cartes réseau est expliquée dans le billet précédent.
Voici un schéma de principe:
Le modem est en mode router, il a une IP locale: 192.168.0.254
Le serveur passerelle a deux cartes réseau:
- eth0, qui est reliée au modem a l'adresse IP 192.168.0.1
- eth1 qui est relié au LAN a l'adresse IP 192.168.1.1
Les équipements du LAN on des IP qui commencent par 192.168.0.
Configurer les adresses ip de la passerelle:
Editer /etc/network/interfaces comme ceci:
# This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). #les interfaces démarrées lors du boot du systeme auto lo eth0 eth1 # The loopback network interface iface lo inet loopback #carte dans le LAN iface eth0 inet static address 192.168.0.1 netmask 255.255.255.0 gateway 192.168.0.254 #carte vers le modem iface eth1 inet static address 192.168.1.1 netmask 255.255.255.0
Pour appliquer les changements:
/etc/init.d/networking restart
Dans les réseaux de classe C, les équipements n'écoutent que les communications provenant d'une IP de la même tranche. Ces différentes tranches d'IP constituent des VLANS. Notre passerelle a deux pattes, une dans chaque VLAN, celui constitué par la box et elle même, et celui qui contient les ordinateurs. C'est elle qui permettra de faire le lien, encore faut-il lui dire de le faire.
Passerelle
Un premier script Iptables pour en faire une passerelle (passoire).
IPtables, en plus de savoir filtrer en entrée ou en sortie des paquets, a aussi des fonctions NAT.
Voici le script de base:
#!/bin/bash # Vider les tables actuelles iptables -t filter -F iptables -t filter -X iptables -t nat -F iptables -t nat -X echo - Vidage : [OK] #activer le forwarding echo 1 > /proc/sys/net/ipv4/ip_forward #lui demander de transmettre via eth0 iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE echo - Autoriser le forwarding : [OK]
Enregistrez le dans le fichier /etc/init.d/firewall,
Le rendre exécutable et le lancer.
chmod +x /etc/init.d/firewall /etc/init.d/firewall
Sur mon petit réseau de virtualbox, en fond la passerelle et au premier plan une xubuntu ayant le réseau configuré ainsi:
- Adresse: 192.168.1.3
- Masque 255.255.255.0
- Passerelle 192.168.1.1 (La passerelle en question)
- DNS: 8.8.8.8
ça marche!
Tout passe, on a créé une passerelle, passoire.
Un peu plus de sécurité, améliorons le script.
L'objectif est de pouvoir considérer que le LAN sera une zone démilitarisée, pouvoir donc y abaisser tous les pare-feu. La passerelle devient un seul gros pare feu pour tout le LAN. Lorsqu'on a régulièrement à déployer des nouvelles applications réseau, le gain de temps ainsi est énorme.
Je ne vais cependant pas faire un vrai explicatif des IPtables, ce serait super long, et il existe plein de documentation sur cette technologie (pas toute jeune).
Je ne ferai pas mieux que cet exemple facilement adaptable de script
Changez votre fichier firewall par celui proposé dans le lien.
Ajoutez juste:
echo 1 > /proc/sys/net/ipv4/ip_forward
et les variables en début de script, je les ai défini ainsi:
# Interface qui est sur Internet (WAN) WAN_IFACE="eth0" # Interface Wireless WLAN_IFACE="wlan0" # Interface qui est dans votre réseau local (LAN) LAN_IFACE="eth1" # Adresse de votre passerelle (Firewall) LAN_IP="192.168.0.1" LAN_NET="192.168.1.0/24" #(Sous-réseau avec le masque 255.255.255.0) LAN_BCAST="192.168.1.255" # (Adresse de broadcast.)
Voici tel que j'ai mis ce script à cette étape: firewall.txt
Notre passerelle fait à présent firewall. Pour concurrencer une box, on va ajouter un cache DNS et un serveur DHCP:
Le serveur de cache DNS
Installer bind9
apt-get install bind9
Configuration en cache
Editez le fichier /etc/bind/named.conf.options et décommentez les lignes suivantes, en prenant soin d'y mettre des serveurs DNS (ceux de votre FAI, ou de google par exemple):
forwarders { 8.8.8.8; 8.8.4.4; };
Et tant qu'à avoir un serveur de cache, autant en faire profiter le serveur lui meme; Editez le fichier /etc/resolv.conf et mettez y juste la ligne suivante:
nameserver 127.0.0.1
Le serveur DHCP
apt-get install dhcp3-server
Afin de choisir l'interface sur laquelle il devra écouter, editer le fichier de configuration /etc/default/isc-dhcp-server Et preciser l'interface sur laquelle il doit fonctionner. eth1 dans on cas:
INTERFACES="eth1"
Editer le fichier de configuration /etc/dhcp/dhcpd.conf et pour ça l'exemple de ubuntu est tres bien.
Ce qui donne dans mon cas:
##### Option generale par defaut ##### ### ReSEAU ### ## Nom du serveur DHCP server-name "debian.lan"; ## Mode autoritaire (autoritaire) authoritative; ## Masque de sous-réseau ### DOMAINE ### ## Nom du domaine option domain-name "lan"; ## Adresse IP du serveur DNS # a remplacer par l ip de votre serveur dns ou par celle de votre fai option domain-name-servers 192.168.1.1; ## Type de mise à jour du DNS (aucune) ddns-update-style none; ### TEMPS DE RENOUVELEMENT DES ADRESSES ### ## par défaut en s (1 h) default-lease-time 3600; ## maximum (2 h) max-lease-time 7200; ### Sécurité ### ## refus(deny)/autorise(allow) les clients inconnus (refuse client inconnu) allow unknown-clients; ## Use this to send dhcp log messages to a different log file (you also ## have to hack syslog.conf to complete the redirection). log-facility local7; ### PXE ### ## Permet le boot réseau pour TFTP allow bootp; allow booting; ##### RéSEAUX ##### # # déclaration sous réseau 192.168.1.1.* subnet 192.168.1.1 netmask 255.255.255.0 { authoritative; # Adresse de diffusion option broadcast-address 192.168.1.255; # # routeur par défaut option routers 192.168.1.1; # La plage ne contient qu'1 adresse ce qui empèche l'attribution sauf au client dont celle-ci est fixée. range 192.168.1.111 192.168.1.140; # Le fichier peut être spécifié dans la section host , il deviendra alors prioritaire sur celui-ci filename "pxelinux.0"; # exemple de fixage d'une adresse: 68pc host 68pc { hardware ethernet 00:1E:58:A6:FD:C4; fixed-address 192.168.1.122; } }
/etc/init.d/isc-dhcp-server restart
:Conclusion:
Voila, on a les fonctions principales d'une box. Reste à faire mumuse, y ajouter un proxy, un serveur de mail, un ftp public toussa ;)
Note
[1] Enfin je trouve quand même dangereux de mettre un serveur web et un serveur e-mail sur la même machine car au moindre script PHP ayant une faille, les conséquences peuvent être dramatiques.
Commentaires
Ca tombe bien, j'ai une "vieille" bécane qui me servait de PC de salon, mais manque de patate CPU pour en faire une bonne station multimedia, je crois que je vais la recycler dans les prochains jours!
Et merci pour tou(e)s les tutos / infos présent(e)s sur ton blog! :)
De rien m4as, ça me fait toujours super plaisir d'avoir ce genre de retour sur mon blog!
Bonjoru et merci pour ton tuto,je suis débutant et ca fait une semaine jour pour jour que je galere pour transformer mon ubuntu en routeur,
sinon je me permets deux remarques :
Inscire le firewall au demarrage --> update-rc.d firewall defaults
et modifier dans /etc/dhcp/dhcpd.conf dans le paragraphe des reseaux
subnet 192.168.1.1 par subnet 192.168.1.0 merci encore
Merci Hafid pour ce retour,
j'éditerai le billet pour corriger la petite erreur que tu signales.
Pour l'inscription au démarrage, faut que je fasse les entetes du script, car à présent sous débian, c'est un peu plus rigoureux.
il y a une incohérence netre le schéma et les lignes de commentaires du fichier interface :
#carte dans le LAN
iface eth*0* inet static
#carte vers le modem
iface eth*1* inet static
du coup, quelle ip faut-il mettre dans le script firewall ?
erf... oui, je me suis bien embrouillé.
J'avais testé la solution donnée dans ce billet, donc à mon avis l'erreur est dans mes commentaires... mais je vérifierai ce soir.
Bonjour et merci pour ton billet.
Comment doit-on configurer ensuite les postes windows pour accéder au net ?
Peut-on faire une solution "transparente". Ajouter la passerelle sans avoir à modifier la config des ordinateurs clients ?
Merci bcp
Patatoid > c'est le serveur DHCP qui renseigne sur la passerelle. rien à faire sur les postes clients
Bonjour !
Déjà merci pour les tutos, très biens fait c'est du super taff.
J'ai en revanche un probleme pour la passerelle. Je veux la faire sur une machine virtuelle (oracle VB) et mon Pc est sous ubuntu 12.10.
Je n'ai pas de soucis pour l'installation des services, mais arrivé à l’étape de passage du 2eme script j'ai cette erreur :
"iptables v1.4.8: unknown protocol '--tcp-flags' specified
Try 'iptables -h' or [...] informations
iptables: No chain/target/match by that name.
/etc/init.d/firewall: line 464: /sbien/iptables-: Aucun fichier ou dossier de ce type .
Ca fait un moment que je cherche et je ne trouve pas le probleme, le script n'a pourtant pas l'air d'avoir de probleme.
Quelqu'un aurait il une idée pour me depanner ?
(si ca se trouve j'ai fait une erreur en recopiant le script (bah pk tla pas copié coller ? parce que recopier permet de comprendre et d'apprendre) et je vous embete pour rien. Mais peu probable j'ai reverifié toutes les lignes :s )
Merci d'avance
Hello Rider_fou
Pour la deuxième erreur, c'est lié à une faute de frappe, à mon avis le chemin correct est /sbin/iptables
Pour la première erreur... heu je ne sais pas trop, je suis aussi sur la version 1.4.8... peux nous fournir ton script iptables afin que je puisse t'aider
Bonjour,
Je crois qu'une coquille apparait
eth0, qui est reliée au modem a l’adresse IP 192.168.0.1
eth1 qui est relié au LAN a l’adresse IP 192.168.1.1
Les équipements du LAN on des IP qui commencent par 192.168.0.
Ores les IP du LAN sont 192.168.1.x non?
Cordialement
Un grand merci pour ce tuto !
Pour la petite histoire, cela fait bien deux ans que j'ai transformé mon bon vieux P4 grâce à ce billet.
Et hier paf ! mort en règle du dd....
Changement de disque, passage sous wheezy pour l'occasion (précédemment sous squeeze), retour sur le tuto et retour du serveur comme neuf en moins d'1h !
Encore Merci!
Atra.
Merci pour ce commentaire Atra, ça fait plaisir à lire!
Merci beaucoup, c'est simple et bien expliqué.
Je vais faire ça très rapidement. Je compte utiliser une passerelle pour interconnecter des sites avec un VPN PPTP. Une fois la passerelle conectée au VPN, il suffit juste de faire un iptable qui redirige tout le traffic vers les adresses VPN vers l'interface réseau VPN non?
Xavier> Oui,
Ou déclarer une route sur la passerelle.
J'avais quand même bataillé sur les soucis de rootage lorsque j'avais tenté de mettre en place un VPN de ce type.