« ifconfig » versus « ip »
La commande ifconfig
commence à disparaßtre comme outil de base sur certaine distributions Linux. Elle est avantageusement remplacée par la commande ip
.
Les notions de base
Si comme moi vous ĂȘtre habituĂ© Ă utiliser ipconfig
, lâutilisation de la commande ip
est un peu déroutante au début.
Cette commande prend en charge plein dâoptions et Ă premiĂšre vue un man ip
laisse plus dubitatif que nâĂ©claire, premiĂšre vue, sur son utilisation.
La grande diffĂ©rence quâil y a sur ces deux commandes et que ip
sâapplique sur un type dâobjet qui vous devez prĂ©ciser. Les informations donnĂ©es par la commande ifconfig
, concerne les adresses de rĂ©seaux de votre machine et lâinterface dâaccĂšs au rĂ©seau. Dans les termes de la commande ip
cela se traduit par lâobjet address
et lâobjet link
.
Une fois que vous avez identifiĂ© le type dâobjet, dâinformation que vous souhaitez, vous devez spĂ©cifier ce que vous voulez faire avec. Encore une fois, la commande ip
vous donne plusieurs options. Vous pouvez généralement ajouter (add
), supprimer (delete
), définir (set
) et afficher (show
) (ou rĂ©pertorier) des objets. Si vous ne spĂ©cifiez pas dâaction, par dĂ©faut, la commande ip
suppose que vous souhaiter un affichage.
Voici quelques exemples prendre cela plus clair.
Comment puis-je voir lâadresse IP de toutes mes interfaces rĂ©seaux ?
Vous pouvez utiliser la commande ip address
pour obtenir les adresses IP ou IPv6 de votre appareil. Si taper tout cela est trop pour vous, il est possible dâutiliser ip addr
voir mĂȘme ip a
.
Donc, pour obtenir les adresses de toutes vos interfaces réseau, tapez quelque chose comme ceci :
ip address show
ou
ip addr show
Vous obtiendrez quelque chose comme ça :
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp3s0: <BROADCAST,MULTICAST> mtu 1500 qdisc mq state DOWN group default qlen 1000
link/ether de:ad:be:ef:co:o1 brd ff:ff:ff:ff:ff:ff
3: wlo1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether de:ad:be:ef:no:op brd ff:ff:ff:ff:ff:ff
inet 192.168.1.111/24 brd 192.168.1.255 scope global dynamic noprefixroute wlo1
valid_lft 84787sec preferred_lft 84787sec
Notez que la commande ip addr
, contrairement Ă ifconfig
, rĂ©pertorie toutes les interfaces rĂ©seau, quâelles soient montĂ©es ou non.
Obtenir des informations de configuration sur vos interfaces réseau
Vous pouvez utiliser la commande ip link
pour obtenir des dĂ©tails sur lâĂ©tat et les caractĂ©ristiques de votre interface rĂ©seau :
ip link show
La commande ip link
ne permet pas de savoir si votre appareil est utilisé par des protocoles de couche supérieure. Il affiche simplement tout périphérique réseau sur lequel un pilote est chargé. Il vous donne également des informations sur tous les cartes, quel que soit leur état.
Obtenir lâadresse IP dâune interface spĂ©cifique ?
Si vous nâavez pas besoin des informations de configuration de toutes les interfaces, mais seulement dâune seule, exĂ©cutez ip addr show
suivi du nom dâune carte spĂ©cifique (alias dev).
Pour obtenir lâadresse du pĂ©riphĂ©rique Ethernet nommĂ© enp3s0
 :
