Heath Kehoe
New Around Here
tldr: if IPv6 isn't working for you, it could be because of the ipv6_neighsol_drop nvram setting.
So IPv6 just wasn't working for me. We have an allocation from our ISP and my contact there said everything looked good on their end. But no v6 traffic was making it past the AC68.
I could configure my laptop with the router's v6 address and connect directly to the uplink ethernet; and that worked fine. So the problem was definitely in asuswrt. To help troubleshoot, I made a custom build of asuswrt-merlin with tcpdump enabled. From the packet captures, I determined that the ISP's router was sending Neighbor Solicitations to find my router but my router was not replying to the NSs.
Very weird, especially since ip6tables -L showed explicit rules allowing neighbor-solicitations and neighbor-advertisements. I dug around in /proc/sys/net, read docs, pulled out hair, but couldn't find any reason why this router wasn't responding to an NS.
About to give up, I finally thought to look at the "mangle" table (ip6tables -L -t mangle) and there it was: a rule explicitly dropping neighbor solicitations from eth0.
I deleted that rule, and BAM! IPv6 was back!
Since I already had asuswrt-merlin sources, I grepped the code looking for where that mangle rule came from and found the bit commented "Workaround for neighbor solicitation flood from Comcast", controlled by nvram variable ipv6_neighsol_drop, which defaults to 1.
It was then that I found the mention in the ChangeLog (from nearly a year ago) about that workaround. So I maybe could have saved myself a bunch of time if I had (1) happened to see it, and (2) realized how it applied.
Anyway, why is the default for that 1? Because it seems to me that NS is pretty fundamental to IPv6 operation and nuking it just to workaround one broken provider seems like the wrong approach.
So IPv6 just wasn't working for me. We have an allocation from our ISP and my contact there said everything looked good on their end. But no v6 traffic was making it past the AC68.
I could configure my laptop with the router's v6 address and connect directly to the uplink ethernet; and that worked fine. So the problem was definitely in asuswrt. To help troubleshoot, I made a custom build of asuswrt-merlin with tcpdump enabled. From the packet captures, I determined that the ISP's router was sending Neighbor Solicitations to find my router but my router was not replying to the NSs.
Very weird, especially since ip6tables -L showed explicit rules allowing neighbor-solicitations and neighbor-advertisements. I dug around in /proc/sys/net, read docs, pulled out hair, but couldn't find any reason why this router wasn't responding to an NS.
About to give up, I finally thought to look at the "mangle" table (ip6tables -L -t mangle) and there it was: a rule explicitly dropping neighbor solicitations from eth0.
I deleted that rule, and BAM! IPv6 was back!
Since I already had asuswrt-merlin sources, I grepped the code looking for where that mangle rule came from and found the bit commented "Workaround for neighbor solicitation flood from Comcast", controlled by nvram variable ipv6_neighsol_drop, which defaults to 1.
It was then that I found the mention in the ChangeLog (from nearly a year ago) about that workaround. So I maybe could have saved myself a bunch of time if I had (1) happened to see it, and (2) realized how it applied.
Anyway, why is the default for that 1? Because it seems to me that NS is pretty fundamental to IPv6 operation and nuking it just to workaround one broken provider seems like the wrong approach.