What was the first Linux networking command that you learned? If I were a betting man, I would wager that many of you (like myself) learned how to look at your IP address and ethernet configurations. I would also wager that an overwhelming majority of Linux users first learned to do so via the ifconfig
command.
Interface Configuration, a.k.a. ifconfig
, has to be one of the most used Linux commands of all time, and it's pretty plain to see why. It's easy to remember (unless you are coming from a Windows environment), and it displays most, if not all, of the necessary networking information for a huge number of use cases.
On the other hand, we have the ip
command suite. This command-line tools package is the new kid on the block, relatively speaking, and has been chosen as the way forward by the bleeding edge of Linux users. With added functionality and a steadily growing user base, the ip
command is a serious contender for your muscle memory or aliases.
So let's take a look at these two commands to see what is on the ip
command suite offers.
The sure thing
You know your favorite ball cap? The one that has the sweat stains inside the headliner, but throwing it on just feels right? That's ifconfig
. It's safe, it's familiar, and you feel comfortable using it. The ifconfig
command still has a lot to offer its users. Whether its displaying network settings, configuring an IP address or netmask, creating aliases for interfaces, or setting MAC address, ifconfig
can handle it. Let's take a look at how to use ifconfig
to accomplish some more common tasks you may find yourself working on completing.
Displaying current network settings
This is the most basic and overused form of the ifconfig
command. Chances are, you are running this to get information about a particular interface, and while this works, it will probably over-deliver. Let's look at the syntax and output and see where we could improve our I/O.
[tcarrigan@rhel ~]$ ifconfig
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.3.16 netmask 255.255.255.0 broadcast 10.0.2.255
inet6 fe80::7678:fd9:450c:13c1 prefixlen 64 scopeid 0x20<link>
ether 08:00:27:30:52:a7 txqueuelen 1000 (Ethernet)
RX packets 20 bytes 2424 (2.3 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 61 bytes 6699 (6.5 KiB)
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 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
virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:b7:7b:c7 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
As you can see, there is a lot of information to sift through here. ifconfig
, devoid of any arguments or options, will list all active interfaces with detail. So how can we narrow it down to exactly what we want? Many times you just want to look at a specific interface.
Display entries for specific interface
To view details for a specific interface, use the standard ifconfig
command followed by the interface name. For example:
[tcarrigan@rhel ~]$ ifconfig enp0s3
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.3.16 netmask 255.255.255.0 broadcast 10.0.2.255
inet6 fe80::7678:fd9:450c:13c1 prefixlen 64 scopeid 0x20<link>
ether 08:00:27:30:52:a7 txqueuelen 1000 (Ethernet)
RX packets 34234 bytes 46491161 (44.3 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3779 bytes 333350 (325.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Enabling and disabling an interface
With the ifconfig
command, you can do far more than just view configurations. Let's take a look at how to enable and disable an interface.
To enable an interface, you have two options for syntax:
[root@rhel ~]# ifconfig enp0s3 up
or
[root@rhel ~]# ifup enp0s3
The same goes for disabling an interface. Only instead of up
we use down
, as seen here:
[root@rhel ~]# ifconfig enp0s3 down
or
[root@rhel ~]# ifdown enp0s3
In this line of work, it really doesn't get much easier than that.
Assigning an IP address to an interface
To assign an IP address to a given interface, you use the following syntax:
[root@rhel ~]# ifconfig [interface] [IP]
For example:
[root@rhel ~]# ifconfig eth0 192.168.0.1
Assigning a netmask to an interface
To assign a netmask to an interface, you use the following:
[root@rhel ~]# ifconfig [interface] netmask [netmask]
It should look like this:
[root@rhel ~]# ifconfig eth0 netmask 255.255.255.254
Set MTU for an interface
The MTU or Maximum Transmission Unit is a very important figure to pay attention to during troubleshooting. This value allows you to limit the size of packets sent over the specific interface. I once worked a data replication failure for over three weeks before figuring out that the MTU was too large for the replication interface. Fun times *insert eye roll here*. I say this to make a point. Not every network interface can support jumbo packets. Be sure that the set MTU is supported for your interface. To set the MTU:
[root@rhel ~]# ifconfig eth0 mtu 1080
There is a lot more that ifconfig
can do; however, in the interest of brevity, I am going to move along. If you want more information on ifconfig
, check out the man
page or your friendly neighborhood search engine.
[ Getting started with networking? Check out the Linux networking cheat sheet. ]
What's trending?
The ip
command is the future of network config commands. ifconfig
has been officially deprecated for the ip
suite, so while many of us are still using the old ways, it is time to put those habits to rest and move on with the world.
Displaying entries
Since there is no "without options" variant of the ip
command, let's look at how to display IP addresses associated with interfaces.
[root@rhel ~]# ip addr show
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: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 08:00:27:30:52:a7 brd ff:ff:ff:ff:ff:ff
inet 10.0.3.16/24 brd 10.0.2.255 scope global dynamic noprefixroute enp0s3
valid_lft 83478sec preferred_lft 83478sec
inet6 fe80::7678:fd9:450c:13c1/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether 52:54:00:b7:7b:c7 brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel master virbr0 state DOWN group default qlen 1000
link/ether 52:54:00:b7:7b:c7 brd ff:ff:ff:ff:ff:ff
You will notice that this presents much of the same information as the base ifconfig
command.
Adding a new address
To add an IP address to an existing interface, use the following:
[root@rhel ~]# ip addr add 192.168.0.1 dev eth0
The dev
flag is used before designating which device or interface that the IP address is being set on.
Removing an address
To remove an IP address from an interface, use the following:
[root@rhel ~]# ip addr del 192.168.0.1 dev eth0
Enable and disable an interface
Much like the ifconfig
command, you can also cycle an interface on/off using the ip
command. To enable an interface, use the following:
[root@rhel ~]# ip link set eth0 up
to disable:
[root@rhel ~]# ip link set eth0 down
View the routing table
One of the best things you can use while troubleshooting is to view routing information. To do this, use the following:
[root@rhel ~]# ip route show
default via 10.0.3.2 dev enp0s3 proto dhcp metric 100
10.0.3.0/24 dev enp0s3 proto kernel scope link src 10.0.3.16 metric 100
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1 linkdown
You can also add and remove static routes from the routing table.
To add a static route, we use the following:
[root@rhel ~]# ip route add 10.5.5.10/22 via 192.168.0.1 dev eth0
To remove a static route, we use the following:
[root@rhel ~]# ip route del 10.5.5.10/22
Note that these are not persistent, and you must take additional steps to ensure that the routes created actually survive a reboot. To create the persistent route, we need to create an entry in /etc/sysconfig/network-scripts/route-eth0
(substitute eth0 with whatever interface the route is created on). Something like this:
[root@rhel ~]# vi /etc/sysconfig/network-scripts/route-eth0
10.5.5.10/22 via 192.168.0.1 dev eth0
Over before it began
This article is not so much a fight between the two as it is an exploration of old and new. The decision has already been made, as ifconfig
is being deprecated. The ip
command suite is the way forward. However, just because something is new doesn't mean it is superior for every purpose. At the same time, however, "we've always done it this way" is not an excuse to stop improving. What are your thoughts? My honest takeaway is that ifconfig
meets most of my needs (at this point in my career). However, the ip
command is a more powerful tool and will be a staple for networking experts for years to come.
[ Want more for your network? Download a free ebook on network automation with Ansible. ]
About the author
Tyler is the Sr. Community Manager at Enable Sysadmin, a submarine veteran, and an all-round tech enthusiast! He was first introduced to Red Hat in 2012 by way of a Red Hat Enterprise Linux-based combat system inside the USS Georgia Missile Control Center. Now that he has surfaced, he lives with his wife and son near Raleigh, where he worked as a data storage engineer before finding his way to the Red Hat team. He has written numerous technical documents, from military procedures to knowledgebase articles and even some training curricula. In his free time, he blends a passion for hiking, climbing, and bushcraft with video games and computer building. He is loves to read and enjoy a scotch or bourbon. Find him on Twitter or on LinkedIn.
Browse by channel
Automation
The latest on IT automation for tech, teams, and environments
Artificial intelligence
Updates on the platforms that free customers to run AI workloads anywhere
Open hybrid cloud
Explore how we build a more flexible future with hybrid cloud
Security
The latest on how we reduce risks across environments and technologies
Edge computing
Updates on the platforms that simplify operations at the edge
Infrastructure
The latest on the world’s leading enterprise Linux platform
Applications
Inside our solutions to the toughest application challenges
Original shows
Entertaining stories from the makers and leaders in enterprise tech
Products
- Red Hat Enterprise Linux
- Red Hat OpenShift
- Red Hat Ansible Automation Platform
- Cloud services
- See all products
Tools
- Training and certification
- My account
- Customer support
- Developer resources
- Find a partner
- Red Hat Ecosystem Catalog
- Red Hat value calculator
- Documentation
Try, buy, & sell
Communicate
About Red Hat
We’re the world’s leading provider of enterprise open source solutions—including Linux, cloud, container, and Kubernetes. We deliver hardened solutions that make it easier for enterprises to work across platforms and environments, from the core datacenter to the network edge.
Select a language
Red Hat legal and privacy links
- About Red Hat
- Jobs
- Events
- Locations
- Contact Red Hat
- Red Hat Blog
- Diversity, equity, and inclusion
- Cool Stuff Store
- Red Hat Summit