For a long time, the ifconfig
command was the default method for configuring a network interface. It served Linux users well, but networking is complex, and the commands to configure it must be robust. The ip
command is the new default networking command for modern systems, and in this article, I'll show you how to use it.
The ip
command is functionally organized on two layers of the OSI networking stack: Layer 2 (data link layer) and Layer 3 (network or IP layer). It does all the work in the old net-tools
package.
Installing ip
The ip
command is included in the iproute2util
package. It's probably already included in your Linux distribution. If it's not, you can install it from your distro's software repository.
Comparing ipconfig and ip usage
The ip
and ipconfic
commands can be used to configure a network interface, but they do things differently. I'll compare how to do common tasks with the old (ipconfig
) and new (ip
) commands.
View network interface and IP address
If you want to see the IP address of a host or view network interface information, the old ifconfig
command, with no arguments, provides a good summary:
$ ifconfig
eth0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
ether bc:ee:7b:5e:7d:d8 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 41 bytes 5551 (5.4 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 41 bytes 5551 (5.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.1.1.6 netmask 255.255.255.224 broadcast 10.1.1.31
inet6 fdb4:f58e:49f:4900:d46d:146b:b16:7212 prefixlen 64 scopeid 0x0<global>
inet6 fe80::8eb3:4bc0:7cbb:59e8 prefixlen 64 scopeid 0x20<link>
ether 08:71:90:81:1e:b5 txqueuelen 1000 (Ethernet)
RX packets 569459 bytes 779147444 (743.0 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 302882 bytes 38131213 (36.3 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
The new ip
command provides similar results, but the command is ip address show
, or just ip a
for short:
$ ip 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: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
link/ether bc:ee:7b:5e:7d:d8 brd ff:ff:ff:ff:ff:ff
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 08:71:90:81:1e:b5 brd ff:ff:ff:ff:ff:ff
inet 10.1.1.6/27 brd 10.1.1.31 scope global dynamic wlan0
valid_lft 83490sec preferred_lft 83490sec
inet6 fdb4:f58e:49f:4900:d46d:146b:b16:7212/64 scope global noprefixroute dynamic
valid_lft 6909sec preferred_lft 3309sec
inet6 fe80::8eb3:4bc0:7cbb:59e8/64 scope link
valid_lft forever preferred_lft forever
Add IP address
To add an IP address to an interface with ifconfig
, the command is:
$ ifconfig eth0 add 192.9.203.21
The command is similar for ip
:
$ ip address add 192.9.203.21 dev eth0
Subcommands in ip
can be shortened, so this command is equally valid:
$ ip addr add 192.9.203.21 dev eth0
You can make it even shorter:
$ ip a add 192.9.203.21 dev eth0
Remove an IP address
The inverse of adding an IP address is to remove one.
With ifconfig
, the syntax is:
$ ifconfig eth0 del 192.9.203.21
The ip
command syntax is:
$ ip a del 192.9.203.21 dev eth0
Enable or disable multicast
Enabling (or disabling) multicast on an interface with ifconfig
happens with the multicast
argument:
# ifconfig eth0 multicast
With ip
, use the set
subcommand with the device (dev
) and a Boolean or toggle multicast
option:
# ip link set dev eth0 multicast on
Enable or disable a network
Every sysadmin is familiar with the old "turn it off and then on again" trick to fix a problem. In terms of networking interfaces, that translates to bringing a network up or down.
The ifconfig
command does this with the up
or down
keywords:
# ifconfig eth0 up
Or you could use a dedicated command:
# ifup eth0
The ip
command uses the set
subcommand to set the interface to an up
or down
state:
# ip link set eth0 up
Enable or disable the Address Resolution Protocol (ARP)
With ifconfig
, you enable ARP by declaring it:
# ifconfig eth0 arp
With ip
, you set the arp
property as on
or off
:
# ip link set dev eth0 arp on
Pros and cons of ip and ipconfig
The ip
command is more versatile and technically more efficient than ifconfig
because it uses Netlink
sockets rather than ioctl
system calls.
The ip
command may appear more verbose and more complex than ifconfig
, but that's one reason it's more versatile. Once you start using it, you'll get a feel for its internal logic (for instance, using set
instead of a seemingly arbitrary mix of declarations or settings).
Ultimately, ifconfig
is outdated (for instance, it lacks full support for network namespaces), and ip
is designed for the modern network. Try it out, learn it, use it. You'll be glad you did!
3 Comments