I was recently setting up an OpenWrt router as a Managed AP (Access Point), but was having challenges setting up a global IPv6 address on the device. I could have put a static IPv4 address on the device, but it is on my IPv6-only network, and that just seemed like the wrong direction.
Then it occurred to me I had a tool, like the slingshot in my back pocket, which I could use: the link-local address of the AP. After all, every IPv6 interface has a link-local address. Of course this has the limitation that the PC must be on the same link, but that less of an issue for me that putting on an IPv4 address in an IPv6-only network.
Link-local addresses can also be used, when your network has gone terribly wrong, such as RAs (router advertisements) are no longer being sent, and you still need to get to that device to fix it.
Using IPv6 Scoped Addresses
The thing about using link-local addresses is that you have to indicate which interface to use (or scope), since all interfaces will have the same link-local subnet (FE80::/64). Fortunately RFC 4007 gives guidance on how to represent a scoped IPv6 Address. From the RFC (section 11):
<address>%<zone_id> where <address> is a literal IPv6 address, <zone_id> is a string identifying the zone of the address, and `%' is a delimiter character to distinguish between <address> and <zone_id>.
SSH using an IPv6 scoped link-local address
By using the scoped address, it is easy to ssh to the AP using the link-local address:
$ ssh admin@fe80::6a1:51ff:fea0:9338%wlan0 admin@fe80::6a1:51ff:fea0:9338%wlan0's password: BusyBox v1.25.1 () built-in shell (ash) _________ / /\ _ ___ ___ ___ / LE / \ | | | __| \| __| / DE / \ | |__| _|| |) | _| /________/ LE \ |____|___|___/|___| lede-project.org \ \ DE / \ LE \ / ----------------------------------------------------------- \ DE \ / Reboot (17.01.4, r3560-79f57e422d) \________\/ ----------------------------------------------------------- admin@pia:~#
Using the Link-Local Address in a Web Browser
The AP also has a web interface which can transform a complex configuration into a click of the mouse. But using Scoped Addresses in your browser isn’t as straight forward as it would seem.
RFC 6874 shows how to encode a scoped address in a URL. Since IPv6 literals are enclosed in square brackets, the URL should be as simple as:
But, wait, the percent sign is used to escape characters in a URL. So if we escape the percent sign, then the URL should be
http://[fe80::6a1:51ff:fea0:9338%25wlan0]/. Unfortunately, this doesn’t work.
No support for scoped addresses in the major browsers
Unfortunately, this doesn’t work in most browsers. The browser manufactures have decided to not implement RFC 6874. In some cases like Chrome, publicly saying that it isn’t worth the effort to parse the URL. Firefox also decided they won’t fix this issue. Even the w3.org which makes a reference browser Arora, has decided it won’t fix this lack of conformance to RFC 6874.
SSH to the rescue
Fortunately, there is a work-around which can trick your modern browser to use a scoped link-local address. It requires the help of
ssh and its TCP forwarding capability. By using the following command (put in your link-local address and scoped interface):
ssh -L '8080:[fe80::6a1:51ff:fea0:9338%wlan0]:80' localhost
Now return to your favourite browser, and use the URL
localhost:8080 and magically you will be transported to your device (in my case my AP) using the scoped link-local address.
Not the prettiest of solutions, but until the Browser folks realize there is a need for scoped link-local address it is what we have.
Using Link-Local Address as a last resort, when the network has gone wonky, or when the device won’t take a GUA (Global Unique Address), can be very useful. Keep it in your back pocket (like a slingshot) for when you really need to get there using IPv6.