Aller au contenu

Administration Unix - CM séance 17

Annonce :

  • les 4 dernières séances de TP seront consacrées au projet.

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 et ifdown ne pourront pas les gérer ⟶ utiliser ifconfig.

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 interfaces loopback ⟶ utilité ifup/ifdown limitée ; pour des usages simples.
  • networkmanager(8), avec les utilitaires nmcli et nm-* :

    • utilisé par défaut sous Debian et dérivés ;

    • gestion plus poussée du réseau, y compris par interface graphique (nm-applet) ; utilise systemd, donc gérable par systemctl ;

    • NetworkManager peut également gérer les interfaces décrites dans /etc/network/interfaces (dont loopback), à condition de déclarer dans /etc/NetworkManager/NetworkManager.conf, la ligne managed=true dans la section [ifupdown] (voir man 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]...

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éseau 192.168.2.0/24 doivent passer par la passerelle 139.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éseau 139.124.0.0/16 par la passerelle 192.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 ou down :

    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 et rmmod ont besoin du chemin pour un module, tandis que modprobe 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