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 Projet Bender en particulier.
Cette configuration correspond à la distribution Debian et peuvent varier d'une distribution à l'autre.
La première étapes consiste à configurer l'ip des interfaces.
Les commandes utiles pour afficher les informations relatives au réseau :
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
Remarque : Pour installer un serveur DNS, voir Bind.
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
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.
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;
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#
Ce chapitre décrit comment utiliser iptables, le firewall de Linux. Un script facilitant sont utilisation au quotidien est également présenté.
Le fonctionnement d'iptables est le suivant :
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 :
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 :
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
Vient ensuite les flux autorisés, par exemple :
# iptables -A INPUT -i eth1 -j ACCEPT
# iptables -A INPUT -p icmp -j ACCEPT
# iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
# iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
# 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
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 :
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 :
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 :
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.
Avant de commencer, il faut que la commande ip soit disponible, si elle ne l'est pas installer le paquet :
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.
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 :
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
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
# 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
# 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; #}
# 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
#/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
#!/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
# 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