# Installation de serveur DNS sous Debian ## Introduction Ceci est une procédure permettant d'installer un serveur DHCP sur une machine Debian ainsi qu'une passerelle réseau. Son nom sera: `netgateway`. Cette machine comportera : * 256 Mo de RAM * 3 Go de disque dur * 2 cartes réseau montées sur deux `vmnet` différents * aucune carte son, ni imprimante ## Configuration du réseau On désigne par `vmnet` une carte réseau virtuelle. ![Schéma du réseau](images/reseau.png) Dans ce cas précis, on utilise une VM qui comporte deux cartes (et donc connectée à deux `vmnet` différents) : * une dont le réseau est le réseau externe (le nom `eth0` peut changer selon la machine). * une dont le réseau est 172.16.81.0/24 (le nom `eth1` peut changer selon la machine). Vous **devrez** sans doute **adapter les noms des interfaces**. Pour en connaître les noms réelles, utilisez: ```bash ip a ``` **Vous devez impérativement gérer ces deux réseaux sur deux *vmnet* différents.** ### Préparation obligatoire Prenez un papier et un crayon et préparez votre travail en amont afin d'éviter les erreurs. **Faites vérifier votre préparation (schémas) par le formateur.** Ceci est aussi à adapter **aux besoins** (c'est-à-dire au plan d'adressage que vous auriez mis en place) ### Avertissement Toute configuration ne respectant pas ce qui précède risque de **provoquer des dysfonctionnements** sur le réseau local. Il est de votre responsabilité de configurer correctement vos cartes `vmnet`. ### Configuration spécifique pour une machine avec deux cartes réseau Dans ce qui suit, vous allez devoir modifier les fichiers **en adaptant le nom de l'interface réseau** : - `eth0` doit être remplacé par `ensXX`; - `eth1` doit être remplacé par `ensYY`. #### Carte réseau eth1 **Exercice**: vous allez adapter le nom de cette interface selon le nom de l'interface donné par le système d'exploitation.* **IMPORTANT: faites des sauvegardes de votre configuration ou utilisez `etckeeper`** Ecrivez un script qui édite `/etc/network/interfaces` en rajoutant les informations nécessaires, et surtout **en adaptant les identifiants des interfaces réseau.** Les paramètres suivants sont à utiliser: ``` INTERFACE_WAN=eth0 INTERFACE_LAN=eth1 LAN_IP=172.16.81.2 LAN_NET=172.16.81.0 LAN_MASK=255.255.255.0 LAN_BROADCAST=172.16.81.255 ``` Pour cela, utilisez l'exemple suivant: ```conf # The loopback network interface auto lo iface lo inet loopback # The primary network interface allow-hotplug eth0 iface eth0 inet dhcp auto eth1 iface eth1 inet static address 172.16.81.2 dns-nameservers 172.16.81.2 network 172.16.81.0 netmask 255.255.255.0 broadcast 172.16.81.255 ``` Note: il n'y a pas de gateway (`eth1` n'est pas la passerelle vers Internet) On redémarre: ```bash sudo systemctl restart networking ``` ## Installation des services ### Serveur DHCP #### Installation On installe `isc-dhcp`: ```bash sudo apt-get install isc-dhcp-server ``` On fait une **copie de sauvegarde** du fichier de configuration: ```bash sudo cp /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.bak ``` #### Interface réseau Editer le fichier `/etc/default/isc-dhcp-server` Modifier la valeur de INTERFACES: ```conf INTERFACES="eth1" ``` #### Configuration des adresses On édite ce fichier `/etc/dhcp/dhcpd.conf`: ```conf ddns-update-style none; # option definitions common to all supported networks... option domain-name "exemple.cesi"; option domain-name-servers 172.16.81.2; default-lease-time 600; max-lease-time 7200; # If this DHCP server is the official DHCP server for the local # network, the authoritative directive should be uncommented. authoritative; # 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; # No service will be given on this subnet, but declaring it helps the # DHCP server to understand the network topology. subnet 192.168.0.0 netmask 255.255.255.0 { } ``` On ajoute le paragraphe suivant: ```conf subnet 172.16.81.0 netmask 255.255.255.0 { authoritative; range 172.16.81.13 172.16.81.50; option domain-name-servers 172.16.81.2 ; option domain-name "example.com"; option routers 172.16.81.2; default-lease-time 3600; max-lease-time 3600; option subnet-mask 255.255.255.0; option broadcast-address 172.16.81.255; } ``` ### Ajout d'un hôte On ajoute le paragraphe suivant pour permettre à un hôte de se connecter et obtenir une adresse IP: ```conf host debiantsr { hardware ethernet 00:0c:29:be:f9:93; fixed-address 172.16.81.11; } ``` #### Redémarrage du serveur Une fois le réseau redémarré et isc-dhcp configuré on peut le démarrer (ou redémarrer avec `restart`): ```bash sudo systemctl start isc-dhcp-server ``` #### Affichage de la liste des réservations d'adresse Le fichier `/var/lib/dhcp/dhcpd.leases` contient les réservations en cours: ```bash less /var/lib/dhcp/dhcpd.leases ``` #### Journaux Les journaux permettent d'afficher les informations renvoyées par le serveur: ```bash sudo journalctl -f -u isc-dhcp-server ``` Enlever `-f` pour un affichage normal (c'est-à-dire qui utilise la commande `less`). Le paramètre `-f` permet d'avoir le même comportement que `tail -f` ### Autres outils associés Voir cette page: https://www.isc.org/community/tools/ ## Mise en place de la passerelle réseau ### IP Forwarding ```bash sudo ne /etc/sysctl.conf ``` On décommente les lignes suivantes: ```conf net.ipv4.ip_forward=1 # ... net.ipv6.conf.all.forwarding=1 ``` On met à jour le système par rapport à cette nouvelle configuration ```bash sudo sysctl -p ``` Et on vérifie que l'on obtient 1 en appelant cette commande: ```bash $ cat /proc/sys/net/ipv4/ip_forward 1 ``` #### Exercice Ecrire un script qui remplace: - `net.ipv4.ip_forward=1` par `net.ipv4.ip_forward=0` - `net.ipv6.conf.all.forwarding=1` par `net.ipv6.conf.all.forwarding=1` ### Règles iptables #### Définition Afin de permettre à une machine se connectant à cette passerelle d'accéder à Internet, il faut ajouter la règle suivante (n'oubliez pas d'adapter l'identifiant réseau): ```bash sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE ``` Cependant, cette règle sera perdue au prochain redémarrage de la machine. #### Sauvegarde Pour éviter cela, on va installer un paquet qui permet de sauvegarder la configuration iptables et de la restaurer automatiquement au démarrage. ```bash sudo apt-get install iptables-persistent ``` Au moment de l'installation, l'installeur nous demande si nous souhaitons sauvegarder les règles. Ce qui est ici le cas. #### Sauvegarde en cas de modification Imaginons que nous effectuions un changement temporaire. Par exemple une règle de NAT qui redirige le port 80 vers le port 8080: ```bash sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080 ``` Si on veut rendre cette nouvelle règle permanente (c'est-à-dire active au prochain redémarrage de la machine), il suffit de relancer la commande suivante pour sauvegarder à nouveaux les règles iptables: ```bash sudo dpkg-reconfigure -p critical iptables-persistent ``` #### Information complémentaire Cette dernière commande (`dpkg-reconfigure`) est l'équivalent de l'exécution des commandes suivantes: ```bash iptables-save >/etc/iptables/rules.v4 ip6tables-save >/etc/iptables/rules.v6 ``` Au redémarrage, on a l'équivalent des commandes suivantes qui est exécuté par `iptables-persistent` ```bash iptables-restore < /etc/iptables/rules.v4 ip6tables-restore < /etc/iptables/rules.v6 ``` Voir [cette réponse sur StackOverflow](https://stackoverflow.com/a/30819095/1011366) #### Effacement des règles iptables Les commandes suivantes permettent de supprimer toutes les règles iptables: ```bash iptables -F iptables -t nat -F iptables -t mangle -F iptables -X ``` Ecrivez un script qui vérifie qu'il est lancé par `root` et qui lance ces commandes. ### Tests Vous devez tester que vos machines clientes se connectent à Internet. Vous devez que vos scripts fonctionnent (par exemple qu'ils désactivent l'accès Internet puis le réactivent).