ip addr show dev enp3s0
Comment activer ou désactiver une interface réseau ?
Pour activer une interface réseau, exécutez la commande ip link
avec le nom de lâinterface suivi du mot clĂ© up
. Vous devez ĂȘtre connectĂ© en tant quâutilisateur root ou utiliser sudo
pour exĂ©cuter la commande. Dans tous les cas vous devez lâutiliser avec les privilĂšges du super utilisateur.
sudo ip link set dev wlo1 up
Pour dĂ©sactiver lâinterface, il suffit dâutiliser le mot clĂ© down
Ă la place de up
.
sudo ip link set dev wlo1 down
Comment définir une adresse IP pour une interface ?
Vous pouvez dĂ©finir une adresse IP pour une interface Ă lâaide de la commande ip addr add
. Contrairement Ă ifconfig
, qui met en place ce changement de maniĂšre temporaire, le faire avec la commande ip addr add
engendre une modification de la configuration du systĂšme.
Pour dĂ©finir une adresse IP statique, indiquez le nom de lâinterface et lâadresse IP. Comme vous lâavez peut-ĂȘtre devinĂ©, vous avez besoin des privilĂšges root pour y parvenir. Ainsi, nous attribuons lâadresse IP 192.168.1.14 Ă lâinterface eth1 Ă lâaide de la commande suivante :
sudo ip addr add 192.168.1.14 dev eth1
Notez bien quâici on souhaite ajouter une adresse IP Ă un pĂ©riphĂ©rique particulier (dev). Vous pouvez confirmer que tout sâest dĂ©roulĂ© comme prĂ©vu en utilisant la commande ip addr
show comme ceci :
ip addr show eth1
De maniĂšre assez Ă©vidente, pour retirer cette adresse IP de lâinterface, il suffit dâutiliser le mot clĂ© del
Ă la place de `addâ :
sudo ip addr del 192.168.1.14 dev eth1
Que faire si je souhaite afficher des adresses dâune maniĂšre spĂ©cifique ?
Vous pouvez dĂ©coder et afficher toutes les adresses de protocole en utilisant le schĂ©ma de dĂ©nomination de vos rĂȘves. Vous devez modifier la commande ip
gĂ©nĂ©rique suivante pour spĂ©cifier un type particulier de famille dâadresses :
ip -f [famille] addr
Vous pouvez spĂ©cifier les types de famille dâadresses suivants : inet
(IPv4), inet6
(IPv6), bridge
ou link
.
Ainsi
ip -f inet addr show dev wlo1
donnera
3: wlo1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
inet 192.168.1.111/24 brd 192.168.1.255 scope global dynamic noprefixroute wlo1
valid_lft 86203sec preferred_lft 86203sec
Coloration de lâaffichage de la commande
Pour lire de maniĂšre plus agrĂ©able les rĂ©sultats, je vous encourage Ă utiliser lâoption -c
qui active la coloration.
ip -c addr show
Et pour ne pas avoir Ă taper cela Ă chaque fois, câest une bonne idĂ©e dâajouter la ligne suivant dans votre fichier .bashrc
.
alias ip='ip -c'
La commande ip et lâautomatisation
La sortie de la commande ip
nâest pas facile Ă analyser et il peut sembler difficile de lâutiliser dans des scripts. En rĂ©alitĂ©, il nâen est rien puisque lâoption --json
permet dâobtenir un affichage au format JSON.
ip --json addr
En conjonction avec la commande jq
, il est alors extrĂȘmement facile dâextraire les informations souhaitĂ©es.
ip --json addr | jq .
VOici ce que cela donne :
Affiche la liste des interfaces réseaux disponible au format JSON.
ip --json addr | jq 'map( .ifname )'
On obtient alors un flux JSON du type :
[
"lo",
"enp3s0",
"wlo1"
]
Affiche la liste des interfaces réseaux disponible au format brut.
ip --json addr | jq -r '.[] | .ifname'
lo
enp3s0
wlo1
Ce type de rĂ©sultat peut ĂȘtre lu simplement par une boucle bash
contenant la commande read
.
Lister seulement les interfaces actives :
ip --json addr show |
jq -r '.[] | select( .flags | index( "UP") ).ifname'
Reprenons ce code pour produire un flux JSON en sortie :
ip --json addr show |
jq 'map( select( .flags | index( "UP") ) | { "ifname": .ifname } )'
Cherchons à obtenir les adresses IP par interface réseaux :
ip --json addr show |
jq 'map( select( .flags | index( "UP") ) | { "ifname": .ifname, "addr_info": .addr_info } )'
qu'il est possible d'Ă©crire de simplifier ainsi :
ip --json addr show |
jq 'map( select( .flags | index( "UP") ) | { ifname, addr_info } )'
On obtient quelque chose comme cela :
[
{
"ifname": "lo",
"addr_info": [
{
"family": "inet",
"local": "127.0.0.1",
"prefixlen": 8,
"scope": "host",
"label": "lo",
"valid_life_time": 4294967295,
"preferred_life_time": 4294967295
},
{
"family": "inet6",
"local": "::1",
"prefixlen": 128,
"scope": "host",
"valid_life_time": 4294967295,
"preferred_life_time": 4294967295
}
]
},
{
"ifname": "enp3s0",
"addr_info": []
},
{
"ifname": "wlo1",
"addr_info": [
{
"family": "inet",
"local": "192.168.1.111",
"prefixlen": 24,
"broadcast": "192.168.1.255",
"scope": "global",
"dynamic": true,
"noprefixroute": true,
"label": "wlo1",
"valid_life_time": 84461,
"preferred_life_time": 84461
},
{
"family": "inet6",
"local": "fe80::b8fb:90e3:c17b:d3f8",
"prefixlen": 64,
"scope": "link",
"noprefixroute": true,
"valid_life_time": 4294967295,
"preferred_life_time": 4294967295
}
]
}
]
Si lâon sâintĂ©resse Ă la liste des adresses IP (v4 ou v6), il est probable que la boucle locale ne soit pas pertinente, on peut lâexclure simplement comme suit :
ip --json addr show | jq '
map(
select( .ifname != "lo" ) |
select( .flags | index( "UP") ) |
{ ifname, addr_info }
)'
Mieux encore, pour exclure la boucle locale il est possible de sâappuyer sur le champ flags :
ip --json addr show | jq '
map(
select( .flags | index("LOOPBACK") | not ) |
select( .flags | index( "UP") ) |
{ ifname, addr_info }
)'
Pour obtenir les adresses IPv4 de votre machine, on peut alors écrire :
ip -f inet --json addr show | jq '
map(
select( .flags | index("LOOPBACK") | not ) |
select( .flags | index( "UP") ) |
{ ifname, "ipv4": [ .addr_info[].local ] }
)'
On a alors quelque chose comme suit :
[
{
"ifname": "enp3s0",
"ipv4": [
"192.168.1.43"
]
},
{
"ifname": "wlo1",
"ipv4": [
"192.168.1.143"
]
}
]
De mĂȘme les adresses IPv6 sâobtiennent :
ip -f inet6 --json addr show |
jq 'map( select( .flags | index("LOOPBACK") | not ) | select( .flags | index( "UP") ) | { ifname, "ipv6": [ .addr_info[].local ] } )'
On notera que ces requĂȘtes retournent des tableaux dâIP, car une interface peut ĂȘtre associĂ© Ă plusieurs IP (en IPv4 comme en IPv6).
On pourra préférer une écriture du type :
ip -6 --json addr show |
jq 'map( select( .flags | index("LOOPBACK") | not ) | select( .flags | index( "UP") ) | { "ifname": .ifname, "ips": ( [ .addr_info[].local ] | join(",") ) })'
qui ressemble à ça :
[
{
"ifname": "enp3s0",
"ips": "2a01:e34:ec40:74f0:2d8:61ff:fe05:adfc,fe80::2d8:61ff:fe05:adfc"
},
{
"ifname": "wlo1",
"ips": "2a01:e34:ec40:74f0:c185:ab1c:2a83:24fb,2a01:e34:ec40:74f0:29a1:1d32:8799:51fd,fe80::9346:b2f:515b:cc0c"
}
]
Qu'on peut reformater suivant vos besoins, comme :
ip -6 --json addr show |
jq 'map(
select( .flags | index("LOOPBACK") | not ) |
select( .flags | index( "UP") ) |
{ "ifname": .ifname, "ips": ( [ .addr_info[].local ] | join(",") ) }
)' |
jq -jr '.[] | .ifname, "@", .ips, "\n"'
qui donne :
enp3s0@2a01:e34:ec40:74f0:2d8:61ff:fe05:adfc,fe80::2d8:61ff:fe05:adfc
wlo1@2a01:e34:ec40:74f0:c185:ab1c:2a83:24fb,2a01:e34:ec40:74f0:29a1:1d32:8799:51fd,fe80::9346:b2f:515b:cc0c
Références
- How to: ip, your ifconfig alternative,
- ifconfig vs ip: Whatâs Difference and Comparing Network Configuration,
- Reshaping JSON with jq.
኿