I want my wired and wireless networks to share a single 192.168.1.x
address space (instead of separate 192.168.0.x
and 192.168.1.x
addresses).
In order to do that, we need to set up a bridge to merge disparate networks into a single space.
Part 1: The Basic Configuration
ADMtek NC100 (uses tulip driver)
Ralink RT61 PCI (uses rt61pci driver)
hostapd
linux 4.1.15-gentoo-r1
net-misc/bridge-utils 1.5
net-wireless/iw 3.17
Part 2: Making It Work
I started out creating a basic bridge, using the Gentoo Wiki as a guide:
cd /etc/init.d ln -s net.lo net.br0 /etc/init.d/net.br0 start
There’s no need to change how hostapd starts; it still talks to wlan0
(not br0
).
# /etc/conf.d/net modules_wlan0="!iwconfig !wpa_supplicant" config_wlan0="null" config_eth0="null" config_br0="192.168.1.1/24" brctl_br0="setfd 0 sethello 10 stp off" bridge_br0="eth0 wlan0"
The Problem
The above config is naive and doesn’t work right. I got this error:
Can't add wlan0 to bridge br0: Operation not supported
Huh. There’s nothing indicative in dmesg
about the error, the last entry shows the bridge being created on the wired card and then being taken down. Just to be sure, I created a bridge with just eth0
and it worked:
$ brctl show bridge name bridge id STP enabled interfaces br0 8000.00045a42a698 no eth0
After casting about a bit, I found a serverfault.com page that pointed to this fix:
$ iw dev wlan0 set 4addr on $ brctl addif br0 wlan0
That works, but that won’t do me much good as a long-term solution. I would need to pay a visit to the basement after every planned reboot and unplanned power outage, or else nobody can get onto the network.
( More about the 4addr option here. )
You can’t just add the option to modules_wlan0
, it doesn’t work that way. A quick visit back to the wiki suggested the solution, though, which is to define a preup
function where we can execute arbitrary commands.
The Working Config
These statements are in addition to the WAN interface config:
# /etc/conf.d/net modules_wlan0="!iwconfig !wpa_supplicant" config_wlan0="null" config_eth0="null" config_br0="192.168.1.1/24" brctl_br0="setfd 0 sethello 10 stp off" bridge_br0="eth0 wlan0" preup() { # br0 uses wlan0, and wlan0 needs to set the # 4addr option before being used on a bridge if echo "${IFACE}" | grep -q 'br0' ; then /usr/sbin/iw dev wlan0 set 4addr on fi return 0 }
Then do all the accounting to clean up:
rc-update add net.br0 default rc-update del net.eth0 default rc-update del net.wlan0 default
I also had to update my iptables config to refer to br0
instead of eth0
and wlan0
.
Finally, a reboot to test that everything starts properly.