I, along with my family, like to travel several times a year. The type of traveling varies – sometimes it is somewhere within a day or two driving distance and other times we take the a flight to somewhere more distant and stay longer. This is possible because I am a mostly (99% of the time) remote worker and can work from most locations so long as I have power for my laptop and accessories and high speed Internet. When I am stationary I try to use the local WiFi if possible, but if I am traveling or at a location that does not have suitable WiFi then I will use my Android smart phone (Verizon service) to fill the gap. Using my phone is fine for one device, but what if I need to connect more than one? When I’m at a hotel, do I really want to trust their WiFi? Well it turns out the answer to both of these questions is to pair my phone with a specialized router.
First some background: most phone carriers (at least in the US) allow hot-spots on the phone, but they come with a catch: you are limited, per month, in how much bandwidth you are allowed to consume. In Verizon-land it is somehow acceptable to cap this at 15GB per month which is a bit unrealistic in this day and age. The phone itself has unlimited data, but anything you wish to connect to the built-in hot-spot or otherwise tether to the phone is limited to 15GB per month. One day I got to thinking “so how can I tap into that unlimited side of the phone?” A bit of searching turned up a few options. Out of those options, I would say the top two are: PDANet+, which as been around for many years and EasyTether, a more recent addition. On the phone-side they are both paid apps on the Google Play Store, and while I own both, I have found EasyTether to work with more devices and it also seems to use closer to the phones full network speed.
What this looks like then is on my Android phone I use a paid app named EasyTether and on my laptop I use a free piece of software also named EasyTether. The creators of EasyTether provide client-side support for Linux, Windows, Mac, and some specialized devices. I personally have used it with Linux, Windows, and a few specialized routers. EasyTether can connect to the phone via Bluetooth or USB. The USB option is faster and will also trickle charge your phone. The Bluetooth option is good if you are unable to plug your phone in (i.e. you are also using it and having a cord is annoying) but are within 25 or so feet of your client-end (i.e. laptop), but Bluetooth 3 and 4 have a ~25 megabit/second limit. This means that you will run into a big bottleneck with Bluetooth while with USB you will probably top out your cell network bandwidth before you hit the 5gigabit/second limit of USB 3. These limits are of course on paper and other factors come into play.
My initial thought was to use a Raspberry PI and tether my phone to it, but that meant the access point was software which has never been very good in my experience. Then I got to thinking about specialized travel routers. After some searching and reading reviews I found the GL.iNet GL-AR750S-Ext Travel Router, hereafter referred to as the ar750s to keep things easy for me. The ar750s is a dual-band (2.4GHz and 5GHz) router, with external antennas, running OpenWRT (Linux-based) firmware and it has 3 gigabit Ethernet ports. The OpenWRT firmware can be customized in just about any way you could imagine. The ar750s has built-in OpenVPN client and server, dual flash, ac750, external storage (micro-SD), and has a bunch of included utilities. One of its features is the ability to connect to an existing WiFi as an extender, act as a broadband router, and the list goes on.
After I ordered the router from Amazon I expected to have to do a bit of hacking to make their pairing work, but it turns out both GL.iNet and EasyTether work together already. GL.iNet has a nice EasyTether guide. The only difference for me was the EasyTether version needed to be a newer (latest) version instead of the quite old one reference in the guide. If for some reason that guide is no longer available, what you need to do is extract the EasyTether file on your computer, find the ipk under “*\ar71xx\generic” and scp it to the router, ssh to the router as root (using whatever password you set in the web interface), run “opkg update” and “opkg install <path/to/where/you/scp’d/the/ipk>. Once you have the IPK installed, you need to run “easytether-usb” to set it up. Then edit /etc/config/network and add “config interface ‘wan’ \ option ifname ‘tap-easytether’ \ option proto ‘dhcp'” (where the “\” is, put a newline). Oh, and you will need to have USB debugging enabled on your phone.
This setup works pretty darn good, but requires ssh’ing into the router each time you want to bring the connection up or if it dies. So I wrote a simple SH script, available from my GitHub. In case that dies, here it is in all its glory:
# A simple script that checks for connectivity (including working DNS resolution)
# If no connectivity, reset tethering
# Requires easytether-usb to be installed and already setup/working
# Manual (one time) setting of the USB device ID of the tether device (TETHERDEV).
# Find the tethering device with lsusb. Example (Samsung/Verizon kids tablet):
# Bus 001 Device 013: ID 04e8:6860 Samsung Electronics Co., Ltd Galaxy (MTP)
# 04e8:6860 is for Samsung’s USB identification (both Note 10 and kids tablet)
# Some highly available website to check (www.google.com is backed by *lots* of servers)
# How long before we check again?
while true; do
curl –connect-timeout 10 $CHECKWWW > /dev/null 2>&1
if [ $? != 0 ]; then
# No internet
echo “Network down, Houston we have a problem!” # FIXME: For debugging
# Reset the USB device
# Wait a few seconds for device to be ready again
# (re)start easytether-usb to make a connection
# Internet working
echo “Network up, all good in the hood!” # FIXME: For debugging
I put this file /usr/local/sbin and make sure it is executable. Then we need to edit /etc/rc.local (just before the ‘exit’) and add “/usr/local/sbin/fixnet.sh&” so it will start at boot. Be sure to change the TETHERDEV to match the USB ID of your phone (found with “lsusb”) in order for it to work. I use curl instead of ping, because ICMP packets are filtered/blocked in my testing.
Once you have everything up and running you only need to enable EasyTether USB on your phone via the app and plug it into the USB port on the router. The router is very easy to use and once configured I rarely need to do anything other than power it on. Speaking of power, the ar750s runs great from a battery pack. The battery pack that I use to charge my phone on the go will also power the ar750s for several hours.
So that covers mobile data (traveling) and places that have no Internet, but what about when I’m at a hotel or using some other network (be it WiFi or wired) that cannot be trusted? Well, for those incidents, I prefer to have my devices behind another layer of isolation via the ar750s. The ar750s supports being a router via Ethernet as well as acting as a WiFi repeater. If the hotel WiFi is not encrypted (often the case) I like to use OpenVPN whenever possible to close the gap. When I am using the router without my phone, the above script will keep trying to reset USB and connect EasyTether to a non-existent device. This has not caused any problems for me. However, it might be a problem if you try to use the USB port for something else – so be warned!