summaryrefslogtreecommitdiffstats
path: root/roles/gateway
AgeCommit message (Collapse)AuthorFilesLines
2 daysDisable ipv6 completely and remove related codeAhmed Abdelhalim8-149/+0
Co-Authored-By: Claude.ai
2026-07-10Fix linting and testing gateway with dummy interfaceAhmed Abdelhalim1-1/+1
2026-07-09Fix IPv6 first-request failure caused by ICMPv6 RedirectsAhmed Abdelhalim2-12/+52
Root cause: Pi, the ISP router (FritzBox), and LAN clients share the same L2 segment. When Pi forwards a client's IPv6 packet to an external GUA destination, the Linux kernel detects that the ISP router is a "better" next-hop on the same link and sends an ICMPv6 Redirect (type 137) to the client. The client obeys the redirect and sends its first SYN to the ISP router directly — Pi never forwards the original packet. The ISP router applies per-device content filtering to the unmasqueraded client GUA and issues a RST. This produced the symptom of the first IPv6 request failing with "Connection reset by peer" every ~30-60 seconds (matching the FritzBox RA interval, after which clients re-resolve their default gateway). Diagnosis method: tcpdump with MAC addresses (-e flag) on Pi's end0 caught the ICMPv6 Redirect being sent immediately after the first SYN arrived. Inserting a DROP rule for icmpv6-type redirect at position 1 in ip6tables OUTPUT confirmed the fix — 0 failures across extended testing. Fix: - Drop ICMPv6 Redirect (type 137) in ip6tables OUTPUT as the first rule, before the ACCEPT rule, in both direct and VPN modes - Flush ip6tables OUTPUT chain on clear_rules() instead of per-rule -D deletion, which was fragile and left stale rules accumulating across mode switches (previously caused duplicate/conflicting OUTPUT rules) - Flush ip6tables nat POSTROUTING table instead of per-rule -D deletion for the same reason Also documents the ICMPv6 Redirect issue and IPv6 masquerade rationale in roles/gateway/README.md for future reference. Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
2026-07-09Fix IPv6 direct mode routing for LAN clientsAhmed Abdelhalim1-2/+2
- Remove static network_ipv6_gateway from LAN hosts so they pick up Pi's radvd RA (pref high) instead of FritzBox (pref low) - Add missing ip6tables FORWARD ACCEPT rule for new connections in direct mode (only ESTABLISHED was present, blocking new flows) - Flush ip6tables nat POSTROUTING table on clear instead of fragile per-rule -D deletion to prevent stale rule accumulation
2026-07-08Route IPv6 through WireGuard VPN via radvd and static gatewayAhmed Abdelhalim2-18/+19
Add radvd to gateway role to advertise Pi as high-preference IPv6 default router using the stable ULA prefix (fd1e:.../64). With FritzBox also sending RAs, devices end up with ECMP between Pi and FritzBox. To solve this, add network_ipv6_gateway (Pi's link-local) as a static route with metric 100 to all managed hosts — beats RA metric 425, ensuring all IPv6 default traffic goes through Pi. Fix IPv6 MASQUERADE in gateway-apply-rules: - Direct mode: add MASQUERADE on end0 (LAN devices use ULA source addresses not known to FritzBox, so Pi must NAT them) - FORWARD rules: restrict to RELATED,ESTABLISHED only — previously the broad ACCEPT rule passed un-NAT'd packets alongside masqueraded copies, causing duplicate SYNs, conntrack corruption, and RSTs - MASQUERADE/clear rules: match by interface not by source subnet (devices may use any source address, not just the ULA prefix) - VPN mode return traffic: explicitly restrict to wg+→end0 direction Add network_ipv6_gateway var (optional) to network role NM templates (ethernet, wifi, bridge) — injects a static IPv6 default route at metric 100 when set. Add rpi5 static route to FritzBox link-local so Pi keeps IPv6 after FritzBox RA is disabled. Force SSH to IPv4 for *.local hosts (AddressFamily inet) — prevents Ansible from hanging on mDNS returning multiple IPv6 addresses. Update gateway and pihole READMEs with two-step IPv6 setup process. Co-Authored-By: Claude.ai
2026-07-08Refactor network roleAhmed Abdelhalim1-3/+1
Remove static IPv6 support from network role — all hosts use SLAAC (method=auto). Simplifies NM templates, argument_specs, and resolved.conf. gateway sysctl accept_ra=2 is now unconditional when gateway_enabled. Co-authored-by: Claude.ai
2026-07-08Implement a working ipv6 on gatewayAhmed Abdelhalim4-3/+58
2026-07-08Revert 524d62e changes on gateway roleAhmed Abdelhalim4-73/+5
2026-07-07Enable ipv6 on the rpiAhmed Abdelhalim1-1/+1
2026-07-03Attempt to enable ipv6 on the network but doesn't work stable enoughAhmed Abdelhalim4-6/+74
2026-07-01Update the README for gateway and pihole setup with details about ipv6Ahmed Abdelhalim1-0/+17
2026-07-01Allow router advertisement on gateway interfacesAhmed Abdelhalim1-0/+3
2026-06-18Fix testing of gateway role to read specific file instead of systemAhmed Abdelhalim1-1/+1
2026-06-14Fix gateway role after rpi os updateAhmed Abdelhalim3-11/+13
2026-03-04Remove duplicate fields from argument_specs filesAhmed Abdelhalim1-2/+0
2026-01-29Add ipv6 support to gateway VPN roleAhmed Abdelhalim3-7/+33
After finding issues that vpn ip6 wasn't working reliably (which was obvious over VPN) Needed to add the VPN routing table support (similar to ipv4) This together with disabling ssh (for github and sr.ht) over ipv6 makes the vpn reliable again Will test and see, since I saw that the archlinux machine wasn't working properly over the vpn, but it could be due to the VPN ipv6 wasn't resolving.
2025-12-16Remove company from the roles metaAhmed Abdelhalim1-1/+0
2025-11-19Update docs about the usage of gateway-init serviceAhmed Abdelhalim1-0/+4
2025-11-19Fix gateway direct-mode not triggering on VPN disconnectAhmed Abdelhalim1-1/+1
The gateway-direct-mode.service was never triggering when WireGuard interfaces were removed, leaving VPN iptables rules active even when VPN was disconnected. This caused internet connectivity to fail in direct mode. Root cause: SYSTEMD_WANTS in udev rules only works for ACTION=="add" events. When a device is removed, the device unit is already gone before systemd can process the SYSTEMD_WANTS dependency, so the service never starts. This is a documented systemd limitation. Fix: Replace SYSTEMD_WANTS with RUN+ for the remove action, which executes systemctl directly during udev event processing without requiring a device unit to exist. References: - https://stackoverflow.com/questions/72208534/why-does-systemd-wants-not-pass-a-parameter-to-a-service-file-from-a-udev-remov - https://stackoverflow.com/questions/73148448/how-to-start-systemd-user-service-when-device-is-removed-and-stop-it-when-devic - https://bugzilla.redhat.com/show_bug.cgi?id=871074https://bugzilla.redhat.com/show_bug.cgi?id=871074 - https://unix.stackexchange.com/questions/528803/systemd-doesnt-stop-the-service-when-the-device-is-removed The VPN mode (ACTION=="add") continues to use SYSTEMD_WANTS as it works correctly for device addition events.
2025-09-23Use static values for defaults instead of ansible varsAhmed Abdelhalim2-2/+2
The ansible vars fail on CI because the validate arguments task runs way before the setting of the variables, which causes the ansible undefined vars on CI to cause errors. This is a way better approach of having the static values as defaults and allowing setting the variables to ansible vars in the host/group vars
2025-09-12Fix the testing of gateway role in containers/CIAhmed Abdelhalim2-2/+3
2025-09-12Implement the gateway role (replacing old wireguard-gateway)Ahmed Abdelhalim11-0/+364
2025-09-03Revert "Refactor: rename wireguard_gateway to gateway"Ahmed Abdelhalim6-248/+0
This reverts commit fdd0b5b58f0ebd39ad05e2dcb17faa6603145f97.
2025-09-03Revert "Experimental: adding iptables persistence through reboots"Ahmed Abdelhalim2-48/+1
This reverts commit 025abf3ce9497f51d21b14aa31907c0c3bd75ecf.
2025-09-03Experimental: adding iptables persistence through rebootsAhmed Abdelhalim2-1/+48
2025-09-03Refactor: rename wireguard_gateway to gatewayAhmed Abdelhalim6-0/+248
As the role now functions as a gateway and not just a wireguard gateway it's better name for clarity