HOWTO: Configuring Network Interfaces on the Linux Command Line

FROM: NETWORKSHOP, OTHERNET
SKILL LEVEL: BEGINNER

Introduction

Knowing how to manually configure a network interface, like a wired or wireless network adapter, on Linux is vital if there is no automatic configuration service (like DHCP) offered on the network to which you’re attached. It is of further use knowing how to set up networking hardware on the command line, especially when you are logged into a machine somewhere else.

An example may be you are connected to a machine over a wireless interface and need to configure the wired card so that it can connect to the Internet. At these times a Graphical User Interface is of no use, especially on small embedded computers without connected displays and keyboards.

List available network interfaces

ifconfig (or interface config) is a tool for manipulating network devices (Network Interface Controller, or NIC) on UNIX systems.

The following command will list all available devices to be configured on your system.

sudo ifconfig -a

The -a switch stands for list all, regardless of whether they’re configured or not.

When run on the system on which I’m writing this document, the following output is given:

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:16436  Metric:1
        RX packets:154805 errors:0 dropped:0 overruns:0 frame:0
        TX packets:154805 errors:0 dropped:0 overruns:0 carrier:0
        collisions:0 txqueuelen:0 
        RX bytes:73061530 (69.6 MiB)  TX bytes:73061530 (69.6 MiB)

eth0    Link encap:Ethernet  HWaddr 00:24:a5:9c:63:b9  
        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)

wlan0   Link encap:Ethernet  HWaddr e8:94:f6:1e:c4:df  
        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)

Here we have an Ethernet device eth0 and a wireless wlan0 device. We also have lo or loopback device, used by software services and their clients running on the local machine. It will not be covered here.

Devices are generally numbered sequentially, so if we were we to have two Ethernet devices, one would probably be eth0 and the other eth1. If we were to have three wireless devices they may be named wlan0, wlan1 and *** wlan2***.

Network devices are referred to as NICs or Network Interface Controller.

Configuring network interfaces

Join a network with NIC eth0

Let’s assume I have a network switch to which other devices are connected by cable. The network is a 10.0.0.* network. There is no automatic network configuration service such as DHCP running on this network.

1. CHOOSE AN IP ADDRESS

How we choose an IP address depends on the situation at hand but it cannot be an address used by another device (network host). Let’s assume 10.0.0.11 is free for me to use.

2. SET THE IP ADDRESS

I can assign the IP address 10.0.0.11 like so:

julian@ce:~$ sudo ifconfig eth0 10.0.0.11

Note that I have to use sudo as I am altering the state of hardware, a low level operation. Now I can type the following to check the IP was set:

julian@ce:~$ ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 00:24:a5:9c:63:b9 
          inet addr:10.0.0.11  Bcast:10.255.255.255  Mask:255.0.0.0
          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)

I can see inet addr:10.0.0.11 in the output. So far the IP has been set but I can’t yet be sure I’m connected to other devices.

3. CHECK CABLES ARE CONNECTED

Ensure the Ethernet cable has active link lights (usually green) when the device is connected to the switch or other network hardware.

4. TEST WITH A PING

Let’s assume I know a laptop on the network already has the address 10.0.0.17. I can use the command ping to send it a tiny packet of data. If it is returned to me, I know I am not only on the network but able to converse with that device:

julian@ce:~$ ping 10.0.0.17
PING 10.10.0.17 (10.0.0.17) 56(84) bytes of data.
64 bytes from 10.0.0.17: icmp_req=1 ttl=64 time=15.3 ms
64 bytes from 10.0.0.17: icmp_req=1 ttl=64 time=14.7 ms
64 bytes from 10.0.0.17: icmp_req=1 ttl=64 time=14.8 ms
64 bytes from 10.0.0.17: icmp_req=1 ttl=64 time=15.1 ms
64 bytes from 10.0.0.17: icmp_req=1 ttl=64 time=14.9 ms

Seeing that the data is returning (“64 bytes from 10.0.0.17…”), I can hit CTRL-C to close ping and start interacting with that device over the network.

If I was so see the following in the output, I would know I can’t reach that particular network host:

From 10.0.0.17 icmp_seq=1 Destination Host Unreachable

I would then try to ping other network hosts. If I can reach others but not this device, then I’d know the issue is likely with the device at 10.0.0.17, rather than mine.

Request an IP to be automatically assigned to NIC eth0

Let’s now assume I’m later in a different location and would like to use a local network there.

On this network there is a DHCP service (Dynamic Host Control Protocol) that can automatically assign me an IP, assuming there’s a free slot and/or my device isn’t blocked. This is almost always the case in universities, offices, studios as it’s much more convenient than having to assign an IP oneself.

