Murat ÖZDEMİR 36862c86a5 feat(wireguard): allow WireGuard UDP port globally via firewalld
Removes the IP-based firewall rich rule that restricted WireGuard UDP
access to specific admin CIDRs. This change configures firewalld to allow
the WireGuard port globally, relying on WireGuard's internal cryptographic
key authentication for access control.
2026-07-10 13:54:59 +03:00

176 lines
6.3 KiB
YAML

---
- name: Install WireGuard
ansible.builtin.dnf:
name: wireguard-tools
state: present
- name: Ensure /etc/wireguard directory exists
ansible.builtin.file:
path: /etc/wireguard
state: directory
mode: "0700"
owner: root
group: root
- name: Check if WireGuard private key exists
ansible.builtin.stat:
path: /etc/wireguard/private.key
register: wg_key_stat
- name: Generate WireGuard keypair
ansible.builtin.shell: |
wg genkey | tee /etc/wireguard/private.key | wg pubkey > /etc/wireguard/public.key
chmod 600 /etc/wireguard/private.key
chmod 644 /etc/wireguard/public.key
when: not wg_key_stat.stat.exists
- name: Read WireGuard private key
ansible.builtin.slurp:
src: /etc/wireguard/private.key
register: wg_private_key_raw
- name: Read WireGuard public key
ansible.builtin.slurp:
src: /etc/wireguard/public.key
register: wg_public_key_raw
- name: Set WireGuard key facts
ansible.builtin.set_fact:
wg_server_private_key: "{{ wg_private_key_raw.content | b64decode | trim }}"
wg_server_public_key: "{{ wg_public_key_raw.content | b64decode | trim }}"
- name: Deploy wg0.conf
ansible.builtin.template:
src: wg0.conf.j2
dest: "/etc/wireguard/{{ wireguard_interface }}.conf"
mode: "0600"
owner: root
group: root
notify: restart wireguard
- name: Enable and start WireGuard
ansible.builtin.systemd:
name: "wg-quick@{{ wireguard_interface }}"
enabled: true
state: started
daemon_reload: true
- name: Remove old WireGuard UDP port rich rules from admin CIDRs
ansible.posix.firewalld:
rich_rule: >-
rule family="ipv4" source address="{{ item }}"
port port="{{ wireguard_port }}" protocol="udp" accept
zone: drop
state: disabled
permanent: true
immediate: true
loop: "{{ admin_allowed_cidrs.split(' ') }}"
- name: Allow WireGuard UDP port globally (auth via crypt key)
ansible.posix.firewalld:
port: "{{ wireguard_port }}/udp"
zone: drop
state: enabled
permanent: true
immediate: true
- name: Allow DB ports from WireGuard subnet only
ansible.posix.firewalld:
rich_rule: >-
rule family="ipv4" source address="{{ wireguard_subnet }}"
port port="{{ item }}" protocol="tcp" accept
zone: drop
state: enabled
permanent: true
immediate: true
loop:
- "{{ wireguard_db_pg_proxy_port }}"
- "{{ wireguard_db_mongo_proxy_port }}"
- name: Print server public key (client config için gerekli)
ansible.builtin.debug:
msg: "WireGuard server public key: {{ wg_server_public_key }}"
- name: Enable IP forwarding (persistent)
ansible.posix.sysctl:
name: net.ipv4.ip_forward
value: '1'
sysctl_file: /etc/sysctl.d/99-wireguard.conf
state: present
reload: yes
when: wireguard_enable_routing
- name: Bind WireGuard interface to drop zone permanently
ansible.builtin.command: firewall-cmd --permanent --zone=drop --add-interface={{ wireguard_interface }}
register: _wg_zone
failed_when: _wg_zone.rc != 0 and 'ALREADY_ENABLED' not in _wg_zone.stderr
changed_when: _wg_zone.rc == 0
- name: Bind routed interface to drop zone permanently
ansible.builtin.command: firewall-cmd --permanent --zone=drop --add-interface={{ wireguard_routed_interface | default('eth1') }}
register: _eth1_zone
failed_when: _eth1_zone.rc != 0 and 'ALREADY_ENABLED' not in _eth1_zone.stderr
changed_when: _eth1_zone.rc == 0
when: wireguard_enable_routing and wireguard_routed_subnet != ""
- name: Create firewalld policy for WireGuard routing
ansible.builtin.command: firewall-cmd --permanent --new-policy=wg-to-db
register: _policy_create
failed_when: _policy_create.rc != 0 and 'NAME_CONFLICT' not in _policy_create.stderr and 'already exists' not in _policy_create.stderr
changed_when: _policy_create.rc == 0
when: wireguard_enable_routing
- name: Set policy ingress zone
ansible.builtin.command: firewall-cmd --permanent --policy=wg-to-db --add-ingress-zone=drop
register: _ingress
failed_when: _ingress.rc != 0 and 'already' not in _ingress.stderr | lower
changed_when: _ingress.rc == 0
when: wireguard_enable_routing
- name: Set policy egress zone
ansible.builtin.command: firewall-cmd --permanent --policy=wg-to-db --add-egress-zone=drop
register: _egress
failed_when: _egress.rc != 0 and 'already' not in _egress.stderr | lower
changed_when: _egress.rc == 0
when: wireguard_enable_routing
- name: Add forward rule to policy (WG subnet to DB subnet only)
ansible.builtin.command: >
firewall-cmd --permanent --policy=wg-to-db
--add-rich-rule='rule family="ipv4" source address="{{ wireguard_subnet }}"
destination address="{{ wireguard_routed_subnet }}" accept'
register: _fwd_rule
failed_when: _fwd_rule.rc != 0 and 'already' not in _fwd_rule.stderr | lower
changed_when: _fwd_rule.rc == 0
when: wireguard_enable_routing and wireguard_routed_subnet != ""
- name: Enable masquerade on policy
ansible.builtin.command: firewall-cmd --permanent --policy=wg-to-db --add-masquerade
register: _masq
failed_when: _masq.rc != 0 and 'already' not in _masq.stderr | lower
changed_when: _masq.rc == 0
when: wireguard_enable_routing
- name: Add direct firewalld rule to allow wg0 to eth1 forwarding in iptables (Docker fix)
ansible.builtin.command: >
firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -i {{ wireguard_interface }} -o {{ wireguard_routed_interface | default('eth1') }} -j ACCEPT
register: _fw_dir_fwd
failed_when: _fw_dir_fwd.rc != 0 and 'ALREADY_ENABLED' not in _fw_dir_fwd.stderr
changed_when: _fw_dir_fwd.rc == 0
when: wireguard_enable_routing and wireguard_routed_subnet != ""
notify: restart wireguard
- name: Add direct firewalld rule to allow eth1 to wg0 forwarding in iptables (Docker fix)
ansible.builtin.command: >
firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -i {{ wireguard_routed_interface | default('eth1') }} -o {{ wireguard_interface }} -j ACCEPT
register: _fw_dir_rev
failed_when: _fw_dir_rev.rc != 0 and 'ALREADY_ENABLED' not in _fw_dir_rev.stderr
changed_when: _fw_dir_rev.rc == 0
when: wireguard_enable_routing and wireguard_routed_subnet != ""
notify: restart wireguard
- name: Reload firewalld to activate routing policy
ansible.builtin.command: firewall-cmd --reload
changed_when: false
when: wireguard_enable_routing