{{tag>fr fr:linux fr:configuration_de_linux}} ====== Configuration Réseau ====== Cette page a pour but de décrire la configuration réseau simple et avancée de Linux. Sont expliqués les réglages utilisés pour [[Bender]] en particulier. Cette configuration correspond à la distribution [[Debian]] et peuvent varier d'une distribution à l'autre. ===== Configuration de la connectivité réseau ===== La première étapes consiste à configurer l'ip des interfaces. ==== Quelques commandes utiles ==== Les commandes utiles pour afficher les informations relatives au réseau : * ifconfig : affiche l'état des interfaces * netstats -rn : affiche la table de routage * host : effectue une résolution DNS en utilisant la configuration de la machine * hostname : affiche le nom de la machine * nslookup : client DNS ==== Configuration des interfaces ==== Sous [[debian]] c'est le fichier ///etc/network/interfaces// qui contient la configuration des interfaces. Voici un exemple avec le DHCP d'activé : # This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). # The loopback network interface auto lo eth0 iface lo inet loopback # The primary network interface allow-hotplug eth0 iface eth0 inet dhcp Exemple avec une IP fixe : # This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). # The loopback network interface auto lo eth0 iface lo inet loopback # The primary network interface allow-hotplug eth0 iface eth0 inet static address 192.168.10.2 netmask 255.255.255.0 gateway 192.168.10.254 ==== Configuration de la résolution DNS ==== Remarque : Pour installer un serveur DNS, voir [[dns]]. Le fichier ///etc/resolv.conf// contient la configuration DNS de l'ordinateur. En DHCP il est automatiquement configuré, il est par contre nécessaire de le modifier en cas de configuration statique. Voici un exemple : domain bouthors.fr nameserver 192.168.10.1 nameserver 192.168.10.2 * domain indique les domaines de recherche DNS * nameserver indique les serveurs DNS === Automatiser la génération de resolv.conf en adresse statique === Grâce au paquet //resolvconf// il est possible de générer le fichier ///etc/resolv.conf// sans DHCP. Il suffit d'ajouter les options suivantes dans ///etc/network.interfaces// : # dns-* options are implemented by the resolvconf package, if installed dns-nameservers 192.168.10.1 dns-search bouthors.fr Remarque : si le système a plusieurs interfaces, cela fusionne les configurations. === Options du client DHCP === Il est possible de modifier les options du client DHCP dans le fichier ///etc/dhcp3/dhclient.conf//. En général cela n'est pas nécessaire. Par exemple si vous souhaitez que le client DHCP n'écrase par la configuration DNS du PC, remplacer : request subnet-mask, broadcast-address, time-offset, routers, domain-name, domain-name-servers, host-name, netbios-name-servers, netbios-scope, interface-mtu; Par : request subnet-mask, broadcast-address, time-offset, routers, interface-mtu; ==== Résolution DNS par fichier host ==== De plus le fichier ///etc/hosts// permet de configurer des résolutions DNS statiques propres à l'ordinateur. Voici le contenu par défaut du fichier : 127.0.0.1 localhost 127.0.1.1 bender.bouthors.fr bender # The following lines are desirable for IPv6 capable hosts ::1 ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters ff02::3 ip6-allhosts bender:/etc/dhcp3# ===== Firewall ===== Ce chapitre décrit comment utiliser iptables, le firewall de Linux. Un script facilitant sont utilisation au quotidien est également présenté. ==== Règles de filtrage ==== Le fonctionnement d'iptables est le suivant : {{:linux:tables_traverse.jpg?350}} Chaque paquet doit traverser une serie de filtres en fonction de sa source et sa destination. De base, tous les paquets sont autorisés. Voici comment protéger un serveur simplement : * Forward concerne les paquets traversant un serveur en mode routeur, il faut donc le bloquer * Output analyse le paquet emit par le serveur directement, c'est à dire les sessions initiées par le serveur mais aussi les réponses au sessions reçues, il n'est pas nécessaire de le filtrer * Input filtre les demandes de connexions à destination du serveur mais aussi les réponses aux sessions émises par le serveur, c'est cette table qu'il faut construire. Pour bloquer FORWARD, il suffit d'utiliser la commande suivante : # iptables -P FORWARD DROP Avant de bloquer INPUT, il est important de laisser quelques flux passer : * les flux provenant de //lo// l'interface interne : # iptables -A INPUT -i lo -j ACCEPT * les flux provenant des connexions établies (les réponses aux requetes du serveur) # iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT Vient ensuite les flux autorisés, par exemple : * les flux provenant de l'interface du réseau interne # iptables -A INPUT -i eth1 -j ACCEPT * les flux icmp # iptables -A INPUT -p icmp -j ACCEPT * le SSH # iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT * l'accès au serveur web en HTTP # iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT * l'accès au serveur web en HTTPS # iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT Et enfin, la règle de DENY sur les autres paquets entrants : # iptables -P INPUT DROP Au final, la configuration est la suivante : bender:~# iptables-save # Generated by iptables-save v1.3.6 on Sat Jul 14 16:22:53 2007 *mangle :PREROUTING ACCEPT [1882:245141] :INPUT ACCEPT [1882:245141] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [1271:188201] :POSTROUTING ACCEPT [1271:188201] COMMIT # Completed on Sat Jul 14 16:22:53 2007 # Generated by iptables-save v1.3.6 on Sat Jul 14 16:22:53 2007 *filter :INPUT DROP [332:115556] :FORWARD DROP [0:0] :OUTPUT ACCEPT [1271:188201] -A INPUT -i lo -j ACCEPT -A INPUT -i eth1 -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT COMMIT # Completed on Sat Jul 14 16:22:53 2007 # Generated by iptables-save v1.3.6 on Sat Jul 14 16:22:53 2007 *nat :PREROUTING ACCEPT [126:14961] :POSTROUTING ACCEPT [86:8122] :OUTPUT ACCEPT [87:8195] COMMIT # Completed on Sat Jul 14 16:22:53 2007 ==== Script de démarrage ==== Voici un petit script ///etc/init.d/rc.firewall// fait maison pour sauver/charger les règles de firewall au démarrage : #!/bin/sh ####################### # # # Scripts de firewall # # www.bouthors.fr # # Licence GNU GPLv2 # # # ####################### ### BEGIN INIT INFO # Provides: rc.firewall # Required-Start: $local_fs # Required-Stop: $local_fs # Should-Start: $network # Should-Stop: $network # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Initialize iptables # Description: Load iptables configuration from /etc/firewall.conf # ### END INIT INFO #firewall rules : CONF_FILE=/etc/firewall.conf #auto save rules on halt (1 to enable) AUTO_SAVE=0 #iptables position : IPTABLES=/sbin/iptables IPTABLES_save=/sbin/iptables-save IPTABLES_load=/sbin/iptables-restore load_conf(){ # Load the saved config file if [ -f $CONF_FILE ]; then echo "Loading firewall config $CONF_FILE" cat $CONF_FILE|$IPTABLES_load else echo "Error : $CONF_FILE not found" fi } save_conf(){ # Save the current config echo "Saving firewall config to $CONF_FILE" $IPTABLES_save > $CONF_FILE } disable(){ #delete all installed rules echo "Disabling firewall" $IPTABLES -P INPUT ACCEPT $IPTABLES -P OUTPUT ACCEPT $IPTABLES -P FORWARD ACCEPT $IPTABLES -t mangle -P PREROUTING ACCEPT $IPTABLES -t mangle -P INPUT ACCEPT $IPTABLES -t mangle -P FORWARD ACCEPT $IPTABLES -t mangle -P OUTPUT ACCEPT $IPTABLES -t mangle -P POSTROUTING ACCEPT $IPTABLES -t filter -P INPUT ACCEPT $IPTABLES -t filter -P FORWARD ACCEPT $IPTABLES -t filter -P OUTPUT ACCEPT $IPTABLES -t nat -P PREROUTING ACCEPT $IPTABLES -t nat -P POSTROUTING ACCEPT $IPTABLES -t nat -P OUTPUT ACCEPT $IPTABLES -F $IPTABLES -t mangle -F $IPTABLES -t filter -F $IPTABLES -t nat -F echo "Warning : firewall disabled" echo "Warning : if you save the firewall now, you will loose all your previous config" } stop(){ #Auto save on stop if [ "$AUTO_SAVE" = "1" ]; then echo "Firewall auto save enabled : saving rules..." save_conf else echo "Firewall auto save disabled : firewall rules not saved." fi } # read the optional file name if [ "$2" != "" ]; then CONF_FILE="$2" # echo "Using config file $CONF_FILE" fi # Main function case "$1" in start) load_conf ;; stop) stop ;; save) save_conf ;; load) load_conf ;; restart) stop load_conf ;; reload) load_conf ;; disable) disable ;; *) echo "Usage: /etc/init.d/rc.firewall {start|stop|reload|save|disable} [file]" exit 1 esac exit 0 Pour l'installer copier le script dans ///etc/init.d/rc.firewall// puis tapper les commandes : # chmod a+x /etc/init.d/rc.firewall # update-rc.d rc.firewall defaults Adding system startup for /etc/init.d/rc.firewall ... /etc/rc0.d/K20rc.firewall -> ../init.d/rc.firewall /etc/rc1.d/K20rc.firewall -> ../init.d/rc.firewall /etc/rc6.d/K20rc.firewall -> ../init.d/rc.firewall /etc/rc2.d/S20rc.firewall -> ../init.d/rc.firewall /etc/rc3.d/S20rc.firewall -> ../init.d/rc.firewall /etc/rc4.d/S20rc.firewall -> ../init.d/rc.firewall /etc/rc5.d/S20rc.firewall -> ../init.d/rc.firewall # **Principe d'utilisation** : * rc.firewall save : sauve les règles en cours * rc.firewall start ou reload : recharge les règles sauvées * rc.firewall disable : laisse tout passer * rc.firewall stop : sauve les règles si AUTO_SAVE=1 (utilisé avant d'éteindre le PC) AUTO_SAVE indique si les règles sont automatiquement sauvées avant d'éteindre/rebooter. CONF_FILE=/etc/firewall.conf indique le fichier des règles par défaut. Toutes les commandes acceptent un autre nom de fichier pour les règles, par exemple : * rc.firewall save /root/firewall.conf.archive * rc.firewall reload /root/firewall.conf.autoriser_ssh ===== Policy Based Routing ===== Linux dispose de fonctionnalité de routage très puissantes qui permettent de router autrement que par l'IP destination. Prenons un exemple avec deux liaisons Internet via des FAI différents : * l'ADSL avec une ligne à faible debit (2Mbits/s) mais une latence faible et stable * le câble avec par contre un plus haut débit mais une latence relativement aléatoire. Le but est de connecter et utiliser les deux liaisons simultanéments. Etant donné la différence de qualité entre les liaisons, l'objectif est de faire passer les flux interactifs par l'ADSL et les gros débit par le câble. Le câble servira de connexion par défaut pour le serveur, certains flux seront redirigés sur l'ADSL par règle. ==== Installation ==== Avant de commencer, il faut que la commande //ip// soit disponible, si elle ne l'est pas installer le paquet : * iproute ==== Première étape : connecter les interfaces ==== La première étape consiste à relier les deux interfaces sur le serveur et faire en sorte que le serveur puisse répondre par ces deux interfaces. Dans mon cas, eth0 est le câble connecté en DHCP, eth1 est l'ADSL connecté en IP fixe. Voici le fichier ///etc/network/interfaces// : # This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). # The loopback network interface auto lo eth0 eth1 iface lo inet loopback # The primary network interface allow-hotplug eth0 iface eth0 inet dhcp # dns-* options are implemented by the resolvconf package, if installed dns-nameservers 127.0.0.1 dns-search www.bouthors.fr allow-hotplug eth1 iface eth1 inet static address 192.168.10.2 netmask 255.255.255.0 Ce qui nous donne : bender:~# ifconfig eth0 Lien encap:Ethernet HWaddr 00:11:D8:94:86:35 inet adr:85.68.230.27 Bcast:85.68.231.255 Masque:255.255.254.0 adr inet6: fe80::211:d8ff:fe94:8635/64 Scope:Lien UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:185980 errors:0 dropped:0 overruns:0 frame:0 TX packets:577 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 lg file transmission:1000 RX bytes:11654218 (11.1 MiB) TX bytes:57478 (56.1 KiB) Interruption:233 Adresse de base:0xc000 eth1 Lien encap:Ethernet HWaddr 00:11:D8:94:95:D5 inet adr:192.168.10.2 Bcast:192.168.10.255 Masque:255.255.255.0 adr inet6: fe80::211:d8ff:fe94:95d5/64 Scope:Lien UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1338 errors:0 dropped:0 overruns:0 frame:0 TX packets:1450 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 lg file transmission:1000 RX bytes:180239 (176.0 KiB) TX bytes:181244 (176.9 KiB) Interruption:58 lo Lien encap:Boucle locale inet adr:127.0.0.1 Masque:255.0.0.0 adr inet6: ::1/128 Scope:Hôte UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:404 errors:0 dropped:0 overruns:0 frame:0 TX packets:404 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 lg file transmission:0 RX bytes:42993 (41.9 KiB) TX bytes:42993 (41.9 KiB) bender:~# ip route 192.168.10.0/24 dev eth1 proto kernel scope link src 192.168.10.2 85.68.230.0/23 dev eth0 proto kernel scope link src 85.68.230.27 default via 85.68.231.254 dev eth0 Seul le réseau 192.168.10.0/24 est accessible sur l'interface eth1. Si un flux internet arrive sur l'adresse 192.168.10.2, Linux répondra avec cette adresse mais en utilisant la passerelle de l'interface eth0. Pour que internet soit également accessible il est nécessaire d'indiquer à Linux que lorsqu'il utilise l'adresse source 192.168.10.2, il doit alors utiliser la gateway 192.168.10.254. Il faut tout d'abord configurer une nouvelle table de routage séparée pour l'ADSL : #ip route add 192.168.10.0/24 dev eth1 table 100 #ip route add 127.0.0.0/8 dev lo table 100 #ip route add default via 192.168.10.254 table 100 La table 100 est maintenant configurée : bender:~# ip route show table 100 192.168.10.0/24 dev eth1 scope link 127.0.0.0/8 dev lo scope link default via 192.168.10.254 dev eth1 bender:~# Il suffit d'indiquer à Linux de l'utiliser pour l'adresse de l'interface eth1 : bender:~# ip rule 0: from all lookup 255 32766: from all lookup main 32767: from all lookup default bender:~# ip rule add from 192.168.10.2 table 100 bender:~# ip rule 0: from all lookup 255 32765: from 192.168.10.2 lookup 100 32766: from all lookup main 32767: from all lookup default bender:~# Lorsque des flux Internet sont envoyées sur l'interface eth1, le serveur répond désormais correctement. ==== Deuxième étape : rediriger les flux par règle ==== Suite à la première étape, le serveur répond correctement aux requêtes provenant des deux interfaces. Mais il utilise toujours eth0 pour la plupart des flux. Pour utiliser la deuxième interface, il suffit de configurer les logiciels pour utiliser eth1. Il est également possible de forcer l'utilisation de la deuxième interface par règle. Le principe est le suivant : - on marque une session avec le firewall - on redirige les sessions avec le policy based routing - on source NAT le flux pour qu'il utilise la bonne IP source Le reroutage du flux ne change pas l'ip source par défaut qui utilise l'IP de eth0. C'est pourquoi nous sommes obligés de faire un NAT source. Le marquage des flux par iptables s'effectue ainsi (exemple avec le DNS) #iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 53 -j MARK --set-mark 0x2 #iptables -t mangle -A OUTPUT -p udp -m udp --dport 53 -j MARK --set-mark 0x2 Puis la redirection avec #ip rule add fwmark 2 table 100 Enfin le NAT des flux redirigés : #iptables -t nat -A POSTROUTING -s ! 192.168.10.0/255.255.255.0 -o eth1 -j MASQUERADE ==== Automatiser la configuration au démarrage ==== Afin de rendre la configuration permanente, le plus simple est de créer un script appelé au démarrage. Par exemple, créer le script ///etc/rc.local.routes// : #/bin/sh ip route add 192.168.10.0/24 dev eth1 table 100 ip route add 127.0.0.0/8 dev lo table 100 ip route add default via 192.168.10.254 table 100 ip rule add from 192.168.10.2 table 100 ip rule add fwmark 2 table 100 Et ajouter ce script à ///etc/rc.local// : #!/bin/sh -e # # rc.local # # This script is executed at the end of each multiuser runlevel. # Make sure that the script will "exit 0" on success or any other # value on error. # # In order to enable or disable this script just change the execution # bits. # # By default this script does nothing. /etc/rc.local.routes exit 0 ===== Annexe : configuration complète de Bender ===== ==== /etc/network/interfaces ==== # This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). # The loopback network interface auto lo eth0 eth1 iface lo inet loopback # The primary network interface allow-hotplug eth0 iface eth0 inet dhcp # dns-* options are implemented by the resolvconf package, if installed dns-nameservers 127.0.0.1 dns-search bouthors.fr allow-hotplug eth1 iface eth1 inet static address 192.168.10.2 netmask 255.255.255.0 ==== /etc/dhcp3/dhclient.conf ==== # Configuration file for /sbin/dhclient, which is included in Debian's # dhcp3-client package. # # This is a sample configuration file for dhclient. See dhclient.conf's # man page for more information about the syntax of this file # and a more comprehensive list of the parameters understood by # dhclient. # # Normally, if the DHCP server provides reasonable information and does # not leave anything out (like the domain name, for example), then # few changes must be made to this file, if any. # #send host-name "andare.fugue.com"; #send dhcp-client-identifier 1:0:a0:24:ab:fb:9c; #send dhcp-lease-time 3600; #supersede domain-name "fugue.com home.vix.com"; #prepend domain-name-servers 127.0.0.1; request subnet-mask, broadcast-address, time-offset, routers, interface-mtu; #request subnet-mask, broadcast-address, time-offset, routers, # domain-name, domain-name-servers, host-name, # netbios-name-servers, netbios-scope, interface-mtu; #require subnet-mask, domain-name-servers; #timeout 60; #retry 60; #reboot 10; #select-timeout 5; #initial-interval 2; #script "/etc/dhcp3/dhclient-script"; #media "-link0 -link1 -link2", "link0 link1"; #reject 192.33.137.209; #alias { # interface "eth0"; # fixed-address 192.5.5.213; # option subnet-mask 255.255.255.255; #} #lease { # interface "eth0"; # fixed-address 192.33.137.200; # medium "link0 link1"; # option host-name "andare.swiftmedia.com"; # option subnet-mask 255.255.255.0; # option broadcast-address 192.33.137.255; # option routers 192.33.137.250; # option domain-name-servers 127.0.0.1; # renew 2 2000/1/12 00:00:01; # rebind 2 2000/1/12 00:00:01; # expire 2 2000/1/12 00:00:01; #} ==== /etc/resolv.conf ==== # Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8) # DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN nameserver 127.0.0.1 search bouthors.fr ==== /etc/rc.local.routes ==== #/bin/sh ip route add 192.168.10.0/24 dev eth1 table 100 ip route add 127.0.0.0/8 dev lo table 100 ip route add default via 192.168.10.254 table 100 ip rule add from 192.168.10.2 table 100 ip rule add fwmark 2 table 100 ==== /etc/rc.local ==== #!/bin/sh -e # # rc.local # # This script is executed at the end of each multiuser runlevel. # Make sure that the script will "exit 0" on success or any other # value on error. # # In order to enable or disable this script just change the execution # bits. # # By default this script does nothing. /etc/rc.local.routes exit 0 ==== /etc/firewall.conf ==== # Generated by iptables-save v1.3.6 on Mon Jul 30 13:24:53 2007 *nat :PREROUTING ACCEPT [3404:930842] :POSTROUTING ACCEPT [41:2539] :OUTPUT ACCEPT [52:3391] -A POSTROUTING -s ! 192.168.10.0/255.255.255.0 -o eth1 -j MASQUERADE COMMIT # Completed on Mon Jul 30 13:24:53 2007 # Generated by iptables-save v1.3.6 on Mon Jul 30 13:24:53 2007 *filter :INPUT DROP [2650:834284] :FORWARD DROP [0:0] :OUTPUT ACCEPT [12369:1771953] -A INPUT -i lo -j ACCEPT -A INPUT -i eth1 -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT -A INPUT -p tcp -m tcp --dport 25 -j ACCEPT -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT -A INPUT -p tcp -m tcp --dport 55000:59000 -j ACCEPT -A INPUT -p tcp -m tcp --dport 4662 -j ACCEPT -A INPUT -p tcp -m tcp --dport 4666 -j ACCEPT -A INPUT -p tcp -m tcp --dport 6882 -j ACCEPT COMMIT # Completed on Mon Jul 30 13:24:53 2007 # Generated by iptables-save v1.3.6 on Mon Jul 30 13:24:53 2007 *mangle :PREROUTING ACCEPT [16911:11516410] :INPUT ACCEPT [16910:11516360] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [12369:1771953] :POSTROUTING ACCEPT [12369:1771953] -A OUTPUT -p tcp -m tcp --dport 53 -j MARK --set-mark 0x2 -A OUTPUT -p udp -m udp --dport 53 -j MARK --set-mark 0x2 COMMIT # Completed on Mon Jul 30 13:24:53 2007 ===== Backup ===== * /etc/network/interfaces * /etc/resolv.conf * /etc/hosts * /etc/dhcp3/dhclient.conf * /etc/init.d/rc.firewall * /etc/firewall.conf * /etc/rc.local.routes * /etc/rc.local ===== Links ===== * http://iptables-tutorial.frozentux.net/iptables-tutorial.html * [[http://www.lartc.org/|Linux Advanced Routing & Traffic Control]]