Hello
Starlink's IPv6 connection, when using OpenWRT in bypass mode, is dropping and reconnecting. It drops and reconnects every minute.
Does anyone know if there's a custom configuration that needs to be done to fix this?
Hello
Starlink's IPv6 connection, when using OpenWRT in bypass mode, is dropping and reconnecting. It drops and reconnects every minute.
Does anyone know if there's a custom configuration that needs to be done to fix this?
Maybe you can figure out. A good start is to read the logs?
Please connect to your OpenWrt device using ssh and copy the output of the following commands and post it here using the "Preformatted text </> " button (red circle; this works best in the 'Markdown' composer view in the blue oval):
![]()
Remember to redact passwords, VPN keys, MAC addresses and any public IP addresses you may have:
ubus call system board
cat /etc/config/network
cat /etc/config/dhcp
cat /etc/config/firewall
By large starlink allows cgnat ip4 and delegates a routable ip6 prefix, and should work with all defaults.
root@OpenWrt:~# ubus call system board
{
"kernel": "6.6.119",
"hostname": "ROTEADOR_OPENWRT",
"system": "ARMv8 Processor rev 4",
"model": "Xiaomi Mi Router AX3000T",
"board_name": "xiaomi,mi-router-ax3000t",
"rootfs_type": "squashfs",
"release": {
"distribution": "OpenWrt",
"version": "24.10.5",
"revision": "r29087-d9c5716d1d",
"target": "mediatek/filogic",
"description": "OpenWrt 24.10.5 r29087-d9c5716d1d",
"builddate": "1766005702"
}
}
root@OpenWrt:~# cat /etc/config/network
config interface 'loopback'
option device 'lo'
option proto 'static'
option ipaddr '127.0.0.1'
option netmask '255.0.0.0'
config globals 'globals'
config device
option name 'br-lan'
option type 'bridge'
list ports 'lan2'
list ports 'lan3'
list ports 'lan4'
config interface 'lan'
option device 'br-lan'
option proto 'static'
option ipaddr '192.168.30.1'
option netmask '255.255.255.0'
option ip6assign '60'
config device
option name 'wan'
option macaddr 'XX:XX:XX:XX:XX:XX'
config interface 'wan'
option device 'wan'
option proto 'dhcp'
option delegate '0'
config interface 'wan6'
option device 'wan'
option proto 'dhcpv6'
option reqaddress 'try'
option reqprefix '56'
option norelease '1'
option sourcefilter '0'
root@OpenWrt:~# cat /etc/config/dhcp
config dnsmasq
option domainneeded '1'
option boguspriv '1'
option filterwin2k '0'
option localise_queries '1'
option rebind_protection '1'
option rebind_localhost '1'
option local '/lan/'
option domain 'lan'
option expandhosts '1'
option nonegcache '0'
option authoritative '1'
option readethers '1'
option leasefile '/tmp/dhcp.leases'
option resolvfile '/tmp/resolv.conf.d/resolv.conf.auto'
option nonwildcard '1'
option localservice '1'
option ednspacket_max '1232'
option filter_aaaa '0'
option filter_a '0'
config dhcp 'lan'
option interface 'lan'
option start '100'
option limit '150'
option leasetime '12h'
option dhcpv4 'server'
option dhcpv6 'server'
option ra 'server'
option ra_default '1'
option ra_slaac '1'
list ra_flags 'other-config'
option ra_maxinterval '60'
option ra_mininterval '20'
option ra_lifetime '1800'
config dhcp 'wan'
option interface 'wan'
option ignore '1'
config odhcpd 'odhcpd'
option maindhcp '0'
option leasefile '/tmp/hosts/odhcpd'
option leasetrigger '/usr/sbin/odhcpd-update'
option loglevel '4'
option piofolder '/tmp/odhcpd-piofolder'
root@OpenWrt:~# cat /etc/config/firewall
config defaults
option input 'REJECT'
option output 'ACCEPT'
option forward 'REJECT'
option synflood_protect '1'
option flow_offloading '1'
option flow_offloading_hw '1'
config zone
option name 'lan'
list network 'lan'
option input 'ACCEPT'
option output 'ACCEPT'
option forward 'ACCEPT'
config zone
option name 'wan'
list network 'wan'
list network 'wan6'
option input 'REJECT'
option output 'ACCEPT'
option forward 'REJECT'
option masq '1'
option mtu_fix '1'
config forwarding
option src 'lan'
option dest 'wan'
config rule
option name 'Allow-DHCP-Renew'
option src 'wan'
option proto 'udp'
option dest_port '68'
option target 'ACCEPT'
option family 'ipv4'
config rule
option name 'Allow-Ping'
option src 'wan'
option proto 'icmp'
option icmp_type 'echo-request'
option family 'ipv4'
option target 'ACCEPT'
config rule
option name 'Allow-IGMP'
option src 'wan'
option proto 'igmp'
option family 'ipv4'
option target 'ACCEPT'
config rule
option name 'Allow-DHCPv6'
option src 'wan'
option proto 'udp'
option dest_port '546'
option family 'ipv6'
option target 'ACCEPT'
config rule
option name 'Allow-MLD'
option src 'wan'
option proto 'icmp'
option src_ip 'fe80::/10'
list icmp_type '130/0'
list icmp_type '131/0'
list icmp_type '132/0'
list icmp_type '143/0'
option family 'ipv6'
option target 'ACCEPT'
config rule
option name 'Allow-ICMPv6-Input'
option src 'wan'
option proto 'icmp'
list icmp_type 'echo-request'
list icmp_type 'echo-reply'
list icmp_type 'destination-unreachable'
list icmp_type 'packet-too-big'
list icmp_type 'time-exceeded'
list icmp_type 'bad-header'
list icmp_type 'unknown-header-type'
list icmp_type 'router-solicitation'
list icmp_type 'neighbour-solicitation'
list icmp_type 'router-advertisement'
list icmp_type 'neighbour-advertisement'
option limit '1000/sec'
option family 'ipv6'
option target 'ACCEPT'
config rule
option name 'Allow-ICMPv6-Forward'
option src 'wan'
option dest '*'
option proto 'icmp'
list icmp_type 'echo-request'
list icmp_type 'echo-reply'
list icmp_type 'destination-unreachable'
list icmp_type 'packet-too-big'
list icmp_type 'time-exceeded'
list icmp_type 'bad-header'
list icmp_type 'unknown-header-type'
option limit '1000/sec'
option family 'ipv6'
option target 'ACCEPT'
config rule
option name 'Allow-IPSec-ESP'
option src 'wan'
option dest 'lan'
option proto 'esp'
option target 'ACCEPT'
config rule
option name 'Allow-ISAKMP'
option src 'wan'
option dest 'lan'
option dest_port '500'
option proto 'udp'
option target 'ACCEPT'
Try reqprefix "auto" or 64 , otherwise all config is as default as it can be.
Try reqprefix ‘auto’
Starlink provisions a single /64 prefix for WAN via SLAAC by default. DHCPv6-PD support is available but limited to smaller delegations than /48 or /56 (often /62 or /60) when requested.
/56 is maximum....
I set reqprefix to "auto".
I remembered Gemini and asked it for solutions to this.
It gave me some recommendations, which I applied to the router.
So far, after the changes, IPv6 hasn't dropped, and the internet remains stable. It seems to have solved the problem.
Here is what was suggested:
Remove list ra_flags 'managed-config'
This line activated the "M Flag." It forces devices to request an IP via DHCPv6. Android does not support this. If this line remained, your Android phones would see the IPv6 network but wouldn't be able to obtain an address, or they would connect and disconnect endlessly.
ADDED LINE: option ra_slaac '1'
Reason: Forces the SLAAC (Stateless Address Auto-Configuration) method. It is the opposite of the line above. This tells the device: "Here is the network prefix; create your own final IP automatically." This is mandatory for Android and IoT devices.
ADDED LINE: option ra_default '1'
Reason: Makes OpenWrt the ultimate authority for the route. Without this, if Starlink took too long to respond on the WAN port, OpenWrt would stop announcing itself as the Gateway on the LAN port. With "1", it says: "I am the default gateway, trust me always," even if the internet fluctuates.
"Fine-Tuning" Changes (Specifically for Starlink)
ADDED LINE: option ra_maxinterval '60'
Reason: Reduces the router's maximum silence time. The default is too long (up to 10 min). With 60, we ensure that at most every minute, the router shouts "I'm alive" to the network.
ADDED LINE: option ra_mininterval '20'
Reason: Sets the minimum frequency. Together with the line above, this creates an "aggressive" announcement behavior, recovering lost connections much faster.
ADDED LINE: option ra_lifetime '1800'
Reason: Sets the "route validity" to 30 minutes (1800 seconds). This masks Starlink's micro-outages. If the dish signal fails for 1 minute, the phone won't drop the IPv6 connection because it knows the route is valid for 30 minutes.
Now, yes. Depends on how long you’ve been subscriber. I still get my /56.
That’s likely based on what the AI knows (No reference to Prefix Delegation).
You will end up with a single /64. If you’re happy with that, that’s fine. Given that Starlink does offer PD, you can likely add additional IPv6 subnets by using instead :
config interface 'wan6'
option device 'wan'
option proto 'dhcpv6'
option reqaddress 'try'
option reqprefix 'auto'
option norelease '1'
Just reset OpenWrt to config defaults, throw away all your chatbots and it will work.
Show any log entries if anything is failing.
Mini gives /64 on cheapest option....
In my case, I didn't make any custom configurations at all.
The default OpenWRT configuration doesn't work with the Starlink Mini in bypass mode.
I started customizing it because it wasn't working as it should.
The problem is only with IPv6, which would disappear and then reappear.
And what is logged during "does not work" ?
That would have been a relevant distinction if you had initially mentioned you were using a Mini!
Hello, can you show me what your files look like? I also have the same problem with the Starlink Mini and I have not been able to solve it. I tried to apply the settings but my Android devices keep disconnecting.
From documentation sems you need masq6
This is not a Starlink problem, it is a Android problem.
There are numerous "fixups" that can help with this, but these seem to depend on the actual version of Android in use.
The only guaranteed solution is to use nat66. Performance wise, you will not even notice.
Your user devices will just not have a global/public ipv6 - but who uses that anyway, particularly with a Starlink Mini and mobile devices?
The wan6 section of your network config should look something like:
config interface 'wan6'
option device 'wan'
option proto 'dhcpv6'
option reqprefix 'no'
option delegate '0'
The lan section of the dhcp config would look something like this:
config dhcp 'lan'
option interface 'lan'
option start '100'
option limit '150'
option leasetime '12h'
option dhcpv4 'server'
option dhcpv6 'server'
option ra 'server'
option ra_slaac '1'
list ra_flags 'managed-config'
list ra_flags 'other-config'
option ra_lifetime '3600'
option ra_mininterval '20'
option ra_maxinterval '60'
option ra_default '2'
And the wan zone of the firewall config would look something like this:
config zone
option name 'wan'
list network 'wan'
list network 'wan6'
option input 'REJECT'
option output 'ACCEPT'
option forward 'REJECT'
option masq '1'
option mtu_fix '1'
option masq6 '1'
As @brada4 says, you need "masq6"
Maybe needs a line in https://openwrt.org/docs/guide-user/network/wan/isp-configurations
It is kind of confusing, because full size device works on the spot.
Masq6 is in 3rd tab in wan firewall zone config in luci, called ipv6 masquerade or so.
Google knows better how ipv6 is supposed to work.... or so they insist.
Eeeww. Give me uci commands any day
![]()