A short trip to OpenWRT
Coming from Linux on desktops/servers the OpenWRT environment is very similar. However, to not get confused, you must switch to the mental model in which you’re no longer the consuming endpoint of the network, but it’s enabling infrastructure.
The router
For this exploration of OpenWRT concepts, the Slate (GL-AR750S-Ext) router was used. It came with a preinstalled OpenWRT so that was one less step to do.
It has 2.4GHz and 5Ghz Wifi and 3 physical ethernet ports of which one is referenced as a WAN port. Before going further let’s try to answer some questions up front.
What would you expect to see as the result of
ifconfig
?Which of the interfaces will have an IP address?
Here is the compressed output of ifconfig
:
br-lan (192.168.8.1)
eth0
eth0.1
eth0.2 (192.168.172.121)
wlan0
wlan1
The wlans seem as expected, but how do other interfaces relate to what’s physically on the device?
For explaining that some new concepts need to be introduced.
The Bridge
The bridge is a software mechanism that connects multiple network interfaces together. This connecting/bridging is all happening inside the router, on the SoC (System on Chip) running OpenWRT.
Conceptually it’s like a virtual layer 2 network switch inside the router. You can, again conceptually, plug the network interfaces into the virtual switch making everything connected to those network interfaces part of the same layer 2 network.
The image contains the, still mysterious, eth0.1
. For now, it’s ok to just perceive it as an Ethernet port. It just serves to show that bridging isn’t limited to WiFi. We’ll examine it more in the upcoming paragraph.
brctl
command is used for doing bridge related operations. i.e. listing bridged interfaces:
root@GL-AR750S:~# brctl show
bridge name bridge id STP enabled interfaces
br-lan 7fff.e4956e459d86 no eth0.1
wlan0
wlan1
Perhaps that clears what bridging does, but we started by detecting br-lan
as a network interface itself:
br-lan Link encap:Ethernet HWaddr E4:95:6E:45:9D:86
inet addr:192.168.8.1 Bcast:192.168.8.255 Mask:255.255.255.0
inet6 addr: fd8a:5278:9ed6::1/60 Scope:Global
inet6 addr: fe80::e695:6eff:fe45:9d86/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1134131 errors:0 dropped:0 overruns:0 frame:0
TX packets:1994323 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:114989802 (109.6 MiB) TX bytes:2407107022 (2.2 GiB)
Why is it listed under network interfaces and has an IP address?
Following the analogy an internal switch, the bridge network interface br-lan
is a port not reachable from outside of the router.
Don’t know if this was a purposeful design decision (An interface that causes the least confusion?) or was just dictated by the implementation. In terms of usage, once a network interface (i.e. eth0
or wlan0
) is a part of the bridge (br-lan
) it should not have an IP of its own. The bridge interface takes on the responsibility of having the IP.
In the case of this router, the bridge is assigned 192.168.8.1
and that is the address to reach the admin interface regardless if you’re connected via wifi or cable.
On more info when and why does this makes sense, please check the following references:
- Why does Linux require moving IP from eth interface to bridge interface?
- Why assign MAC and IP addresses on Bridge interface?
The Switch
The bridge was introduced as a virtual switch inside the router. However, there is also the actual physical switch, a chip on the router PCB that can perform switching without the help of the SoC. A little search through dmesg
reveals it:
[ 1.174747] switch0: Atheros AR8337 rev. 2 switch registered on ag71xx-mdio.0
Let’s try and find it in the output we started with:
br-lan (192.168.8.1)
eth0
eth0.1
eth0.2 (192.168.172.121)
wlan0
wlan1
On first sight one could assume the following:
There are 3
eth
interfaces and 3 visible physical ports. The WAN port (eth0.2
) has an IP address, and the other two (eth0
,eth0.1
) represent the other two ports… Solved! … however, this is more incorrect then it isn’t :)
You remember how the bridge/virtual switch
shows itself as the br-lan
interface, well the physical switch doesn’t show itself in the ifconfig
output. It is managed with swconfig
, a dedicated application that communicates directly with the switch driver.
All the eth0's
represent the single Ethernet port of the main SoC of the router. If instead of a router this device was used as a laptop, the eth0
would represent the port to which you would plug in the cable to get wired internet. Again, conceptually, since you can’t really reach it without soldering.
And finally the eth0.1
and eth0.2
. They represent the VLAN’s that eth0
has been configured to belong to.
The physical switch is configured to add VLAN tags depending on the physical ports the connection originates from. This provides a MAC layer separation between ports even though they belong to the same switch.
All those connections reach the SoC through its single Ethernet port (eth0
), but it is additionally configured to express them as dedicated interfaces.
Conclusion
Two concepts one should grasp when looking at the world from the shell of a router:
- bridge
- a virtual switch provided by a software module
- a “switch” which “bridges” interfaces to the same layer 2 network
- registers itself as a network interface (
br-lan
)
- switch
- a separate physical chip on the router PCBa
- differentiates physical ports by grouping them into VLANs
- VLANs visibility provided from the main SoC
- switch managed through a dedicated CLI app
swconfig
This was likely just scratching the surface of what’s going on in OpenWRT. Hopefully, it gives a conceptual overview of how the interfaces are presented and some dry land to start the further exploration from.