# RaspberryPi LTE-Failover Router With DNS Caching - Trent's Blog
Trent's blog of mostly technical documentations.

Skip to content

# 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

RaspberryPi Router tethered off MotoX4 (running LineageOS)

## 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

After unlinking the symlinked version of `/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