Administration Unix - CM séance 17
17. La gestion du réseau
17.1. Gestion par le noyau
Le noyau joue un rôle central dans la gestion du réseau :
- il permet la communication avec les périphériques ;
- il assure la transmission des paquets entre les interfaces et les programmes.
La configuration est basée sur des interfaces physiques, qui ont pour noms :
lo interface de loopback (127.0.0.1, ::1, localhost)
eth0, eth1,... cartes réseaux (anciens noms)
wlan0, wlan1,... cartes wifi (anciens noms)
ens0, ens1,... carte ethernet interne
enp1s2 carte ethernet sur bus pci, domain 1 slot 2
wlp3s0 carte wifi, domain 3 slot 0
...
Les anciens noms (eth0
, wlan
, ...) étaient assignés au boot selon l'ordre de
découverte des périphériques.
Les nouveaux noms (en*
, wl*
, ...) sont assignés dynamiquement par le démon udev
,
avec des règles plus prévisibles et indépendantes de l'ordre de découverte :
man systemd.net-naming-scheme
man udev
Les interfaces disponibles sont listées comme des fichiers dans le répertoire
virtuel /sys/class/net/
:
$ ls /sys/class/net/
enp0s3 lo
17.2. Fichiers de configuration
Au démarrage, les interfaces sont configurées avec des valeurs par défaut, qui sont décrites dans des fichiers de configuration ;
ensuite, il est possible d'agir sur une interface avec les commandes traditionnelles :
ifup active une interface ("if" pour "InterFace")
ifdown désactive une interface
ifquery examine la configuration des interfaces
ifconfig configure une interface
La configuration dépend du système et des démons utilisés.
On peut connaître les fichiers de configuration à la fin de : man ifup
17.2.1. Configuration des systèmes Debian et Ubuntu
Les commandes ifup
, ifdown
, les scripts associés et les fichiers de
configuration viennent avec le paquet : ifupdown
.
Il est normalement installé de base sur Debian, et Ubuntu <= 16.04. Il est optionnel sur Ubuntu > 16.04.
Les fichiers de configuration au démarrage sont dans :
/etc/network/interfaces
/etc/network/interfaces.d/*
voir : man 5 interfaces
Exemple :
$ cat /etc/network/interfaces
# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback
allow-hotplug eth0
iface eth0 inet dhcp
iface eth1 inet static
address 10.1.3.98
netmask 255.255.0.0
gateway 10.1.2.150
# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d
Syntaxe :
auto <interface> interface démarrée automatiquement
allow-hotplug <interface> idem, branchement à chaud
iface <interface> <type> <méthode> [options]... configure une InterFACE
source-directory <répertoire> importe chaque fichier du répertoire
...
Dans les lignes commençant par iface
, les éléments les plus fréquemment
rencontrés sont :
<type>
inet pour IPV4
inet6 pour IPV6
<méthode> [options]...
loopback pour l'interface loopback
dhcp configuration DHCP (si le gestionnaire est installé)
manual configuration renvoyée à l'utilisateur
static configuration en dur dans le fichier ; options :
address, netmask, gateway, broadcast, hwaddress,...
- Remarque :
- si une interface n'est pas décrite dans ces fichiers, alors
ifup
etifdown
ne pourront pas les gérer ⟶ utiliserifconfig
.
17.2.2. Évolution et autres systèmes
Les commandes ifup
/ifdown
tendent à être remplacées par :
-
systemd.network(5)
:- cohabite avec
/etc/network/interfaces
, qui ne sert plus qu'à déclarer les interfacesloopback
⟶ utilitéifup
/ifdown
limitée ; pour des usages simples.
- cohabite avec
-
networkmanager(8)
, avec les utilitairesnmcli
etnm-*
:-
utilisé par défaut sous Debian et dérivés ;
-
gestion plus poussée du réseau, y compris par interface graphique (
nm-applet
) ; utilisesystemd
, donc gérable parsystemctl
; -
NetworkManager peut également gérer les interfaces décrites dans
/etc/network/interfaces
(dontloopback
), à condition de déclarer dans/etc/NetworkManager/NetworkManager.conf
, la lignemanaged=true
dans la section[ifupdown]
(voirman NetworkManager.conf
).
-
Comparaison entre ces familles de commandes : https://unix.stackexchange.com/a/573009
Guide pour utiliser NetworkManager sous RHEL/Fedora/CentOS : https://www.tecmint.com/manage-networking-with-networkmanager-in-rhel-centos/
17.3. Manipulation avec ifconfig et route
Les premières commandes traditionnelles pour manipuler et interroger les
interfaces réseau sont ifconfig
et route
(paquet net-tools
).
Pour interroger les interfaces :
ifconfig affiche les interfaces qui sont UP
ifconfig -a affiche toutes les interfaces
ifconfig -s résumé des statistiques
ifconfig <interface> affiche cette interface
$ ifconfig enp0s3
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.2.15 netmask 255.255.255.0 broadcast 10.0.2.255
inet6 fe80::f97a:bc6:7bd3:ef92 prefixlen 64 scopeid 0x20<link>
ether 08:00:27:f4:38:47 txqueuelen 1000 (Ethernet)
RX packets 39369 bytes 33721444 (33.7 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 17655 bytes 1082380 (1.0 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Pour modifier l'état d'une interface :
ifconfig [-v] <interface> [options]...
où option
pourra être par exemple :
up pour activer une interface
down pour la désactiver
<adresse> spécifie une adresse IPV4 ou IPV6 (format CIDR possible)
netmask <adr> pour spécifier un masque de sous-réseau
Exemple sur XUbuntu :
$ sudo ifdown enp0s3
ifdown: unknown interface enp0s3 # normal, non décrite dans
# /etc/network/interfaces
$ sudo ifconfig enp0s3 down
$ ifconfig enp0s3
enp0s3: flags=4098<BROADCAST,MULTICAST> mtu 1500
ether 08:00:27:f4:38:47 txqueuelen 1000 (Ethernet)
...
$ sudo ifconfig enp0s3 up
$ ifconfig enp0s3
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.2.15 netmask 255.255.255.0 broadcast 10.0.2.255
inet6 fe80::f97a:bc6:7bd3:ef92 prefixlen 64 scopeid 0x20<link>
ether 08:00:27:f4:38:47 txqueuelen 1000 (Ethernet)
...
$ sudo ifconfig enp0s3 10.1.2.3/16 # format CIDR ⟶ netmask déduit
$ ifconfig enp0s3
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.1.2.3 netmask 255.255.0.0 broadcast 10.1.255.255
inet6 fe80::f97a:bc6:7bd3:ef92 prefixlen 64 scopeid 0x20<link>
ether 08:00:27:f4:38:47 txqueuelen 1000 (Ethernet)
...
$ sudo ifconfig enp0s3 10.0.2.15/24 down up # on remet comme c'était
La table de routage (du noyau) permet d'indiquer que les paquets à destination de certaines adresses réseau doivent passer par une passerelle.
Pour connaître la table de routage du noyau :
route [-n] l'option -n pour afficher les adresses numériques
plutôt que d'essayer de retrouver des noms d'hôtes.
$ route
Table de routage IP du noyau
Destination Passerelle Genmask Indic Metric Ref Use Iface
default _gateway 0.0.0.0 UG 100 0 0 enp0s3
10.0.2.0 0.0.0.0 255.255.255.0 U 100 0 0 enp0s3
link-local 0.0.0.0 255.255.0.0 U 1000 0 0 enp0s3
L'usage de la commande route
est principalement de la forme :
route [-A family] add [-host|-net] <cible> [netmask Nm] [gw GW] [[dev] If]
route [-A family] del <cible> [netmask Nm] [gw GW] [[dev] If]
Les éléments sont :
<cible> adresse (notation CIDR possible)
-A family définit la famille de routage : inet (IPV4), inet6, ...
gw pour définir la passerelle
netmask le masque de sous-réseau
[dev] If spécifie une interface
La commande permet également de définir une route par défaut, pour les réseaux non prévus dans les autres routes :
route add default gw <passerelle>
route del default gw <passerelle>
Exemple : soit les 3 machines reliées ainsi :
moufle
| enp0s3 : 139.124.10.21
| réseau 139.124.0.0/16
| eth1 : 139.124.14.150
bonnet
| eth2 : 192.168.2.110
| réseau 192.168.2.0/24
| enp1s2 : 192.168.2.33
mitaine
bonnet
joue le rôle de passerelle, avec 2 interfaces eth1
et eth2
.
Pour que moufle
puisse directement parler à mitaine
:
-
sur
moufle
, il faut définir une route disant que les paquets à destination du réseau192.168.2.0/24
doivent passer par la passerelle139.124.14.150
:moufle$ sudo route add -net 192.168.2.0/24 gw 139.124.14.150
-
sur
mitaine
, définir une route à destination du réseau139.124.0.0/16
par la passerelle192.168.2.110
:mitaine$ sudo route add -net 139.124.0.0/16 gw 192.168.2.110
-
sur
bonnet
: la passerelle doit être configurée pour transmettre les paquets IP d'un réseau à l'autre (IP forwarding).Pour savoir si l'IP forwarding est activé :
bonnet$ cat /proc/sys/net/ipv4/ip_forward # 1 si actif, 0 inactif
ou
bonnet$ sysctl net.ipv4.ip_forward # idem
Pour l'activer :
bonnet$ sudo -i # ou encore : sudo su bonnet% echo 1 >/proc/sys/net/ipv4/ip_forward bonnet% exit
ou
bonnet$ sudo sysctl -w net.ipv4.ip_forward=1
Pour rendre le changement persistant : dé-commenter dans
/etc/sysctl.conf
la ligne :#net.ipv4.ip_forward=1
17.4. Manipulation avec la commande ip
La couche réseau du noyau a été réécrite et de nouvelles fonctionnalités ont
été installées dans le noyau. Pour gérer ces fonctionnalités, la commande ip
a été développées, disponible via le paquet iproute2
.
La commande ip
permet aussi de remplacer ifconfig
, route
, arp
, etc.
Elle permet de travailler sur des objets, notamment :
link pour lister ou configurer les interfaces (lien)
addr pour manipuler les adresses
neigh pour manipuler la table arp des voisins sur le réseau
route pour lister/manipuler les routes
Pour voir la configuration d'un objet :
ip <objet> [show]
Par exemple :
ip link affiche les interfaces et adresses MAC
ip addr affiche les interfaces et adresses IP
ip route affiche les routes
Pour obtenir de l'aide sur un objet :
ip <objet> help
man ip-<objet>
Pour chaque objet il y a ensuite des commandes spécifiques :
-
pour mettre une interface
up
oudown
:ip link set dev <interface> up ip link set dev <interface> down ip link help man ip-link
-
pour attacher ou supprimer une adresse IP à une interface :
ip addr add <adresse_cidr> dev <interface> ip addr del <adresse_cidr> dev <interface> ip addr help man ip-address
-
pour configurer une route ou la supprimer :
ip route add <adresse_cidr> via <passerelle> ip route del <adresse_cidr> via <passerelle> ip route help man ip-route
Remarque : lorsqu'on donne une adresse à une interface,
-
avec
iconfig
, la commande met automatiquement l'interface àup
ifconfig <interface> <adresse_cidr>
-
avec
ip
il faut la mettre explicitement àup
:ip addr add <adresse_cidr> dev <interface> ip link set dev <interface> up
Pour qu'une interface soit configurée en DHCP, après qu'elle soit passée à up
il faut utiliser la commande dhclient
:
dhclient <interface>
17.5. Les modules du noyau
Pour limiter l'empreinte mémoire du noyau, certaines fonctionnalités sont disponibles sous forme de modules :
- les drivers pour les périphériques (par ex.
e1000
pour les cartes réseau Intel gigabit PCI,e1000e
en PCIe, etc) ; - les fonctionnalités elles-même, comme les bridge et stp (spanning tree protocol) ;
- ...
Les modules sont des fichiers .ko
dans les sous-répertoires de
/lib/modules/<version_noyau>/kernel/
;
Il y en a plus de 3500 !
Pour les charger/décharger du noyau, les commandes de base sont :
lsmod pour lister les modules actuellement chargés
insmod pour charger un module dans le noyau en fonctionnement
rmmod pour décharger un module, s'il n'est pas requis par un autre
La commande modprobe
remplace avantageusement les 2 commandes précédentes :
insmod
etrmmod
ont besoin du chemin pour un module, tandis quemodprobe
utilise le nom du module (qui doit être bien rangé !) ;modprobe
gère les dépendances.
Exemple :
$ lsmod | grep -E "bridge|stp" # rien ⟶ pas chargés
$ sudo modprobe bridge stp # charge les modules et les
# dépendances.
$ lsmod | grep -E "bridge|stp"
bridge 176128 0
stp 16384 1 bridge
llc 16384 2 bridge,stp # Logical Link Control
$ sudo modprobe -r llc # décharge le module
modprobe: FATAL: Module llc is in use.
17.6. Les ponts internes (bridge)
Il est possible de gérer des switches internes, qui permettent de séparer des groupes de machines les uns des autres (au niveau des adresses MAC).
C'est relativement rare pour des stations de travail, mais très fréquent pour des serveurs qui hébergent des machines virtuelles ; cela permet de gérer des réseaux virtuels.
La fonctionnalité est liée au module bridge
du noyau.
Le programme brctl
(paquet bridge-utils
) gère les bridges dans le noyau.
Quelques options sont :
show affiche la liste des bridges configurés
addbr bridge1 crée un nouveau bridge
delbr bridge1 supprime le bridge
addif bridge1 int1 connecte l'interface int1 à bridge1
delif bridge1 int1 supprime l'interface int1 de bridge1
showmacs affiche les adresses MAC
stp bridge1 on|off configure le spanning tree protocol sur bridge1
show stp bridge1 affiche le statut du stp sur bridge1
Par exemple :
$ sudo brctl addbr monbridge
$ brctl show
bridge name bridge id STP enabled interfaces
monbridge 8000.000000000000 no
$ ip link
...
3: monbridge: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode \
DEFAULT group default qlen 1000
link/ether 66:f5:fc:ae:24:57 brd ff:ff:ff:ff:ff:ff
Le bridge est aussi apparu comme une interface réseau.
Il faut le passer à up;
pour qu'on puisse lui transmettre des paquets :
$ sudo ip link set dev monbridge up
On peut lui connecter une interface :
$ sudo brctl addif monbridge enp0s3
$ brctl show
bridge name bridge id STP enabled interfaces
monbridge 8000.080027f43847 no enp0s3
Et pour pouvoir se connecter à la machine via une des interfaces de ce bridge, on pourra lui donner une adresse IP :
$ sudo ip addr add dev monbridge 192.168.10.20/24
$ ip addr show
...
3: monbridge: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue \
state UP group default qlen 1000
link/ether 08:00:27:f4:38:47 brd ff:ff:ff:ff:ff:ff
inet 192.168.10.20/24 scope global monbridge
...
17.7. Commandes utiles pour l'analyse du réseau
lsof -i affiche les fichiers ouverts (lsof) sur le réseau (-i)
netstat --inet affiche les ports ouverts sur la machine
nethogs outil du type 'top', affiche le trafic groupé par processus
etherape affichage graphique du trafic sur le réseau
nmap permet de scanner à distance une machine pour savoir quels
ports sont ouverts
nmapfe interface graphique pour nmap
tcpdump affiche le trafic qui passe par une interface
wireshark permet de monitorer toutes les interfaces, très complet