Once upon a time we learned about IPv6 routing. Now we’re going to dig into the basics of IPv4 routing with Linux. We’ll start with an overview of hardware and operating systems, and IPv4 addressing basics, and next week we’ll setup and test routing.
LAN Router Hardware
Linux is a real networking operating system, and always has been, with network functionality built-in from the beginning. Building a LAN router is simple compared to building a gateway router that connects your LAN to the Internet. You don’t have to hassle with security or firewall rules, which are still complicated by having to deal with NAT, network address translation, an affliction of IPv4. Why do we not drop IPv4 and migrate to IPv6? The life of the network administrator would be ever so much simpler.
But I digress. Ideally, your Linux router is a small machine with at least two network interfaces. Linux Gizmos has a great roundup of single-board computers here: Catalog of 98 open-spec, hacker friendly SBCs. You could use an old laptop or desktop PC. You could use a compact computer, like the ZaReason Zini or the System76 Meerkat, though these are a little pricey at nearly $600. But they are stout and reliable, and you’re not wasting money on a Windows license.
The Raspberry Pi 3 Model B is great for lower-demand routing. It has a single 10/100 Ethernet port, onboard 2.4GHz 802.11n wireless, and four USB ports, so you can plug in more USB network interfaces. USB 2.0 and the slower onboard network interfaces make the Pi a bit of a network bottleneck, but you can’t beat the price ($35 without storage or power supply). It supports a couple dozen Linux flavors, so chances are you can have your favorite. The Debian-based Raspbian is my personal favorite.
You might as well stuff the smallest version of your favorite Linux on your chosen hardware thingy, because the specialized router operating systems such as OpenWRT, Tomato, DD-WRT, Smoothwall, Pfsense, and so on all have their own non-standard interfaces. In my admirable opinion this is an unnecessary complication that gets in the way rather than helping. Use the standard Linux tools and learn them once.
The Debian net install image is about 300MB and supports multiple architectures, including ARM, i386, amd64, and armhf. Ubuntu’s server net installation image is under 50MB, giving you even more control over what packages you install. Fedora, Mageia, and openSUSE all offer compact net install images. If you need inspiration browse Distrowatch.
What Routers Do
Why do we even need network routers? A router connects different networks. Without routing every network space is isolated, all sad and alone with no one to talk to but the same boring old nodes. Suppose you have a 192.168.1.0/24 and a 192.168.2.0/24 network. Your two networks cannot talk to each other without a router connecting them. These are Class C private networks with 254 usable addresses each. Use ipcalc to get nice visual information about them:
$ ipcalc 192.168.1.0/24Address: 192.168.1.0 11000000.10101000.00000001. 00000000Netmask: 255.255.255.0 = 24 11111111.11111111.11111111. 00000000Wildcard: 0.0.0.255 00000000.00000000.00000000. 11111111=>Network: 192.168.1.0/24 11000000.10101000.00000001. 00000000HostMin: 192.168.1.1 11000000.10101000.00000001. 00000001HostMax: 192.168.1.254 11000000.10101000.00000001. 11111110Broadcast: 192.168.1.255 11000000.10101000.00000001. 11111111Hosts/Net: 254 Class C, Private Internet
I like that ipcalc’s binary output makes a visual representation of how the netmask works. The first three octets are the network address, and the fourth octet is the host address, so when you are assigning host addresses you “mask” out the network portion and use the leftover. Your two networks have different network addresses, and that is why they cannot communicate without a router in between them.
Each octet is 256 bytes, but that does not give you 256 host addresses because the first and last values, 0 and 255, are reserved. 0 is the network identifier, and 255 is the broadcast address, so that leaves 254 host addresses. ipcalc helpfully spells all of this out.
This does not mean that you never have a host address that ends in 0 or 255. Suppose you have a 16-bit prefix:
$ ipcalc 192.168.0.0/16Address: 192.168.0.0 11000000.10101000. 00000000.00000000Netmask: 255.255.0.0 = 16 11111111.11111111. 00000000.00000000Wildcard: 0.0.255.255 00000000.00000000. 11111111.11111111=>Network: 192.168.0.0/16 11000000.10101000. 00000000.00000000HostMin: 192.168.0.1 11000000.10101000. 00000000.00000001HostMax: 192.168.255.254 11000000.10101000. 11111111.11111110Broadcast: 192.168.255.255 11000000.10101000. 11111111.11111111Hosts/Net: 65534 Class C, Private Internet
ipcalc lists your first and last host addresses, 192.168.0.1 and 192.168.255.254. You may have host addresses that end in 0 and 255, for example 192.168.1.0 and 192.168.0.255, because those fall in between the HostMin and HostMax.
The same principles apply regardless of your address blocks, whether they are private or public, and don’t be shy about using ipcalc to help you understand.
CIDR (Classless Inter-Domain Routing) was created to extend IPv4 by providing variable-length subnet masking. CIDR allows finer slicing-and-dicing of your network space. Let ipcalc demonstrate:
$ ipcalc 192.168.1.0/22Address: 192.168.1.0 11000000.10101000.000000 01.00000000Netmask: 255.255.252.0 = 22 11111111.11111111.111111 00.00000000Wildcard: 0.0.3.255 00000000.00000000.000000 11.11111111=>Network: 192.168.0.0/22 11000000.10101000.000000 00.00000000HostMin: 192.168.0.1 11000000.10101000.000000 00.00000001HostMax: 192.168.3.254 11000000.10101000.000000 11.11111110Broadcast: 192.168.3.255 11000000.10101000.000000 11.11111111Hosts/Net: 1022 Class C, Private Internet
The netmask is not limited to whole octets, but rather crosses the boundary between the third and fourth octets, and the subnet portion ranges from 0 to 3, and not from 0 to 255. The number of available hosts is not a multiple of 8 as it is when the netmask is defined by whole octets.
Your homework is to review CIDR and how the IPv4 address space is allocated between public, private, and reserved blocks, as this is essential to understanding routing. Setting up routes is not complicated as long as you have a good knowledge of addressing.
Start with Understanding IP Addressing and CIDR Charts, IPv4 Private Address Space and Filtering, and IANA IPv4 Address Space Registry. Then come back next week to learn how to create and manage routes.
Learn more about Linux through the free “Introduction to Linux” course from The Linux Foundation and edX.