tailscale/tailscale
Windows firewall uses incorrect IPv6 link-local prefix (ff80::/10 instead of fe80::/10), breaking NDP/DHCPv6 matching
Summary
Context: The Windows firewall code in
wf/firewall.godefines IPv6 address ranges used to match legitimate network traffic for NDP (Neighbor Discovery Protocol) and DHCPv6 firewall rules.Bug: The
linkLocalRangevariable is defined asff80::/10instead offe80::/10.Actual vs. expected: The range
ff80::/10falls within the IPv6 multicast range (ff00::/8), not the link-local unicast range, causing firewall rules to fail to match legitimate IPv6 link-local traffic from addresses starting withfe80::.Impact: Critical IPv6 protocols will be blocked, preventing IPv6 networking from functioning on Windows systems using this firewall.
Code with bug
This incorrect range is used in four firewall rules:
Codebase inconsistency
The code itself contains a TODO comment at line 363 that explicitly specifies the correct range:
The comment correctly states FE80::/10 for ICMPv6 types 134 (Router Advertisement) and 137 (Redirect), contradicting the actual implementation which uses FF80::/10.
Example
Testing with typical IPv6 link-local addresses confirms they do not match the current range:
Per RFC 4291 (IPv6 Addressing Architecture), the correct ranges are:
fe80::/10- Link-Local Unicast addressesff00::/8- Multicast addresses
The value ff80::/10 is within the multicast range, not the link-local range. All legitimate link-local traffic (starting with fe80::) will fail to match the firewall rules, blocking:
NDP Router Advertisements (breaking IPv6 routing configuration)
NDP Redirect Messages (breaking route optimization)
DHCPv6 traffic (breaking IPv6 address autoconfiguration)
Recommended fix
Change the single character from ff to fe: