Why you need to drop ifconfig for ip

Start using the modern method for configuring a Linux network interface.
73 readers like this.
Tips and gears turning


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  netmask 
       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  netmask  broadcast 
       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 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 brd 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

The command is similar for ip:

$ ip address add dev eth0

Subcommands in ip can be shortened, so this command is equally valid:

$ ip addr add dev eth0

You can make it even shorter:

$ ip a add 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

The ip command syntax is:

$ ip a del 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!

What to read next
User profile image.
I am a system administrator in Amar Ujala Ltd.. Working in mix environment windows & open source. we use many open source tools.


ip it's a great tool, but the output of ip a it's still awful compared with the ifconfig output.

P.D.: there is typo after the title comparing ip and ifconfig, you wrote ipconfic

Ugh. Yet another "wonderful" (in a perjorative sense) "new" tool - like systemd, that creates yet another thing to remember. Systemd is why I pretty much stopped growing the use of Linux in my household. A much better approach would be to modify ifconfig to use the newer API if available, and perhaps extend it to handle name spaces, without creating yet another <insert expletive of your choice> new command or tool.

Creative Commons LicenseThis work is licensed under a Creative Commons Attribution-Share Alike 4.0 International License.