Linux IfConfig Tutorial
The network configuration is one of the first topics a system administrator gets involved with. For Linux, the command to configure this is ifconfig
(contraction of interface and configuration), which allows to make almost any configuration in a network, as we will see in this tutorial.
Basic knowledge about networking (what IP addresses are, their format, subnetting, etc.) is assumed in order to follow this tutorial.
For this tutorial, Linux Mint 17.3 has been used.
Table Of Contents
1. Show network interface information
The most simple way to use ifconfig
is typing the command in the terminal, with no options or arguments:
ifconfig
If you try it, you will receive and output similar to the following:
eth0 Link encap:Ethernet HWaddr XX:XX:XX:XX:XX:XX UP BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:3124 errors:0 dropped:0 overruns:0 frame:0 TX packets:3124 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:376288 (376.2 KB) TX bytes:376288 (376.2 KB) wlan0 Link encap:Ethernet HWaddr XX:XX:XX:XX:XX:XX inet addr:192.168.1.154 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::6627:37ff:feb3:592d/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:72347 errors:0 dropped:0 overruns:0 frame:0 TX packets:55487 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:82986485 (82.9 MB) TX bytes:7833391 (7.8 MB)
We can see three main information segments. Each of this segment is the information about each network interface. In this case, there are three: eth0
, lo
, and wlan0
.
You will probably be familiar to ethernet and WLAN interfaces, which are are for wired and unwired connections, respectively. But the loopback interface, lo
, is quite special. The loopback interface is a virtual interface (does not rely in hardware) that the machines use to communicate with themselves. This interface has two main purposes:
- Troubleshooting.
- Running a local server.
Now that we have identified the devices, let’s understand their properties and configurations:
HWAddr
: hardware address, commonly known as MAC address. An unique identifier assigned to each network interface.inet addr
: the IP address of the interface.Bcast
: the broadcast address of the network.Mask
: the mask of the IP address. That is, the mask that indicates which part of the IP address corresponds to the network, and which to the hosts.inet6 addr
: the IPv6 address of the interface.UP
: the interface has been loaded.BROADCAST
: the interface supports broadcasting, i.e., sending/receiving frames from/to every host in the network, in a single transmission, by broadcast address.RUNNING
: the interface is ready to transmit and receive data.MULTICAST
: he interface supports multicasting, i.e., sending/receiving from/to interested hosts in the network. Note the difference with broadcasting.MTU
: he Maximum Transmission Unit. We will see this later in the tutorial.Metric
: the priority of the device. The lower number, the greater priority.RX packets
,TX packets
: received and transmitted packages, respectively.RX bytes
,TX bytes
: received and transmitted bytes, respectively.
For seeing the information about a specific interface, we can specify it:
ifconfig eth0
2. Enabling and disabling interfaces
We can enable and disable the interfaces pretty easily. The syntax is the following:
ifconfig [interface] [up|down]
So, the following commands would disable the eth0
interface, for then enabling it again:
sudo ifconfig eth0 down sudo ifconfig eth0 up
Note that for this operations, we need superuser privileges.
3. Changing IP addresses
3.1. IPv4
The assigned IP (and netmask and broadcast) can be changed executing ifconfig
in the following way:
ifconfig [interface] [ip address] netmask [netmask] broadcast [broadcast ip]
For example, to change wlan0
interface’s IP to, for instance, 192.168.1.30
address:
sudo ifconfig wlan0 192.168.1.30
Now, if we check the configuration, we would see:
wlan0 Link encap:Ethernet HWaddr 64:27:37:b3:59:2d inet addr:192.168.1.30 Bcast:192.168.1.255 Mask:255.255.255.0
3.1.1 Considerations
Before changing this configurations, we must ensure several things:
- The new IP has to be inside the network. In this case, we knew that the IP was 192.168.1.154 and the mask 255.255.255.0, so, the IP must be in the 192.168.1.2 – 192.168.1.254 range, inclusive. We discard the first and the last since they are the network and the broadcast addresses.
- The new IP has to be free. If we assign an IP that is already assigned to another host, we won’t have connectivity.
3.2. IPv6
In the previous section we have seen how to configure the IP addresses. As you probably already know, that corresponded to the fourth version of IP (IPv4).
Progressively, the IP addresses will be migrated from IPv4 to IPv6 (even if they will coexist). So, a system administration must also master the IPv6 protocol.
Returning to the ifconfig
output, for both loopback and WLAN interfaces (the ethernet interface, in this case, is disabled):
lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host wlan0 Link encap:Ethernet HWaddr 64:27:37:b3:59:2d inet addr:192.168.1.154 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::6627:37ff:feb3:592d/64 Scope:Link
We can notice that our interface have already assigned an IPv6 address (lines 3, 9). The first, the one of the loopback interface is, as you probably has guessed, the equivalent of 127.0.0.1
for IPv6.
For pinging IPv6 addresses, we have to use ping6 command, instead of ping:
ping6 ::1
And the packets should be correctly transmitted:
PING ::1(::1) 56 data bytes 64 bytes from ::1: icmp_seq=1 ttl=64 time=0.028 ms
We can add IPv6 addresses to interfaces:
sudo ifconfig wlan0 inet6 add fe80::6627:37ff:feb3:592e/64
As same as modifying, but adding the inet6
(for IPv6) and add
options.
If we check now the interface…
wlan0 Link encap:Ethernet HWaddr 64:27:37:b3:59:2d inet addr:192.168.1.155 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::6627:37ff:feb3:592e/64 Scope:Link inet6 addr: fe80::6627:37ff:feb3:592d/64 Scope:Link
We can see that our WLAN interface has now two IPv6 addresses.
To delete a IPv6 address, we have to do the same, but with del
option instead of add
:
sudo ifconfig wlan0 inet6 del fe80::6627:37ff:feb3:592e/64
3.3. Change from static IP to DHCP
This is not exactly an ifconfig
function. But is something we would have to do if we entered an incorrect IP, and we want to forget it, and delegate the IP assignment to the DHCP protocol.
For that, we just have to type:
sudo dhclient <interface>
4. Using virtual IP addresses
Also called aliases, these IP addresses are additional addresses to the interfaces. So, an interface could listen to several IP addresses.
If the IP address of the wlan0
interface was 192.168.1.154
, we could add, for example, the 192.168.1.155
address:
sudo ifconfig wlan0:0 192.168.1.155
Which would generate another output for ifconfig
, just as another interface more:
wlan0:0 Link encap:Ethernet HWaddr XX:XX:XX:XX:XX:XX inet addr:192.168.1.155 Bcast:192.168.1.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Each virtual interface must follow the <interface>:n
format, where n
is any positive number (including 0), and unique to each virtual interface.
For example, if we have running a web server in the machine, now would be accessible from both 192.168.1.154
and 192.168.1.155
addresses. Using virtual IP addresses is specially useful when we want to server several services in the same machine, but for different IP addresses.
To remove a virtual interface, we have to set it down:
sudo ifconfig wlan0:0 down
5. Changing MTU
By default, for ethernet, the maximum transmission unit (i.e., the size in bytes of the largest data unit that can be transmitted), is 1500. But this value can be easily changed:
sudo ifconfig eth0 mtu 2000
5.1. Finding best MTU size
This is not a likely option to change. But there are mechanisms to find the best MTU values.
The problem is that, if the size is too small, the packets are smaller and they are transmitted faster, but this can suppose an overhead due to the acknowledgment and handling of each packet. And, if the size is too large, a router in the packet route may drop the packet.
To find the equilibrium, we can make some tests manually with ping
. We can start making pings with the default value, 1500:
ping -M do -c 1 -s 1472 www.systemcodegeeks.com
The size specified here is 1472, but because the the IP/ICMP header of 28 bytes is not included.
We can increase this value while we success response:
1472 bytes from 104.27.130.144: icmp_seq=1 ttl=56 time=38.0 ms --- systemcodegeeks.com ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms
And, until we get an error message:
ping: local error: Message too long, mtu=1600 --- systemcodegeeks.com ping statistics --- 1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms
The best MTU size would be the larger one that does not return an error, plus 28 (the previous mentioned header size).
6. Changing MAC address
Yes, ifconfig
allows to change the physical address of a network interface.
Well, that’s not exactly true. The physical addresses of devices cannot be changed, but what it can be changed is the address that is loaded into the memory.
This is pretty easy to do with ifconfig
:
sudo ifconfig eth0 down sudo ifconfig eth0 hw ether XX:XX:XX:XX:XX:XX sudo ifconfig eth0 up sudo ifconfig eth0
(Placing a real MAC address where XX:XX:XX:XX:XX:XX
is placed).
We can check that effectively the physical address has been changed:
eth0 Link encap:Ethernet HWaddr XX:XX:XX:XX:XX:XX
Take into account that what we are doing is to change the loaded address into memory, so, this is only temporary: if the device is rebooted, the real physical address will be loaded.
Changing the MAC address can be useful, for example, for privacy when connected to public networks, not to show the real physical address; or to bypass MAC security filters.
7. Promiscuous mode
The promiscuous mode is a mode where a device connected to a network captures all the traffic traveling through that network.
This is not as obvious as it can appear. If you have ever used a packet sniffer such us Wireshark, in a “simple” LAN (multiple devices connected to a router, for instance) you may have successfully sniffed other devices’ packets. But, if you have used it in a switched network (not hubed), you will probably have noticed that is not that easy to sniff packets. This is because the switches forward the frames only to the devices that need that frames, instead of sending broadcasts.
To put an interface (wlan0
, for example) in promiscuous mode, we only have to type:
sudo ifconfig wlan0 promisc
The ifconfig
output will say if an interface is in promiscuous mode:
wlan0 Link encap:Ethernet HWaddr 64:27:37:b3:59:2d inet addr:192.168.1.154 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::6627:37ff:feb3:592d/64 Scope:Link UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1
To put the interface in normal mode, we have to enter:
sudo ifconfig wlan0 -promisc
8. ARP mode
ARP acronym stands for Address Resolution Protocol, a network layer protocol, used for finding physical addresses corresponding to certain IPs, in order to populate ARP tables, where the IPs and MAC addresses are stored in key-value format.
The use of this protocol can cause some trouble, including DDOS attacks or spoofing. So, in some cases may be wanted to disable it.
The mechanism to enable/disable the ARP mode is the same as with promiscuous mode:
sudo ifconfig wlan0 arp # Enables ARP for the wlan0 interface. sudo ifconfig wlan0 -apr # Disables ARP for the wlan0 interface.
9. Broadcast and multicast modes
As same as with ARP mode, we may be interested in disabling broadcast and/or multicast to avoid possible floods.
Again, the mechanism is the same:
sudo ifconfig wlan0 -multicast # Disables multicast for wlan0 interface. sudo ifconfig wlan0 -broadcast # Disables broadcast for wlan0 interface. sudo ifconfig wlan0 multicast # Enables multicast for wlan0 interface. sudo ifconfig wlan0 broadcast # Enables broadcast for wlan0 interface.
10. IP tunneling
The IP tunnel creation is a feature of ifconfig
that must be mentioned.
An IP tunnel is a network communication channel where the data frames are transformed to pass networks without a routing path, or even incompatible protocols. The most common uses of IP tunnels are for creating Virtual Private Networks (along with IPSec procotol), and to connect IPv4 installations with IPv6 ones.
First, we have to create the IP tunnel, which will be like another network interface, with ip
command:
sudo ip tunnel add tun0 mode ipip remote <remote_ip> local <local_ip> dev <device>
Let’s see it carefully:
tun0
is be the name the tunnel will have.ipip
is the tunnel mode. The IPIP kind tunnels are the simplest ones: they can only handle IPv4 multicast frames. The other option is GRE, which is the one used when tunneling routing protocols such us OSPF.- The remote and local IPs would be the two endpoints of the tunnel.
- The device is the interface of the local IP, where the tunnel will be created.
So, for creating a tunnel between X.X.X.X
and Y.Y.Y.Y
IPs, we could do:
sudo ip tunnel add tun0 mode ipip remote X.X.X.X local Y.Y.Y.Y dev wlan0
This will create a tun0
interface. Now, we have to assign an IP address to the interface:
sudo ifconfig tun0 172.0.0.1 netmask 255.255.255.252 pointopoint 172.0.0.2 dev eth0
The pointopoint
option is for enabling the point-to-point mode, i.e., a direct link between two devices.
We can see the tunnel configuration as any other network device, typing ifconfig tun0
:
tun0 Link encap:IPIP Tunnel HWaddr inet addr:172.0.0.1 P-t-P:172.0.0.2 Mask:255.255.255.252 UP POINTOPOINT RUNNING NOARP MTU:1480 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Note that the MTU is set to 1480. Let’s change it to ethernet default value, 1500:
sudo ifconfig tun0 mtu 1500
Finally, we have to bring up the interface:
sudo ifconfig tun0 up
And that’s it. To delete that tunnel, we would just have to type:
sudo ip tunnel del tun0
11. Summary
This tutorial has shown how to use the essential ifconfig
command, from showing the most basic information about the network interfaces and changing IP addresses, to advanced topics such as creating IP tunnels or changing MAC addresses and packets’ maximum sizes.
Who is using ifconfig these days? It has long been deprecated in favor of the ip suite and only maintained for backwards compatibility. It is not even present in CentOS 7 OOTB.