Whereas most of the networks I regularly use (home, work, hackerspace, events, …) provide native IPv6 connectivity, sometimes I’m in a legacy-only network, e.g. when tethering via my phone on some mobile providers.
By far the most common IPv6-only service I use these days is SSH to my computer(s) at home. On philosophical grounds, I refuse to set up a dynamic DNS record and port-forwardings, so the alternative I use is either Miredo or tunneling through a dual-stacked machine. For the latter, I used to use the following SSH config:
Host home Hostname home.zekjur.net ProxyCommand ssh -4 dualstack -W %h:%p
The issue with that setup is that it’s inefficient when I’m in a network which
does support IPv6, and it requires me to authenticate to both machines. These
are not huge issues of course, but they bother me enough that I’ve gotten into
the habit of commenting out/in the ProxyCommand
directive
regularly.
I’ve discovered that SSH can be told to use a ProxyCommand
only
when you don’t have a route to the public IPv6 internet, though:
Match host home exec "ip -6 route get 2001:7fd::1 2>&1 | grep -q unreachable" ProxyCommand ssh -4 dualstack -W %h:%p Host home Hostname home.zekjur.net
The IPv6 address used is from k.root-servers.net
, but no packets
are being sent — we merely ask the kernel for a route. When you don’t have an
IPv6 address or default route, the ip
command will print
unreachable
, which enables the ProxyCommand
.
For debugging/verifying the setup works as expected, use ssh -vvv
and look for lines prefixed with “Debug3”.
I run a blog since 2005, spreading knowledge and experience for almost 20 years! :)
If you want to support my work, you can buy me a coffee.
Thank you for your support! ❤️