net1 (macvlan on v30iot) carries mDNS only. Firmware traffic stays on eth0.
Cause (captured)
Captured with cilium-dbg monitor --related-to 1708 on k8s-1 while edge-1 (fd02:30::…cebc) requested http://[fd99::8a]/:
The SYN reaches the pod on [fd10:244::7f67]:8082, and the policy verdict is allow.
The pod sends no reply via eth0. The pod's per-interface IPv6 counters for the request: eth0 in +12, out +0; net1 out +8.
In the pod's IPv6 table, net1 holds on-link routes for fd02:30::/64 and 2003:d6:970a:4901::/64, plus a default route from Router Advertisements. sbr only confines IPv4. Separately, [::]:8082 also listened on net1.
Change
shelly-manager-iot attachment: add the tuning plugin with net.ipv6.conf.IFNAME.accept_ra=0 and autoconf=0. This is the same plugin and placeholder matter-server-iot uses. net1 keeps its link-local address for mDNS.
Deployment:
POD_IPS from status.podIPs. shelly-manager binds 8080, 8082 and 9090 to exactly these addresses (konairius/shelly-manager branch firmware-no-macvlan).
ASPNETCORE_URLS goes back to the pod IPv4 for all three ports, for images that do not read POD_IPS.
A pod-template annotation so the pod restarts with the new attachment.
Tested
kubectl apply --dry-run=server accepts the attachment and the Deployment, including the status.podIPs env field.
net1 (macvlan on v30iot) carries mDNS only. Firmware traffic stays on eth0.
## Cause (captured)
Captured with `cilium-dbg monitor --related-to 1708` on k8s-1 while edge-1 (`fd02:30::…cebc`) requested `http://[fd99::8a]/`:
- The SYN reaches the pod on `[fd10:244::7f67]:8082`, and the policy verdict is allow.
- The pod sends no reply via eth0. The pod's per-interface IPv6 counters for the request: eth0 in +12, out +0; net1 out +8.
In the pod's IPv6 table, net1 holds on-link routes for `fd02:30::/64` and `2003:d6:970a:4901::/64`, plus a default route from Router Advertisements. `sbr` only confines IPv4. Separately, `[::]:8082` also listened on net1.
## Change
- `shelly-manager-iot` attachment: add the `tuning` plugin with `net.ipv6.conf.IFNAME.accept_ra=0` and `autoconf=0`. This is the same plugin and placeholder `matter-server-iot` uses. net1 keeps its link-local address for mDNS.
- Deployment:
- `POD_IPS` from `status.podIPs`. shelly-manager binds 8080, 8082 and 9090 to exactly these addresses (konairius/shelly-manager branch `firmware-no-macvlan`).
- `ASPNETCORE_URLS` goes back to the pod IPv4 for all three ports, for images that do not read `POD_IPS`.
- A pod-template annotation so the pod restarts with the new attachment.
## Tested
- `kubectl apply --dry-run=server` accepts the attachment and the Deployment, including the `status.podIPs` env field.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Captured on k8s-1 (cilium-dbg monitor, endpoint 1708): an IPv6 SYN from
edge-1 (fd02:30::/64) to fd99::8a reached the pod on 8082, but no reply
left via eth0; the pod has on-link and default IPv6 routes on net1 from
RAs. sbr only confines IPv4. Turn RA processing off on net1 with the
tuning plugin (as matter-server already uses it) and roll the pod.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
claude-bot
changed title from fix(shelly-manager): no IPv6 router advertisements on the IoT NIC to fix(shelly-manager): keep firmware traffic off the IoT macvlan2026-10-28 15:44:17 +00:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
net1 (macvlan on v30iot) carries mDNS only. Firmware traffic stays on eth0.
Cause (captured)
Captured with
cilium-dbg monitor --related-to 1708on k8s-1 while edge-1 (fd02:30::…cebc) requestedhttp://[fd99::8a]/:[fd10:244::7f67]:8082, and the policy verdict is allow.In the pod's IPv6 table, net1 holds on-link routes for
fd02:30::/64and2003:d6:970a:4901::/64, plus a default route from Router Advertisements.sbronly confines IPv4. Separately,[::]:8082also listened on net1.Change
shelly-manager-iotattachment: add thetuningplugin withnet.ipv6.conf.IFNAME.accept_ra=0andautoconf=0. This is the same plugin and placeholdermatter-server-iotuses. net1 keeps its link-local address for mDNS.POD_IPSfromstatus.podIPs. shelly-manager binds 8080, 8082 and 9090 to exactly these addresses (konairius/shelly-manager branchfirmware-no-macvlan).ASPNETCORE_URLSgoes back to the pod IPv4 for all three ports, for images that do not readPOD_IPS.Tested
kubectl apply --dry-run=serveraccepts the attachment and the Deployment, including thestatus.podIPsenv field.🤖 Generated with Claude Code
fix(shelly-manager): no IPv6 router advertisements on the IoT NICto fix(shelly-manager): keep firmware traffic off the IoT macvlan