I don’t need to know anything about the network, which IP range it is operating on or other details.

1. ASK A DHCP SERVICE ON THE NETWORK FOR AN IP

I can ask the DHCP server, usually running on a network router, to grant me an IP on the eth0 ethernet NIC. I use the -v switch for verbose, so that I can see the output of the process.

julian@ce:~$ sudo dhclient -v eth0
Internet Systems Consortium DHCP Client 4.2.2
Copyright 2004-2011 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Listening on LPF/eth0/00:24:a5:9c:63:b9  
Sending on   LPF/eth0/00:24:a5:9c:63:b9  
Sending on   Socket/fallback
DHCPREQUEST on eth0 to 255.255.255.255 port 67
DHCPACK from 192.168.100.1
bound to 192.168.100.152 -- renewal in 37134 seconds.

Reading the above output I can see that the DHCP service at 192.168.100.1 has granted me the address 192.168.100.152. It will be renewed in 37134 seconds.

2. TEST WITH A PING

Just as before, we need to test that we truly can read and write to other NICs on the network. If you believe the network to which you’ve connected should provide you with access to the Internet, you might try pinging a remote machine:

julian@ce:~$ ping criticalengineering.org
PING criticalengineering.org (91.64.73.247) 56(84) bytes of data.
64 bytes from 91-64-73-247-dynip.superkabel.de (91.64.73.247): icmp_req=1 ttl=64 time=10.35 ms
64 bytes from 91-64-73-247-dynip.superkabel.de (91.64.73.247): icmp_req=2 ttl=64 time=10.33 ms
64 bytes from 91-64-73-247-dynip.superkabel.de (91.64.73.247): icmp_req=3 ttl=64 time=10.31 ms
64 bytes from 91-64-73-247-dynip.superkabel.de (91.64.73.247): icmp_req=4 ttl=64 time=10.34 ms

Disconnect NIC eth0 from a network

You can disconnect from a network at any moment by ‘taking down’ the NIC. It’s as effective as pulling out the network cable:

julian@ce:~$ sudo ifconfig eth0 down

Connect to a wireless network on NIC wlan0

Wireless NICs like wlan0 have two components: the radio part that connects (associates) to a wireless network on a specific channel and the networking part that operates on it, using just the same technology as a wired NIC like eth0. For this reason we have to use two different tools to configure wireless NICs, iwconfig (wireless configuration) and ifconfig (network configuation).

Here I can look at the wireless state of my NIC wlan0 using iwconfig:

julian@ce:~$ iwconfig wlan0
wlan0    IEEE 802.11bgn  ESSID:off/any  
      Mode:Managed  Access Point: Not-Associated   Tx-Power=0 dBm   
      Retry  long limit:7   RTS thr:off   Fragment thr:off
      Power Management:off

As the output shows, the NIC is not currently associated to any network.

Here I will associate with a network (with the ESSID) CE. This is no different from selecting a wireless network on a device like a smartphone:

1. BRING THE NIC UP

Unlike a wired NIC like eth0, which is activated the moment it gets an IP, I have to bring the NIC up before I can use it.

julian@ce:~$ sudo ifconfig wlan0 up

2 . SET THE ESSID. ASK TO ASSOCIATE

 julian@ce:~$ sudo iwconfig wlan0 essid CE

Looking at iwconfig output now for wlan0, we can see it has changed. The ESSID option shows “CE”. We can also see the quality of the link (almost perfect at 68/70):

wlan0    IEEE 802.11abgn  ESSID:"CE"  
         Mode:Managed  Frequency:2.472 GHz  Access Point: 00:90:4C:D0:0F:A3   
         Bit Rate=54 Mb/s   Tx-Power=15 dBm   
         Retry  long limit:7   RTS thr:off   Fragment thr:off
         Power Management:off
         Link Quality=68/70  Signal level=-42 dBm  
         Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
         Tx excessive retries:0  Invalid misc:61   Missed beacon:0

3. JOIN THE NETWORK

Just because I’m associated doesn’t mean that I’m on the network. I still need to either set or ask for an IP.

Interestingly enough I can manually configure any IP I like and use any wireless access point (hotspot) I like to build a network. Generally with wireless routers however the goal is to connect to the Internet to which the wireless router itself has access. Being a router, which is in effect a little computer, it probably runs a DHCP service.

We can try and ask for an IP just as we did above with eth0:

julian@ce:~$ sudo dhclient wlan0

Scanning for wireless networks

First, bring up your wireless device, if not already:

julian@ce:~$ sudo ifconfig wlan0 up

Now scan, using the wireless tool iwlist:

julian@ce:~$ sudo iwilist wlan0 scan

Look for ESSID in the output.