2023-08-12
Getting my backup Internet connection through BlueTooth on Linux
Suppose, not entirely hypothetically, that your normal DSL Internet connection is down (for example, because the local phone company did something to your line and hasn't fixed it yet), and you need to get Internet by tethering your Linux desktop machine to your smartphone. The easiest way to do this is to be using a modern Linux desktop along with NetworkManager and so on; at that point you can basically click through the various GUIs to connect to your phone's hotspot through wifi, a direct USB connection, or BlueTooth, depending on what you have available. This will handle joining the phone's ad-hoc wifi network, pairing over USB and/or BlueTooth, and all of the other setup you need. However, I don't use a modern Linux desktop.
I suspect that the second easiest way is to at least have NetworkManager
around and running, so that you can configure and activate those
connections by hand, possibly with command line tools like nmcli
.
Although I've considered this sort of use of NetworkManager, I haven't yet set it up so I can't
say how well it works.
The third easiest way, at least for me, is to use a
direct USB connection between my desktop and my phone. Fedora 37
(and previous versions) more or less magically makes this work (for
my phone) so that an 'eth0
' USB Ethernet device appears. Once the
phone's network connection is present, I can start a DHCP client
by hand on that interface to get connected
and then bring up my WireGuard tunnel through the phone's NAT. Connecting the phone via USB also is probably
the fastest and most reliable connection between the two, and it
has the side benefit of keeping the phone charged instead of running
down its battery.
However, USB has the small drawback of using a cable, which is a potential problem if for some reason you need to walk around while carrying your phone (for example, if you're waiting for a call from your phone company). My home desktop doesn't have wifi, but it does have a USB BlueTooth dongle I got for other reasons and my phone supports tethering over BlueTooth, so today I gave it a shot. It works, but the command line incantations are a bit obscure and I couldn't find much in Internet searches.
I'm not sure how I got my phone and my desktop paired over BlueTooth,
but it appears I managed this trick at some point. Possibly I used
to GUI tools from Blueman,
but it looks like I have a bunch of the tools listed in the Arch
Wiki page on BlueTooth,
so I'm not sure which one I used. In any case, once the two had
been paired in the past, I could enable the connection with
'bluetoothctl devices
' to get the MAC and then 'bluetoothctl
connect <MAC>
' to connect my desktop to my phone. However, this
doesn't automatically create any sort of network device. To do that,
I needed to run an additional command, 'bt-network -c <MAC> nap
';
this command stays in the foreground and creates a 'bnep0
' network
device. After that, I did my manual DHCP client stuff on 'bnep0
' instead of 'eth0
' and it all
worked the same.
(In theory bt-network supports 'gn', 'panu', or 'nap' connection modes and I sort of thought I wanted 'panu' (see for example this page). In practice trying either 'panu' or 'gn' caused bt-network to dump core, while using 'nap' made everything work even if it's not supposed to have. On Fedora, bt-network comes from the bluez-tools package.)
I haven't tried to measure the speed or latency of BlueTooth as compared with the USB connection. I would expect it to be worse, and in general I'd rather use USB if I have a choice (and on something with wifi, such as my work laptop, I'd try to use wifi as a fallback, even though it's awkward in my current specific situation).
(There's an Arch Wiki guide on this, but its by
hand example uses something called 'pand
', which is apparently a
long obsolete and removed program from older versions of BlueZ.)
PS: I have no idea how much of this would apply to Android phones.
PPS: An interesting side effect of connecting my desktop to my phone over BlueTooth is that my desktop's audio became the phone's default audio output. Probably there are ways to control this so that my desktop doesn't advertise to the phone that it's an audio device and I'm only using the phone for its Internet connection, but right now I can't be bothered to figure them out. And in the mean time it's cute to find out that the phone even sends track information to my desktop (which I saw by leaving 'bluetoothctl' running after I'd (re)connected).