summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAhmed AbdelHalim <[email protected]>2026-07-08 03:15:11 +0200
committerAhmed AbdelHalim <[email protected]>2026-07-08 03:15:11 +0200
commitdb1d359a33d2871b57ca850c8943cc123d24e1f5 (patch)
treeb17b2b27eb8757f510f4daa2b45562b28a932061
parentf97653c1700466ad2d0bc1e3f63bfa4937c63305 (diff)
Implement a working ipv6 on gateway
-rw-r--r--roles/gateway/handlers/main.yml6
-rw-r--r--roles/gateway/tasks/main.yml37
-rw-r--r--roles/gateway/templates/gateway-apply-rules.sh.j26
-rw-r--r--roles/gateway/templates/radvd.conf.j212
4 files changed, 58 insertions, 3 deletions
diff --git a/roles/gateway/handlers/main.yml b/roles/gateway/handlers/main.yml
index 35cc489c..2220f965 100644
--- a/roles/gateway/handlers/main.yml
+++ b/roles/gateway/handlers/main.yml
@@ -15,3 +15,9 @@
ansible.builtin.command:
cmd: "udevadm control --reload-rules"
changed_when: false
+
+- name: "Restart radvd"
+ become: true
+ ansible.builtin.systemd_service:
+ name: "radvd.service"
+ state: "restarted"
diff --git a/roles/gateway/tasks/main.yml b/roles/gateway/tasks/main.yml
index 661630f7..71484725 100644
--- a/roles/gateway/tasks/main.yml
+++ b/roles/gateway/tasks/main.yml
@@ -6,6 +6,7 @@
- "iptables"
- "iproute2"
- "udev"
+ - "radvd"
state: "present"
- name: "Configure IP forwarding"
@@ -67,3 +68,39 @@
name: "gateway-init.service"
enabled: "{{ gateway_enabled }}"
daemon_reload: true
+
+- name: "Configure radvd for IPv6 RA"
+ become: true
+ when: gateway_enabled and gateway_local_ipv6_subnet != ""
+ block:
+ - name: "Deploy radvd config"
+ ansible.builtin.template:
+ src: "radvd.conf.j2"
+ dest: "/etc/radvd.conf"
+ owner: "root"
+ group: "root"
+ mode: "0644"
+ notify: "Restart radvd"
+
+ - name: "Enable radvd service"
+ ansible.builtin.systemd_service:
+ name: "radvd.service"
+ enabled: true
+ state: "started"
+ daemon_reload: true
+
+- name: "Disable radvd when no IPv6 subnet configured"
+ become: true
+ when: not gateway_enabled or gateway_local_ipv6_subnet == ""
+ block:
+ - name: "Stop and disable radvd"
+ ansible.builtin.systemd_service:
+ name: "radvd.service"
+ enabled: false
+ state: "stopped"
+ failed_when: false
+
+ - name: "Remove radvd config"
+ ansible.builtin.file:
+ path: "/etc/radvd.conf"
+ state: "absent"
diff --git a/roles/gateway/templates/gateway-apply-rules.sh.j2 b/roles/gateway/templates/gateway-apply-rules.sh.j2
index 715f6b34..0ce9f740 100644
--- a/roles/gateway/templates/gateway-apply-rules.sh.j2
+++ b/roles/gateway/templates/gateway-apply-rules.sh.j2
@@ -42,9 +42,9 @@ apply_vpn_mode() {
iptables -A FORWARD -s "$GATEWAY_SUBNET_V4" -o wg+ -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
if [ -n "$GATEWAY_SUBNET_V6" ]; then
- ip6tables -t nat -A POSTROUTING -s "$GATEWAY_SUBNET_V6" -o wg+ -j MASQUERADE
+ ip6tables -t nat -A POSTROUTING -o wg+ -j MASQUERADE
ip6tables -A OUTPUT -o wg+ -j ACCEPT
- ip6tables -A FORWARD -s "$GATEWAY_SUBNET_V6" -o wg+ -j ACCEPT
+ ip6tables -A FORWARD -i "$GATEWAY_INTERFACE" -o wg+ -j ACCEPT
ip6tables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
fi
log_message "VPN mode rules applied - traffic routed through VPN"
@@ -59,7 +59,7 @@ apply_direct_rules() {
if [ -n "$GATEWAY_SUBNET_V6" ]; then
# No MASQUERADE for IPv6: LAN devices have public SLAAC addresses, native routing applies
ip6tables -A OUTPUT -o "$GATEWAY_INTERFACE" -j ACCEPT
- ip6tables -A FORWARD -s "$GATEWAY_SUBNET_V6" -o "$GATEWAY_INTERFACE" -j ACCEPT
+ ip6tables -A FORWARD -i "$GATEWAY_INTERFACE" -o "$GATEWAY_INTERFACE" -j ACCEPT
ip6tables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
fi
log_message "Direct mode rules applied - normal routing active"
diff --git a/roles/gateway/templates/radvd.conf.j2 b/roles/gateway/templates/radvd.conf.j2
new file mode 100644
index 00000000..49b3047d
--- /dev/null
+++ b/roles/gateway/templates/radvd.conf.j2
@@ -0,0 +1,12 @@
+interface {{ gateway_router_interface }} {
+ AdvSendAdvert on;
+ AdvManagedFlag off;
+ AdvOtherConfigFlag on;
+ AdvDefaultPreference high;
+
+ prefix {{ gateway_local_ipv6_subnet }} {
+ AdvOnLink on;
+ AdvAutonomous on;
+ AdvRouterAddr on;
+ };
+};