RaspberryPi LTE-Failover Router With DNS Caching
date: 2021-10-06
Introduction
Apparently Windows has a problem resolving hosts when you tether from Mobile HotSpot.
The solution is to build a DNS-Caching router that tethers off the smartphone. This takes advantage of Android's ability so transparently fail-over to LTE when residential internet service goes down.
This solution also takes advantage of the RaspberryPi's incredibly low price, the fact that LineageOS will run on cheap old phones that are no longer supported by the mfgr, and the fact that GoogleFi will ship you a data-sim for free.
For instance, I just bought a brand-new, open-box Pixel phone for $85, and presumable the MotoX4 can also be had for next to nothing.
Materials
- RaspberryPi running Arch Linux Arm
- Old Android Phone Running LineageOS
- Free Data Sim Card From GoogleFi
Setup
Personally I would
- secure the ssh server
- generate and configure the locale
- remove the default root password, and default user
- write your preferred hostname in
/etc/hostname
- configure your preferred timezone:
ln -sf /usr/share/zoneinfo/<Zone>/<SubZone> /etc/localtime
Additionally, the router won't be accessible for administrative tasks when it is behind the Android Tether ; for this I would use a wireguard vpn.
Configure The Router.
The entire configuration of the router consists of two systemd-networkd
interface definitions, as well as /etc/resolv.conf
, and /etc/dnsmasq.conf
.
resolvconf
systemd-resolved
is no use to us because it only listens on localhost.
# disable systemd-resolved
systemctl stop systemd-resolved
systemctl disable systemd-resolved
unlink /etc/resolv.conf
/etc/resolv.conf
,
write your nameservers and options in a real /etc/resolv.conf
.
# the default timeout of 5 seconds is too slow
options timeout:1
# nameserver when connected to lan
nameserver 192.168.1.1
# nameserver when connected to mobile network
nameserver 8.8.8.8
Interface Definitions For systemd-networkd
I believe the usb interfaces are numbered 1-4,
so either be careful which one you use, or maybe a wildcard name
will work, i.e. Name=usb*
# uplink
# /etc/systemd/network/usb0.network
[Match]
Name=usb0
[Network]
DHCP=yes
DNSSEC=no
IPForward=yes
# downlink, ethernet cable
# /etc/systemd/network/eth0.network
[Match]
Name=eth0
[Network]
Address=10.12.34.1/24
DHCPServer=yes
IPForward=yes
IPMasquerade=both
Configuration For dnsmasq
Install dnsmasq,
and enable it systemctl enable dnsmasq
.
# /etc/dnsmasq.conf
resolv-file=/etc/resolv.conf
interface=eth0
no-dhcp-interface=eth0
Reboot
Plug in the Android Phone, reboot the RaspberryPi, and when it comes back up toggle on the USB tether on the Android Phone.
Plug ethernet cable into Windows Computer, open CMD prompt and type
ping google.com
to test connectivity and name resolution. Or on a
Linux computer type ping -c 3 google.com
.
Alternate DHCP Service
You can use dnsmasq
for DHCP Service instead of systemd-networkd
.
# downlink, ethernet cable
# /etc/systemd/network/eth0.network
[Match]
Name=eth0
[Network]
Address=10.12.34.1/24
# DHCPServer=yes
IPForward=yes
IPMasquerade=both
# /etc/dnsmasq.conf
resolv-file=/etc/resolv.conf
interface=eth0
# no-dhcp-interface=eth0
dhcp-range=10.12.34.50,10.12.34.150
Reference For systemd-networkd
- examples in
/usr/lib/systemd/network/
- Man Page
Use With Multiple Computers
Just add an unmanaged switch.
Wifi Instead of Ethernet
Use downlink definition for wlan0
instead of eth0
,
and install hostapd
# /etc/hostapd/hostapd.conf
interface=wlan0
hw_mode=g
channel=7
wmm_enabled=0
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
ssid=NETWORK
wpa_passphrase=PASSWORD