170 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			170 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| ---
 | |
| title: "RaspberryPi LTE-Failover Router With DNS Caching"
 | |
| date: 2021-10-06
 | |
| draft: false
 | |
| tags: ["RaspberryPi", "Arch", "linux", "router", "tethering", "android", "winblows"]
 | |
| summaryimage: PXL_20211006_142214161_672x504.png
 | |
| summaryimagew: 672
 | |
| summaryimageh: 504
 | |
| authors: ["trent"]
 | |
| post: 23
 | |
| ---
 | |
| 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](https://www.amazon.com/CanaKit-Raspberry-Starter-Premium-Black/dp/B07BCC8PK7){target="_blank"}
 | |
| running [Arch Linux Arm](https://archlinuxarm.org/platforms/armv8/broadcom/raspberry-pi-3){target="_blank"}
 | |
| * Old Android Phone Running [LineageOS](https://wiki.lineageos.org/devices/){target="_blank"}
 | |
| * [Free Data Sim Card From GoogleFi](https://support.google.com/fi/answer/6330195?hl=en#zippy=%2Corder-your-data-only-sim){target="_blank"}
 | |
| 
 | |
| 
 | |
| <figure>
 | |
|   <img src=../../photos/PXL_20211006_142214161_672x504.png width="100%" />
 | |
|   <figcaption>RaspberryPi Router tethered off MotoX4 (running LineageOS)</figcaption>
 | |
| </figure>
 | |
| 
 | |
| ## Setup
 | |
| Personally I would
 | |
| 
 | |
| * [secure the ssh server](https://wiki.archlinux.org/title/OpenSSH#Force_public_key_authentication){target="_blank"}
 | |
| * [generate and configure the locale](https://wiki.archlinux.org/title/locale){target="_blank"}
 | |
| * [remove the default root password, and default user](https://wiki.archlinux.org/title/users_and_groups){target="_blank"}
 | |
| * write your preferred hostname in `/etc/hostname`
 | |
| * configure your preferred timezone:
 | |
|   ```shell
 | |
|   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](https://wiki.archlinux.org/title/WireGuard){target="_blank"}.
 | |
| 
 | |
| ## 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.
 | |
| ```shell
 | |
| # 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`.
 | |
| ```cfg
 | |
| # 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*`
 | |
| ```cfg
 | |
| # uplink
 | |
| # /etc/systemd/network/usb0.network
 | |
| [Match]
 | |
| Name=usb0
 | |
| 
 | |
| [Network]
 | |
| DHCP=yes
 | |
| DNSSEC=no
 | |
| IPForward=yes
 | |
| ```
 | |
| ```cfg
 | |
| # 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](https://wiki.archlinux.org/title/dnsmasq){target="_blank"},
 | |
| and enable it `systemctl enable dnsmasq`.
 | |
| ```cfg
 | |
| # /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`.
 | |
| ```cfg
 | |
| # downlink, ethernet cable
 | |
| # /etc/systemd/network/eth0.network
 | |
| [Match]
 | |
| Name=eth0
 | |
| 
 | |
| [Network]
 | |
| Address=10.12.34.1/24
 | |
| # DHCPServer=yes
 | |
| IPForward=yes
 | |
| IPMasquerade=both
 | |
| ```
 | |
| ```cfg
 | |
| # /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](https://www.freedesktop.org/software/systemd/man/systemd.network.html){target="_blank"}
 | |
| 
 | |
| ## Use With Multiple Computers
 | |
| Just add an
 | |
| [unmanaged switch](https://www.amazon.com/Ethernet-Splitter-Optimization-Unmanaged-TL-SG108/dp/B00A121WN6){target="_blank"}.
 | |
| 
 | |
| ## Wifi Instead of Ethernet
 | |
| Use downlink definition for `wlan0` instead of `eth0`,
 | |
| and install `hostapd`
 | |
| ```cfg
 | |
| # /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
 | |
| ```
 |