**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** # Howto Reseau sous Debian ## Configuration IP fixe La configuration d'une interface réseau avec une IP fixée se passe dans le fichier _/etc/network/interfaces_. Voici un exemple simple : ~~~ auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 192.0.43.10 netmask 255.255.255.0 gateway 192.0.43.254 ~~~ Pour l'IPv6 il faut rajouter : ~~~ iface eth0 inet6 static address 2001:500:88:200::10 netmask 48 up /bin/ip route add 2000::0/3 via 2001:500:88:200::254 ~~~ Si besoin d'exécuter des commandes après l'activation de l'interface (classiquement des ajouts de routes), on utilise l'option _up_. Par exemple : ~~~ auto eth0 iface eth0 inet static address 192.0.43.10 netmask 255.255.255.0 gateway 192.0.43.254 up /sbin/route add -net 192.0.42.0/24 gw 192.0.43.242 ~~~ Pour ajouter des interfaces virtuelles, toujours via _/etc/network/interfaces_ on fera : ~~~ auto eth0:0 iface eth0:0 inet static address 192.0.43.11 netmask 255.255.255.0 ~~~ Note 1 : certains hébergeurs comme OVH préconisent une configuration un peu différente, voir [wiki:ServeurOVH#IPFailOver] Note 2 : dans certains cas particuliers (comme le besoin de préciser le nom de l'interface dans une commande _iptables_) on souhaite avoir un nom d'interface virtuelle sans les ":". Il faudra donc passer par la commande _ip_ (voir ci-dessous). Mais tout cela se gère également dynamiquement via les commande _ifconfig_ et _ip_. Quelques exemples : ~~~ # ifconfig eth0 add 192.0.43.11 netmask 255.255.255.0 # ip addr add 192.0.43.12/24 dev eth0 # ip addr add 192.0.43.13/24 dev eth0 label eth0:3 # ip addr del 192.0.43.12/24 dev eth0 ~~~ Attention, avec la commande _ip_ le résultat ne sera pas visible avec _ifconfig_ si aucun label du type eth0:N n'est donné à l'interface ; on ne verra l'adresse qu'avec un : ~~~ # ip addr show ~~~ Notons que dans certains cas particuliers (comme le besoin de préciser le nom de l'interface dans une commande _iptables_) on souhaite avoir un nom d'interface virtuelle sans les ":". On utilisera donc simplement un label sans ":" : ~~~ # ip addr add 192.0.43.13/24 dev label eth00 # iptables -t nat -A POSTROUTING -o eth00 [...] ~~~ ## Configuration serveur(s) DNS Le fichier _/etc/hosts_ permet d'indiquer manuellement des enregistrements DNS, du type : ~~~ 127.0.0.1 ad.doubleclick.net ~~~ Pour note, ces enregistrements sont par défaut prioritaires sur les réponses des serveurs DNS (et pour rappel, les commandes dig et host n'utilisent PAS _/etc/hosts_). La configuration du (ou des) serveur(s) DNS s'effectue dans le fichier _/etc/resolv.conf_. Voici un exemple classique : ~~~ search example.com nameserver 192.0.42.53 nameserver 192.0.43.53 options timeout:2 attempts:2 ~~~ Pour des précisions sur les options possibles : _man resolv.conf_ Note : si l'on utilise Postfix, il faut le redémarrer suite à un changement dans _/etc/resolv.conf_ (car il est chrooté par dédaut et il gère sa propre copie dans /var/spool/postfix) ## Bridge Pour créer un bridge : ~~~ # brctl addbr br0 # brctl addif br0 eth0 # ifconfig eth0 up ~~~ Au niveau /etc/network/interfaces on aura ainsi : ~~~ auto eth0 iface eth0 inet manual auto br0 iface br0 inet manual bridge_ports eth0 ~~~ Et l'on listera les infos d'un bridge via : ~~~ # brctl show bridge name bridge id STP enabled interfaces br0 8000.001e0beac6c0 no eth0 ~~~ Pour avoir un bridge vide : ~~~ auto br0 iface br0 inet manual bridge_ports none ~~~ ## VLAN ~~~ # aptitude install vlan # modprobe 8021q ~~~ Pour ajouter dans le VLAN 42 ~~~ # vconfig add eth0 42 # ifconfig eth0.42 ~~~ Le fichier /etc/network/interfaces : ~~~ # cat /etc/network/interfaces auto eth0.42 iface eth0.42 inet static address 192.0.43.10 netmask 255.255.255.0 gateway 192.0.43.254 ~~~ ~~~ # systemctl enable networking # systemctl start networking ~~~ ### Gestion des VLAN avec iproute L'utilitaire ip (paquet iproute) permet aussi de gérer les VLAN. Exemple : ~~~ # ip link add link eth0 name eth0.42 type vlan id 42 # ip addr add 192.168.1.1/24 dev eth0.42 # ip link set dev eth0.42 up ~~~ ## Désactiver IPv6 De façon temporaire : ~~~ # sysctl -w net.ipv6.conf.all.disable_ipv6=1 ~~~ De façon définitive : ~~~ # echo net.ipv6.conf.all.disable_ipv6=1 >> /etc/sysctl.conf ~~~ et décommenter la ligne suivante dans `/etc/gai.conf` : ~~~ precedence ::ffff:0:0/96 100 ~~~ ## Changer son adresse MAC ~~~ # ifconfig eth0 hw ether 01:23:45:67:89:0a ~~~ ## Migrer de networkd à ifup À partir de Stretch, certaines machines sont installés d'office avec networkd (qui fait partie de systemd), on peut vouloir migrer à ifup (`/etc/network/interfaces`) pour plusieurs raisons (compatibilité, …). Voici les opérations à faire : - On récupère les informations avec `networkctl status nomInterface` et/ou `cat /etc/systemd/network/50-default.network` ; - On construit le fichier `/etc/network/interfaces` avec les informations récupérés (se baser sur un existant par exemple) ; - On désactive `systemd-networkd` et on redémarre le service `networking` : ~~~ # systemctl stop systemd-networkd.service; systemctl disable systemd-networkd.service; systemctl restart networking ~~~ Un exemple de conversion : ~~~ # networkctl status eno1 ● 2: eno1 Link File: /etc/systemd/network/50-public-interface.link Network File: /etc/systemd/network/50-default.network Type: ether State: routable (failed) Path: pci-0000:03:00.0 Driver: igb Vendor: Intel Corporation Model: I210 Gigabit Network Connection HW Address: 00:01:02:03:04:05 (Intel Corporate) Address: 192.0.2.100 2001:db8::100 Gateway: 192.0.2.254 (Cisco Systems, Inc) fe80::12bd:18ff:ffff:ffff (Cisco Systems, Inc) DNS: 127.0.0.1 192.0.2.254 NTP: ntp.ovh.net # cat /etc/systemd/network/50-default.network # This file sets the IP configuration of the primary (public) network device. # You can also see this as "OSI Layer 3" config. # It was created by the OVH installer, please be careful with modifications. # Documentation: man systemd.network or https://www.freedesktop.org/software/systemd/man/systemd.network.html [Match] MACAddress=00:01:02:03:04:05 [Network] Description=network interface on public network, with default route DHCP=no Address=192.0.2.100/24 Gateway=192.0.2.254 #IPv6AcceptRA=false NTP=ntp.ovh.net DNS=127.0.0.1 DNS=192.0.2.254 Gateway=2001:41d0:0002:f5ff:ff:ff:ff:ff [Address] Address=2001:41d0:0002:f55c::/64 [Route] Destination=2001:41d0:0002:f5ff:ff:ff:ff:ff Scope=link ~~~ On reporte dans `/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 iface lo inet loopback # The primary network interface auto eno1 iface eno1 inet static address 192.0.2.100/24 gateway 192.0.2.254 iface eno1 inet6 static address 2001:db8::100/64 gateway 2001:41d0:0002:f5ff:ff:ff:ff:ff post-up /sbin/ip -6 route add 2001:41d0:0002:f5ff:ff:ff:ff:ff dev eno1 post-up /sbin/ip -6 route add default via 2001:41d0:0002:f5ff:ff:ff:ff:ff ~~~ On désactive/stop networkd et on relance le service networking : ~~~ # systemctl stop systemd-networkd.service; systemctl disable systemd-networkd.service; systemctl restart networking ~~~ ## Haute Performance Si besoin de « haute performance », on appliquera la configuration [sysctl](https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt) suivante : * `net.nf_conntrack_max=262144` (utiliser `conntrack -L` pour bien ajuster la valeur) * `net.core.somaxconn=1024` * `net.ipv4.tcp_max_syn_backlog=1024` * `net.ipv4.tcp_tw_reuse=1` * `net.ipv4.tcp_fin_timeout=30` * `net.ipv4.ip_local_port_range=2000 65000` Si cela ne suffit pas, voici quelques pistes pour aller plus loin : * lire * lire et notamment les options `net.core.*mem*`, `net.core.optmem_max`, `net.ipv4.tcp_*mem`, `net.core.netdev_max_backlog`, `net.ipv4.tcp_max_tw_buckets` * augmenter le buffer de certains cartes réseau avec [ethtool]() : voir `ethtool -g eth0` et modifier avec `ethtool -G eth0 rx/rx-mini/rx-jumbo/tx NNNN` ## arp-sk Dans certains cas, les routeurs gardent un cache ARP trop long, et il est pratique de les « empoisonner » pour le forcer à changer. Cela peut être utilisé dans le cas d'un changement d'une adresse IP d'un serveur vers un autre sur le même réseau. On utilise un vieil outil magique [arp-sk](http://sid.rstack.org/arp-sk/). L'idée est de le compiler en static et de l'envoyer sur la machine avec la nouvelle IP : ~~~ # apt install libnet1-dev $ cd /tmp $ wget http://sid.rstack.org/arp-sk/files/arp-sk-0.0.16.tgz $ tar xf arp-sk-0.0.16.tgz $ cd arp-sk-0.0.16 $ ./configure LDFLAGS="-static" $ make $ scp src/arp-sk serveur.example: ~~~ puis sur ce serveur on spécifie l'IP déplacée (par exemple 192.0.2.42), l'IP du routeur (par exemple 192.0.2.254) et la nouvelle adresse MAC (par exemple 52:54:00:12:34:56) : ~~~ # /home/foo/arp-sk -r -S 192.0.2.42 -D 192.0.2.254 -s 52:54:00:12:34:56 ... ~~~ ## Serveur temporaire avec socat ou nc Il arrive qu'on veuille vérifier qu'il est possible de joindre un port TCP au travers d'un firewall, alors que rien n'écoute sur ce port à ce moment là. On peut alors utiliser `socat(1)` ou `nc(1)` pour créer un serveur temporaire, qui imprimera sur la sortie standard ce qui arrive sur le port. Exemple sur le port 2121, en écoute sur toutes les interfaces du serveur : ~~~ # socat - TCP-LISTEN:2121,crlf ~~~ ~~~ # nc -lk -p 2121 ~~~ ## Man-in-the-middle du pauvre Lorsqu'on souhaite consulter ce qui passe en TCP entre 2 processus ou serveurs (par exemple entre HAProxy et Apache), pour analyser par exemple les en-têtes échangés… on peut utiliser tcpdump, mais cela n'est pas toujours aisé. Il est possible d'intercaler `socat(1)` entre les 2 processus. Il fera le passe-plat mais nous indiquera aussi (sur la sortie standard) ce qui est échangé. Ici on ouvre localement le port 8080 et on renvoie le flux vers le port 8080 de example.com. ~~~ # socat -v tcp-listen:8080,keepalive=1 tcp:example.com:8080 ~~~ NB : cette commande socat n'est pas optimale, la connexion coupe après le premier échange, mais elle illustre le principe. ## FAQ ### Bascule réseau à chaud Si l'on fait une modification réseau sur un serveur distant il est important de ne pas perdre la main. Voici une méthode possible en utilisant [screen](HowtoScreen), exemple avec la bascule sur un bridge : ~~~ # cp /etc/network/interfaces /var/backups/ # vim /etc/network/interfaces [...] # screen -S network -dm bash -c "sleep 300; cp /var/backups/interfaces /etc/network/; systemctl stop networking; systemctl start networking" # screen -S reboot -dm bash -c "sleep 600; reboot" # systemctl restart networking; ip a d 192.0.2.42/24 dev eth0; ip a a 192.0.2.42/24 dev br0; ip r d default via 192.0.2.1 dev eth0; ip r a default via 192.0.2.1 dev br0 ~~~ Ainsi, si l'on perd la main, la machine revient accessible en quelques minutes. Si l'on ne perd pas la main, il faut stopper les commandes lancées dans les screens. ### Divers