Tracking IPv6 link local support in browsers
This commit is contained in:
		
					parent
					
						
							
								996b5826b2
							
						
					
				
			
			
				commit
				
					
						761a93ec7a
					
				
			
		
					 1 changed files with 173 additions and 0 deletions
				
			
		
							
								
								
									
										173
									
								
								content/u/blog/ipv6-link-local-support-in-browsers/contents.lr
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										173
									
								
								content/u/blog/ipv6-link-local-support-in-browsers/contents.lr
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,173 @@
 | 
				
			||||||
 | 
					title: Support for IPv6 link local addresses in browsers
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					pub_date: 2021-06-14
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					author: ungleich
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					twitter_handle: ungleich
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					_hidden: no
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					_discoverable: yes
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					abstract:
 | 
				
			||||||
 | 
					Tracking the progress of browser support for link local addresses
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					body:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Introduction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Link Local addresses
 | 
				
			||||||
 | 
					([fe80::/10](https://en.wikipedia.org/wiki/Link-local_address)) are
 | 
				
			||||||
 | 
					used for addressing devices in your local subnet. They can be
 | 
				
			||||||
 | 
					automatically generated and using the IPv6 multicast address
 | 
				
			||||||
 | 
					**ff02::1**, all hosts on the local subnet can easily be located.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					However browsers like Chrome or Firefox do not support **entering link
 | 
				
			||||||
 | 
					local addresses inside a URL**, which prevents accessing devices
 | 
				
			||||||
 | 
					locally with a browser, for instance for configuring them.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Link local addresses need **zone identifiers** to specify which
 | 
				
			||||||
 | 
					network device to use as an outgoing interface. This is because
 | 
				
			||||||
 | 
					**you have link local addresses on every interface** and your network
 | 
				
			||||||
 | 
					stack does not know on its own, which interface to use. So typically a
 | 
				
			||||||
 | 
					link local address is something on the line of
 | 
				
			||||||
 | 
					**fe80::fae4:e3ff:fee2:37a4%eth0**, where **eth0** is the zone
 | 
				
			||||||
 | 
					identifier.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Them problem is becoming more emphasised, as the world is moving more
 | 
				
			||||||
 | 
					and more  towards **IPv6 only networks**.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You might not even know the address of your network equipment anymore,
 | 
				
			||||||
 | 
					but you can easily locate iit using the **ff02::1 multicast
 | 
				
			||||||
 | 
					address**. So we need support in browsers, to allow network
 | 
				
			||||||
 | 
					configurations.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Status of implementation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The main purpose of this document is to track the status of the
 | 
				
			||||||
 | 
					link-local address support in the different browsers and related
 | 
				
			||||||
 | 
					standards. The current status is:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* Firefox says whatwg did not define it
 | 
				
			||||||
 | 
					* Whatwg says zone id is intentionally omitted and and reference w3.org
 | 
				
			||||||
 | 
					* w3.org has a longer reasoning, but it basically boils down to
 | 
				
			||||||
 | 
					  "Chrome does not do it and it's complicated and nobody needs it"
 | 
				
			||||||
 | 
					* Chromium says it seems not to be worth the effort
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## IPv6 link local address support in Firefox
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The progress of IPv6 link local addresses for Firefox is tracked
 | 
				
			||||||
 | 
					on [the mozilla
 | 
				
			||||||
 | 
					bugzilla](https://bugzilla.mozilla.org/show_bug.cgi?id=700999). The
 | 
				
			||||||
 | 
					current situation is that Firefox references to the lack of
 | 
				
			||||||
 | 
					standardisation by whatwg as a reason for not implementing it. Quoting
 | 
				
			||||||
 | 
					Valentin Gosu from the Mozilla team:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					The main reason the zone identifier is not supported in Firefox is
 | 
				
			||||||
 | 
					that parsing URLs is hard.  You'd think we can just pass whatever
 | 
				
			||||||
 | 
					string to the system API and it will work or fail depending on whether
 | 
				
			||||||
 | 
					it's valid or not, but that's not the case. In bug 1199430 for example
 | 
				
			||||||
 | 
					it was apparent that we need to make sure that the hostname string is
 | 
				
			||||||
 | 
					really valid before passing it to the OS.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					I have no reason to oppose zone identifiers in URLs as long as the URL
 | 
				
			||||||
 | 
					spec defines how to parse them.  As such, I encourage you to engage
 | 
				
			||||||
 | 
					with the standard at https://github.com/whatwg/url/issues/392 instead
 | 
				
			||||||
 | 
					of here.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Thank you!
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## IPv6 link local address support in whatwg
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The situation at [whatwg](https://whatwg.org/) is that there is a
 | 
				
			||||||
 | 
					[closed bugreport on github](https://github.com/whatwg/url/issues/392)
 | 
				
			||||||
 | 
					and [in the spec it says](https://url.spec.whatwg.org/#concept-ipv6)
 | 
				
			||||||
 | 
					that
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Support for <zone_id> is intentionally omitted.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					That paragraph links to a bug registered at w3.org (see next chapter).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## IPv6 link local address support at w3.org
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					At [w3.org](https://www.w3.org/) there is a
 | 
				
			||||||
 | 
					bug titled
 | 
				
			||||||
 | 
					[Support IPv6 link-local
 | 
				
			||||||
 | 
					addresses?](https://www.w3.org/Bugs/Public/show_bug.cgi?id=27234#c2)
 | 
				
			||||||
 | 
					that is set to status **RESOLVED WONTFIX**. It is closed basically
 | 
				
			||||||
 | 
					based on the following statement from Ryan Sleevi:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					Yes, we're especially not keen to support these in Chrome and have
 | 
				
			||||||
 | 
					repeatedly decided not to. The platform-specific nature of <zone_id>
 | 
				
			||||||
 | 
					makes it difficult to impossible to validate the well-formedness of
 | 
				
			||||||
 | 
					the URL (see https://tools.ietf.org/html/rfc4007#section-11.2 , as
 | 
				
			||||||
 | 
					referenced in 6874, to fully appreciate this special hell). Even if we
 | 
				
			||||||
 | 
					could reliably parse these (from a URL spec standpoint), it then has
 | 
				
			||||||
 | 
					to be handed 'somewhere', and that opens a new can of worms.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Even 6874 notes how unlikely it is to encounter these in practice -
 | 
				
			||||||
 | 
					  "Thus, URIs including a
 | 
				
			||||||
 | 
					   ZoneID are unlikely to be encountered in HTML documents.  However, if
 | 
				
			||||||
 | 
					   they do (for example, in a diagnostic script coded in HTML), it would
 | 
				
			||||||
 | 
					   be appropriate to treat them exactly as above."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Note that a 'dumb' parser may not be sufficient, as the Security Considerations of 6874 note:
 | 
				
			||||||
 | 
					  "To limit this risk, implementations MUST NOT allow use of this format
 | 
				
			||||||
 | 
					   except for well-defined usages, such as sending to link-local
 | 
				
			||||||
 | 
					   addresses under prefix fe80::/10.  At the time of writing, this is
 | 
				
			||||||
 | 
					   the only well-defined usage known."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					And also
 | 
				
			||||||
 | 
					  "An HTTP client, proxy, or other intermediary MUST remove any ZoneID
 | 
				
			||||||
 | 
					   attached to an outgoing URI, as it has only local significance at the
 | 
				
			||||||
 | 
					   sending host."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This requires a transformative rewrite of any URLs going out the
 | 
				
			||||||
 | 
					wire. That's pretty substantial. Anne, do you recall the bug talking
 | 
				
			||||||
 | 
					about IP canonicalization (e.g. http://127.0.0.1 vs
 | 
				
			||||||
 | 
					http://[::127.0.0.1] vs http://012345 and friends?) This is
 | 
				
			||||||
 | 
					conceptually a similar issue - except it's explicitly required in the
 | 
				
			||||||
 | 
					context of <zone_id> that the <zone_id> not be emitted.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					There's also the issue that zone_id precludes/requires the use of APIs
 | 
				
			||||||
 | 
					that user agents would otherwise prefer to avoid, in order to
 | 
				
			||||||
 | 
					'properly' handle the zone_id interpretation. For example, Chromium on
 | 
				
			||||||
 | 
					some platforms uses a built in DNS resolver, and so our address lookup
 | 
				
			||||||
 | 
					functions would need to define and support <zone_id>'s and map them to
 | 
				
			||||||
 | 
					system concepts. In doing so, you could end up with weird situations
 | 
				
			||||||
 | 
					where a URL works in Firefox but not Chrome, even though both
 | 
				
			||||||
 | 
					'hypothetically' supported <zone_id>'s, because FF may use an OS
 | 
				
			||||||
 | 
					routine and Chrome may use a built-in routine and they diverge.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Overall, our internal consensus is that <zone_id>'s are bonkers on
 | 
				
			||||||
 | 
					many grounds - the technical ambiguity (and RFC 6874 doesn't really
 | 
				
			||||||
 | 
					resolve the ambiguity as much as it fully owns it and just says
 | 
				
			||||||
 | 
					#YOLOSWAG) - and supporting them would add a lot of complexity for
 | 
				
			||||||
 | 
					what is explicitly and admittedly a limited value use case.
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This bug references the Mozilla Firefox bug above and
 | 
				
			||||||
 | 
					[RFC3986 (replaced by RFC
 | 
				
			||||||
 | 
					6874)](https://datatracker.ietf.org/doc/html/rfc6874#section-2).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## IPv6 link local address support in Chrome / Chromium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					On the chrome side there is a
 | 
				
			||||||
 | 
					[huge bug
 | 
				
			||||||
 | 
					report](https://bugs.chromium.org/p/chromium/issues/detail?id=70762)
 | 
				
			||||||
 | 
					which again references a huge number of other bugs that try to request
 | 
				
			||||||
 | 
					IPv6 link local support, too.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The bug was closed by cbentzel@chromium.org stating:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					There are a large number of special cases which are required on core
 | 
				
			||||||
 | 
					networking/navigation/etc. and it does not seem like it is worth the
 | 
				
			||||||
 | 
					up-front and ongoing maintenance costs given that this is a very
 | 
				
			||||||
 | 
					niche - albeit legitimate - need.
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue