Tuesday, June 28, 2016

CentOS - à la ligne de commande - 03 : interfaces réseau

Dans ce billet, je configure certains aspects de la principale interface réseau de ma machine virtuelle exécutant CentOS 7.

Comme sous Windows, nous pouvons modifier les paramètres réseau avec différentes commandes, par exemple...

ifconfig eth0 10.0.0.1

Il s'agit là d'attribuer l'adresse IP 10.0.0.1 à l'interface Ethernet eth0.

Mais à la différence de Windows, ces modifications ne sont pas permanentes. Après un redémarrage, les paramètres précédents sont rétablis. Si nous voulons que nos modifications "tiennent", nous devons plutôt éditer certains fichiers.

En effet, sous Linux, tout est un fichier.

Dans mon cas, j'ai commencé par le fichier suivant : ifcfg-eno16777736

/etc/sysconfig/network-scripts/ifcfg-eno16777736

De quoi s'agit-il d'abord ?

Depuis CentOS 7 (et RHEL 7), les interfaces réseau se nomment selon le système de "noms d'interfaces réseau prévisible" (Predictable Network Interface Names). Ce système existait déjà sous CentOS 6 mais comme une simple option. C'est désormais la règle ( le cas par défaut).

Quel problème ce mécanisme résout-il ?

Autrefois, les interfaces se voyaient attribuer un nom comme eth0 ou eth1 ("eth" pour ethernet) selon l'ordre dans lequel elles étaient détectées au démarrage. Si le hôte en question ne possédait qu'une seule interface, rien n'était à craindre.

Mais si l'hôte possédait plusieurs interfaces (scénario tout à fait plausible s'agissant d'un serveur), celles-ci pouvaient être détectées dans un ordre différent d'un démarrage à l'autre.

Et alors ?

Telle interface pouvait être tantôt eth0 et tantôt eth1. Cela pourrait désorienter l'administrateur mais aussi rendre inefficaces les règles de pare-feu associées à une interface spécifique.

Mon serveur Linux (machine virtuelle) ne possède qu'une seule interface et, pour simplifier la présentation de cette matière, je vais désactiver le nouveau système de nommage (un peu plus loin dans ce texte).

***

En fait, j'ai d'abord cru que le nom d'interface était choisi de façon aléatoire au moment de l'installation (d'une façon comparable à ce qui se passe sous Windows pour le nom de l'ordinateur) et qu'il s'agissait de donner à l'interface un nom de mon choix.

Voici donc ce que j'ai fait (peut-être inutilement à en juger par ce que je sais maintenant) :

En premier lieu, je navigue jusqu'au répertoire "network-scripts" et j'exécute la commande suivante :

mv ifcfg-eno16777736 eth0

Rappel : voici de nouveau le chemin : /etc/sysconfig/network-scripts/

A ce que j'ai compris, eth0 est le nom habituel de la première interface réseau dans le monde Linux. Cela fera mon affaire pour cette première expérience.

En second lieu, je modifie deux paramètres dans le fichier : NAME et DEVICE


Remarque : j'ai fait les modifications avec l'éditeur de texte vi. L'utilisation de cet éditeur dépasse le cadre de ce billet de blogue.

Par ailleurs, j'ai remarqué que, par défaut, CentOS ne semble pas solliciter une adresse IP au moment de démarrage. Il faut que je déclenche le processus moi-même en saisissant la commande "dhclient". Je ne sais pas si cela tient à une fausse manoeuvre de ma part ou si c'est simplement ainsi.

Quoi qu'il en soit, je crois que cela se corrige en changeant la valeur du paramètre ONBOOT à "yes" (c'est "no" par défaut). C'est d'ailleurs ce que j'ai fait (voir la capture d'écran ci-dessus).

Ces modifications faites, je fais redémarrer la machine en exécutant la commande suivante :

shutdown -r

Les changements ont tenu.

Qui plus est, ils n'ont pas cassé la connectivité réseau. Par example, je peux saisir...

ping 8.8.8.8

Et j'ai bien une réponse.

La machine virtuelle obtient donc désormais son adresse IP au démarrage.


***

Je remarque pourtant que la commande ifconfig affiche toujours l'ancien nom de l'interface :


Remarque : vous pouvez agrandir l'image en cliquant dessus.

Si nous voulons que l'interface elle-même soit nommée selon l'ancien protocole, il faut modifier le fichier nommé "grub" qui se trouve à cet emplacement :

etc/default/grub

Voici le fichier avant toute modification :



C'est la ligne GRUB_CMDLINE_LINUX que nous devons changer en ajoutant les éléments suivants, l'un après l'autre, en laissant bien un espace entre eux :

