Add network-extender blog post
This commit is contained in:
parent
4332db8dc6
commit
7823c82e60
|
@ -0,0 +1,135 @@
|
|||
+++
|
||||
title = "How to use your Raspberry Pi as a WiFi extender!"
|
||||
date = "2022-08-04"
|
||||
+++
|
||||
|
||||
The place where I program has the worst connection to my router throughout the whole house. Obviously, this isn't ideal for most programming workloads such as looking up documentation and especially for cloning the [crates.io index](https://github.com/rust-lang/crates.io-index).
|
||||
|
||||
Luckily, I had Ethernet wired through the whole house, and I also had a Raspberry Pi and about 30 minutes.
|
||||
|
||||
### Required materials
|
||||
For my setup, I used a [Raspberry Pi 0 W](https://www.raspberrypi.com/products/raspberry-pi-zero-w/) because it's dirt cheap and has WiFi built-in.
|
||||
|
||||
You'll also need a [Ethernet-to-MicroUSB adapter](https://www.amazon.com/Smays-Micro-B-Ethernet-compatible-Raspberry/dp/B01AT4C3KQ/ref=sr_1_3?keywords=ethernet+to+micro+usb+adapter&qid=1659634388&sr=8-3) if you're on one of the Raspberry Pi 0 models (such as 02, 0W, and 0WH), like I am. If you're on a Pi 1-4, you can just use the onboard Ethernet port.
|
||||
|
||||
Just in case, you might also want to keep around a USB keyboard and an HDMI monitor around in case anything goes wrong and you can't access the Pi using SSH.
|
||||
|
||||
### Switch to systemd-networkd
|
||||
|
||||
<p class="warning">This setup <em>will</em> break any DNS servers already running on your Pi, such as Pi-Hole, so make sure you know what you're getting into.</p>
|
||||
|
||||
You need to be root for the whole guide, so either use `sudo -Es` or `sudo su` to switch to the root user.
|
||||
|
||||
First, you have to remove the "classic" networking. You can do this while connected to SSH, so don't worry.
|
||||
|
||||
```bash
|
||||
systemctl daemon-reload
|
||||
systemctl disable --now ifupdown dhcpcd dhcpcd5 isc-dhcp-client isc-dhcp-common rsyslog
|
||||
apt --autoremove purge ifupdown dhcpcd dhcpcd5 isc-dhcp-client isc-dhcp-common rsyslog
|
||||
rm -r /etc/network /etc/dhcp
|
||||
systemctl disable --now avahi-daemon libnss-mdns
|
||||
apt --autoremove purge avahi-daemon
|
||||
```
|
||||
|
||||
Next, install and set up systemd-resolved and systemd-networkd.
|
||||
|
||||
```bash
|
||||
apt install libnss-resolve
|
||||
ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
|
||||
apt-mark hold avahi-daemon dhcpcd dhcpcd5 ifupdown isc-dhcp-client isc-dhcp-common libnss-mdns openresolv raspberrypi-net-mods rsyslog
|
||||
systemctl enable systemd-networkd.service systemd-resolved.service
|
||||
```
|
||||
|
||||
### Set up wpa_supplicant as an access point.
|
||||
|
||||
wpa_supplicant is what Raspbian uses for its WiFi configuration. We need to configure it to broadcast an access point that our devices can later connect to.
|
||||
|
||||
First, create `/etc/wpa_supplicant/wpa_supplicant-wlan0.conf` and add the following contents:
|
||||
|
||||
```conf
|
||||
# /etc/wpa_supplicant/wpa_supplicant-wlan0.conf
|
||||
|
||||
country=US
|
||||
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
|
||||
update_config=1
|
||||
|
||||
network={
|
||||
ssid="..." # Set to your desired network name
|
||||
mode=2
|
||||
frequency=2437 # change this to 5000 if you want a 5GHz access point
|
||||
#key_mgmt=NONE # uncomment this if you don't want a password
|
||||
# delete next 3 lines if key_mgmt=NONE
|
||||
key_mgmt=WPA-PSK
|
||||
proto=RSN WPA
|
||||
psk="..." # set this to your desired password
|
||||
}
|
||||
```
|
||||
|
||||
<p class="warning">Your password will be stored in <em>plain text</em> so make sure this file is not readable by anyone you don't want seeing the password.</p>
|
||||
|
||||
### Setting up the bridge
|
||||
|
||||
Now, we need to create a *bridge* network interface. This interface will bridge packets coming from the WiFi interface (`wlan0`) and send them over the Ethernet interface (`eth0`). This will allow devices connected to the Pi to appear on the same subnet as devices connected to the router itself.
|
||||
|
||||
First, define the interface:
|
||||
|
||||
```ini
|
||||
; /etc/systemd/network/02-br0.netdev
|
||||
|
||||
[NetDev]
|
||||
Name=br0
|
||||
Kind=bridge
|
||||
```
|
||||
|
||||
Then, tell `systemd-networkd` to bridge packets to `eth0`:
|
||||
|
||||
```ini
|
||||
; /etc/systemd/network/04-br0_add-eth0.network
|
||||
|
||||
[Match]
|
||||
Name=eth0
|
||||
[Network]
|
||||
Bridge=br0
|
||||
```
|
||||
|
||||
Finally, configure network settings on the bridge:
|
||||
|
||||
```ini
|
||||
; /etc/systemd/network/12-br0_up.network
|
||||
|
||||
[Match]
|
||||
Name=br0
|
||||
[Network]
|
||||
MulticastDNS=yes
|
||||
DHCP=yes
|
||||
```
|
||||
|
||||
### Tell wpa_supplicant to use a bridge
|
||||
|
||||
Now we have our bridge configured, but we need to tell our WiFi interface to actually use it. To do this, edit the `.service` file:
|
||||
|
||||
```bash
|
||||
systemctl edit wpa_supplicant@wlan0.service
|
||||
```
|
||||
|
||||
This will open up your editor. In this editor add these lines:
|
||||
|
||||
```ini
|
||||
[Service]
|
||||
ExecStartPre=/sbin/iw dev %i set type __ap
|
||||
ExecStartPre=/bin/ip link set %i master br0
|
||||
|
||||
ExecStart=
|
||||
ExecStart=/sbin/wpa_supplicant -c/etc/wpa_supplicant/wpa_supplicant-%I.conf -Dnl80211,wext -i%I -bbr0
|
||||
|
||||
ExecStopPost=-/bin/ip link set %i nomaster
|
||||
ExecStopPost=-/sbin/iw dev %i set type managed
|
||||
```
|
||||
|
||||
### Epilogue
|
||||
|
||||
Finally, reboot. That's it! Your shiny new network extender should appear in the list of local WiFi networks. Connect to it, and see the difference!
|
||||
|
||||
If you have any questions, feel free to [shoot me an email](mailto:yash@karx.xyz)!
|
||||
|
||||
|
Loading…
Reference in New Issue