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: lan-avec-passerelle.jpg

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

Capture-30.jpg

ç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

1. Le jeudi, septembre 15 2011, 22:43 par m4as

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! :)

2. Le jeudi, septembre 15 2011, 22:56 par gnieark

De rien m4as, ça me fait toujours super plaisir d'avoir ce genre de retour sur mon blog!

3. Le lundi, juillet 23 2012, 15:42 par hafid

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

4. Le mercredi, juillet 25 2012, 11:03 par gnieark

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.

5. Le dimanche, octobre 28 2012, 21:58 par zozo

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 ?

6. Le mardi, octobre 30 2012, 09:44 par gnieark

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.

7. Le samedi, janvier 19 2013, 02:35 par patatoid

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

8. Le dimanche, janvier 20 2013, 18:46 par gnieark

Patatoid > c'est le serveur DHCP qui renseigne sur la passerelle. rien à faire sur les postes clients

9. Le lundi, avril 29 2013, 19:38 par Rider_fou

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

10. Le jeudi, mai 2 2013, 17:11 par gnieark

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

11. Le mercredi, avril 16 2014, 07:52 par puma.rc

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

12. Le dimanche, juillet 26 2015, 23:43 par Atra

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.

13. Le mardi, septembre 22 2015, 11:30 par gnieark

Merci pour ce commentaire Atra, ça fait plaisir à lire!

14. Le vendredi, juillet 1 2016, 19:31 par Xavier B.

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?

15. Le mardi, août 16 2016, 11:36 par gnieark

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.

Page top