biosdevname=0 net.ifnames=0

Voici la ligne après modification :



Cela fait, nous devons mettre à jour un autre fichier, grub.cfg, avec la commande suivante :

grub2-mkconfig -o /boot/grub2/grub.cfg

Et voilà ce que cela donne :



Remarque : si notre machine utilise EFI au lieu d'un BIOS traditionnel, ce serait plutôt cette commande : grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg

Je fais redémarrer avec la commande shutdown -r et maintenant, l'interface porte le nom "eth0" :



***

Allons plus loin...

Jusqu'ici, ma machine virtuelle utilise une adresse IP allouée par DHCP. Si elle va tenir un rôle de client (station de travail), cela fera l'affaire.

Par contre, si l'hôte jouera le rôle de serveur, il faut plutôt lui assigner une adresse statique ainsi que des valeurs compatibles pour le masque de réseau, la passerelle par défaut et les serveurs DNS.

Nos accomplissons cela en éditant deux fichiers :
  • etc/sysconfig/network-scripts/ifcfg-eth0
  • etc/sysconfig/network
Remarque : ifcfg-eth0 est le nom de l'interface de ma machine virtuelle après les changements faits plus haut. Bien entendu, le nom de l'interface pourrait être différent.

D'abord, j'ajoute les lignes désignées par un point rouge dans la capture d'écran ci-dessous :


Si je montre le résultat avec "cat ifcfg-eth0", il faut, bien entendu, utiliser vi (ou un autre éditeur de texte) pour effectuer les ajouts.

Remarque ; il va de soi que vous mettrez des valeurs qui conviennent à votre réseau. Celles que j'ai indiquées ci-dessus n'auraient sûrement aucune logique dans un autre environnement. Un mot sur l'adresse du serveur DNS : il s'agit d'un des serveurs d'Open DNS.


Ensuite, j'ajoute les trois lignes suivantes dans le fichier "network" :



En ce qui concerne DNS, la désignation des serveurs se faisait autrefois dans ce fichier directement :

/etc/resolv.conf

Désormais, nous indiquons les adresses IP des serveurs DNS dans le fichier qui correspond à l'interface en question, par exemple "ifcfg-eth0" pour l'interface eth0. Si la valeur du paramètre PEERDNS est égale à "yes", le système ajoute les serveurs DNS au fichier resolv.conf de façon automatique et sous la forme suivante :

nameserver 208.67.220.220

Si la valeur de PEERDNS était égale à "no", nous pourrions éditer le fichier resolv.conf à la main mais a priori je n'en vois pas l'avantage.


***


Voilà qui suffit pour la configuration de base. Et PowerShell dans tout cela (un de mes objectifs pour cette série de billets était de voir quelles commandes Linux pourraient fonctionner dans PowerShell) ?

La composante réseautique se gère de manière tout à fait différente dans Linux et Windows (fichiers pour Linux, le "registre" pour Windows - derrière la GUI) et les commandes ne fonctionnent pas dans l'autre environnement.

Une des rares exceptions, c'est la commande ping. Mais elle non plus ne fonctionne pas de la même façon.

Si je saisis "ping" à la ligne de commande Linux (et appuie sur Retour/Entrée) Linux fera des "pings" tant qu'on ne l'arrête pas en appuyant sur Ctrl+C. Windows (par défaut) arrête après 4 "pings".

Linux se comporte de même si nous saisissons plutôt...

ping -c 4

Quant à traceroute, Windows a une commande comparable mais qui s'épèle tracert.


***


Avant de clore ce billet, je vais mettre an annexe d'autres commandes utiles :
 

ifconfig - montre la configuration des interfaces réseau.

Cet outil ne fait pas partie de l'installation minimale. Nous devons l'ajouter avec la commande :

yum install net-tools


dig - comparable à nslookup. Les deux fonctionnent sous Linux.


host - fait savoir quel nom de hôte correspond à une adresse IP donnée et l'inverse.

Cet outil ne fait pas partie de l'installation minimale non plus. Nous devons l'ajouter avec la commande :

yum install bind-utils


Comment activer ou désactiver une interface sous Linux ? Nous avons deux options :

ifdown eth0
ifup eth0

ou bien...

ifconfig eth0 down
ifconfig eth0 up

Si nous voulons que les deux commandes s'exécutent l'une après l'autre :

ifconfig eth0 down ; ifconfig eth0 up


Comment arrêter / démarrer / désactiver / activer le service "network" (sous RHEL/CentOS 7) ?

systemctl stop network.service

systemctl start network.service

systemctl enable network.service

systemctl disable network.service



No comments:

Post a Comment