[GL-MT6000 / fw 4.9.0] Native IPv6 STILL broken — root cause identified (ip6class='local'), promised fix never shipped

Hi all,

follow-up to my thread Flint 2 - GL-MT6000 ipv6 problem native (auto-closed July 6). Same setup: FTTH ONT (pure bridge) → MT6000 PPPoE, ISP /48 delegation. Now on firmware 4.9.0 — Native IPv6 is still broken out of the box.

:puzzle_piece: Root cause identified — and it explains the old odhcpd log

On 4.9.0 the GUI writes this to the LAN config when handling IPv6 modes:

network.lan.ip6assign='64' network.lan.ip6class='local' ​

ip6class='local' restricts the LAN to the ULA prefix only → the delegated /48 never gets assigned to br-lan. This is exactly why odhcpd was logging in my March thread:

odhcpd: A default route is present but there is no public prefix on br-lan thus we don't announce a default route ​

No public prefix on LAN → no default route in RA → clients hold stale GUAs with no route → intermittent/total IPv6 blackhole. Router side looks perfectly healthy (ifstatus wan6 OK, curl -6 OK), which makes this very easy to misdiagnose as an ISP issue.

Manual fix, verified working:

uci delete network.lan.ip6class uci commit network ifup lan ​

→ delegated prefix instantly assigned to LAN, clients get routed GUAs and pass test-ipv6.com 10/10. Problem: the GUI rewrites ip6class='local' on every Apply in the IPv6 page, so the fix doesn't persist through GUI changes. I'm keeping a hotplug script in /etc/hotplug.d/iface/ just to undo what the GUI does — that shouldn't be necessary.

:wrench: Second (separate) issue — HW acceleration, confirmed by GL engineers

In April, with GL engineers connected to my device via GoodCloud, we confirmed that Native IPv6 only works with hardware acceleration disabled. @will.qiu asked me to follow up via ticket, and on April 7 I was told a "very good update" was coming. 4.9.0 shipped — neither fix is in it.

:repeat_button: My current workaround: NAT6

NAT6 + HW accel on = stable, 10/10 on test-ipv6.com. But it's a workaround: masqueraded clients, no end-to-end IPv6, on hardware that's marketed as a flagship.

:folded_hands: Request to GL.iNet

  1. Fix the GUI writing ip6class='local' on LAN — it makes Native mode dead on arrival for anyone with prefix delegation.
  2. Ship the HW offload + Native IPv6 fix that was acknowledged back in April.

Happy to test beta builds — my device already served as the reference case via GoodCloud. Full diagnostics available on request.

script for fix manually:

cat > /root/fix-ipv6-mt6000.sh << 'EOF'
#!/bin/sh

fix-ipv6-mt6000.sh - Patch IPv6 GL-MT6000 fw 4.9.0 (bug ip6class='local')

CHANGED=0
echo "=== Patch IPv6 GL-MT6000 ==="
if [ "$(uci -q get network.lan.ip6class)" = "local" ]; then
echo "[FIX] ip6class='local' trovato -> rimuovo"
uci delete network.lan.ip6class
uci commit network
CHANGED=1
else
echo "[OK]  ip6class assente"
fi
if [ "$(uci -q get dhcp.lan.ra)" != "server" ]; then
echo "[FIX] dhcp.lan.ra -> server"
uci set dhcp.lan.ra='server'
uci commit dhcp
/etc/init.d/odhcpd restart
CHANGED=1
else
echo "[OK]  dhcp.lan.ra=server"
fi
if [ "$CHANGED" -eq 1 ]; then
echo "[...] Riavvio LAN"
ifup lan
sleep 8
fi
echo "=== Verifica ==="
ifstatus lan | grep -q '2a07:7e81:4829' && echo "[OK]  Prefisso delegato su LAN" || echo "[!!]  Prefisso delegato ASSENTE"
ping6 -c 2 -W 2 2001:4860:4860::8888 >/dev/null 2>&1 && echo "[OK]  IPv6 WAN funzionante" || echo "[!!]  Ping IPv6 fallito"
echo "=== Fine ==="
EOF
chmod +x /root/fix-ipv6-mt6000.sh && sh /root/fix-ipv6-mt6000.sh

Thanks

2 Likes

Thanks for your follow-up.

We are still following up on your previous issue. I have continued to follow up with you through a support ticket. Please check your email.

2 Likes

I’m running Vanilla Openwrt 25.12.5 flawlessly. I haven’t had to reboot to regain working internet or any weird stuff. It just works…

1 Like

Update:

On 4.9.0 the GUI writes this to the LAN config when handling IPv6 modes:

network.lan.ip6assign='64' network.lan.ip6class='local' ​

ip6class='local' restricts the LAN to the ULA prefix only → the delegated /48 never gets assigned to br-lan. This is exactly why odhcpd was logging in my March thread:

odhcpd: A default route is present but there is no public prefix on br-lan thus we don't announce a default route ​

In NAT6 mode, the logic is as follows: The router provides a local area network IPv6 address to devices on the LAN through NAT address translation. If internal network address translation is not required, please switch to Native or Passthrough mode.

In April, with GL engineers connected to my device via GoodCloud, we confirmed that Native IPv6 only works with hardware acceleration disabled. @will.qiu asked me to follow up via ticket, and on April 7 I was told a "very good update" was coming. 4.9.0 shipped — neither fix is in it.

The malfunction is caused by an incorrect addition of a Full Cone NAT rule in the IPv6 firewall. Temporary Solution:

sed -i 's|sed -e "/\\s\[DS]NAT\\s/d;/\\sMASQUERADE\$/d"|sed -e "/\\s\[DS]NAT\\s/d;/\\sMASQUERADE\$/d;/\\sFULLCONENAT\$/d"|' /etc/firewall.nat6

sync

We will fix this in the next firmware version.

2 Likes

another fix is to auto open port on device with IPV6 and not tu use shell command, ipv6 born for this facility…

That error still comes up when using native IPv6 btw. One of the reasons I’m running 25.12.5 now instead of gl fork