Compare commits

..

2 Commits

Author SHA1 Message Date
Clément Désiles
3e469fa25e
fix: unbound interface naming 2025-12-24 17:09:22 +01:00
Clément Désiles
08364cf2c8
fix: unbound boot ordering 2025-12-24 16:47:38 +01:00
5 changed files with 45 additions and 22 deletions

View File

@ -18,6 +18,7 @@ This is a good playground to learn and I encourage you to adapt these roles to y
- Rootless Podman: Containers run as `{{ ansible_user }}` (daemonless, `sudo podman ps` shows nothing) - Rootless Podman: Containers run as `{{ ansible_user }}` (daemonless, `sudo podman ps` shows nothing)
- User systemd services: `systemctl --user status <service>` with lingering enabled - User systemd services: `systemctl --user status <service>` with lingering enabled
- Nginx reverse proxy for web services - Nginx reverse proxy for web services
- IP Freebind when available (e.g. unbound does not wait for wireguard to be up to start resolving DNS)
**Available Services:** **Available Services:**

View File

@ -19,6 +19,33 @@ network_interfaces:
ipv4: ipv4:
address: "{{ podman_gw_gateway }}/10" address: "{{ podman_gw_gateway }}/10"
# Unbound DNS resolver configuration
# ----------------------------------
# Interface IPs for binding
unbound_interface_lan: 192.168.1.2
unbound_interface_vpn: 192.168.20.4
# unbound LAN configuration
unbound_custom_lan_domain: "example.lan"
unbound_custom_lan_config_path: "{{ unbound_config_base_path }}/lan.conf"
unbound_custom_lan_records:
"server.example.lan":
v4: 192.168.1.2
aliases:
- "server"
# unbound VPN configuration
unbound_custom_vpn_config_path: "{{ unbound_config_base_path }}/vpn.conf"
unbound_custom_vpn_records:
"server.example.lan":
v4: 192.168.20.4
aliases:
- "server"
unbound_firewall_allowed_sources:
- { src: "192.168.1.0/24", comment: "DNS from LAN" }
- { src: "192.168.20.0/27", comment: "DNS from VPN" }
# NTP servers configuration # NTP servers configuration
# ------------------------- # -------------------------
ntp_pools: ntp_pools:

View File

@ -9,9 +9,14 @@ unbound_custom_vpn_config_path: "{{ unbound_config_base_path }}/vpn.conf"
unbound_custom_lan_domain: "example.lan" unbound_custom_lan_domain: "example.lan"
unbound_port: 53 unbound_port: 53
unbound_apparmor_profile_path: /etc/apparmor.d/usr.sbin.unbound unbound_apparmor_profile_path: /etc/apparmor.d/usr.sbin.unbound
unbound_interface_lan: 192.168.1.1
unbound_interface_vpn: 192.168.27.1
unbound_firewall_allowed_sources: unbound_firewall_allowed_sources:
- { src: "192.168.1.0/24", comment: "DNS from LAN" } - { src: "192.168.1.0/24", comment: "DNS from LAN" }
- { src: "192.168.27.0/27", comment: "DNS from VPN" } - { src: "192.168.27.0/27", comment: "DNS from VPN" }
unbound_custom_lan_records: unbound_custom_lan_records:
"example.lan": "example.lan":
v4: 192.168.1.2 v4: 192.168.1.2

View File

@ -151,23 +151,10 @@
- Check Unbound config syntax - Check Unbound config syntax
- Reload systemd and restart unbound - Reload systemd and restart unbound
- name: Make sure unbound starts after wg-quick@wg0 - name: Remove WireGuard dependency from unbound (using ip-freebind instead)
block:
- name: Ensure unbound.service.d directory exists
ansible.builtin.file: ansible.builtin.file:
path: /etc/systemd/system/unbound.service.d path: /etc/systemd/system/unbound.service.d
state: directory state: absent
mode: "0755"
- name: Configure unbound systemd service
ansible.builtin.copy:
dest: /etc/systemd/system/unbound.service.d/override.conf
content: |
[Unit]
After=wg-quick@wg0.service
Requires=wg-quick@wg0.service
# Make Unbound part of network-online.target (provides DNS)
Before=network-online.target
Wants=network-online.target
notify: Reload systemd and restart unbound notify: Reload systemd and restart unbound
- name: Enables unbound service - name: Enables unbound service

View File

@ -8,10 +8,13 @@ server:
# listening port # listening port
port: {{ unbound_port }} port: {{ unbound_port }}
# Define interfaces binds # Allow binding to IP addresses that don't exist yet (e.g., WireGuard at boot)
interface: lo ip-freebind: yes
interface: lan0
interface: wg0 # Define interface binds by IP address
interface: 127.0.0.1 # lo
interface: {{ unbound_interface_lan }} # lan0
interface: {{ unbound_interface_vpn }} # wg0
# Define access controls (note that ufw might be also configured) # Define access controls (note that ufw might be also configured)
access-control: 0.0.0.0/0 refuse access-control: 0.0.0.0/0 refuse