Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 32 additions & 7 deletions roles/prereq/tasks/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
reload: true
when: ansible_facts['all_ipv6_addresses'] | length > 0

- name: Handle modern nftables/iptables-nft stack (Arch Linux ARM 6.18+)
- name: Handle modern nftables/iptables-nft stack (Arch Linux 6.18+)
when:
- ansible_facts['distribution'] == 'Archlinux'
- ansible_facts['kernel'] is version('6.18', '>=')
Expand All @@ -48,7 +48,6 @@
force: true
when:
- "'iptables' in ansible_facts.packages"
- "'iptables-nft' not in ansible_facts.packages"

- name: Install iptables-nft and nftables
community.general.pacman:
Expand All @@ -57,11 +56,37 @@
- nftables
state: present

- name: Ensure nftables is enabled and started
ansible.builtin.systemd:
name: nftables
state: started
enabled: true
- name: Check nftables service
ansible.builtin.service_facts:

- name: Configure nftables include and K3s rules fragment
when:
- ansible_facts.services['nftables.service'] is defined
- ansible_facts.services['nftables.service'].status == 'enabled'
block:
- name: Ensure nftables include directory exists
ansible.builtin.file:
path: /etc/nftables.d
state: directory
mode: "0755"

- name: Ensure nftables loads /etc/nftables.d rules
ansible.builtin.lineinfile:
path: /etc/nftables.conf
regexp: '^include "/etc/nftables\\.d/\\*\\.nft"$'
line: 'include "/etc/nftables.d/*.nft"'
insertafter: EOF

- name: Install K3s nftables rules fragment
ansible.builtin.template:
src: k3s.nft.j2
dest: /etc/nftables.d/k3s.nft
mode: "0644"

- name: Reload nftables
ansible.builtin.service:
name: nftables
state: reloaded

- name: Populate service facts
ansible.builtin.service_facts:
Expand Down
31 changes: 31 additions & 0 deletions roles/prereq/templates/k3s.nft.j2
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# K3s rules managed by ansible-k3s; loaded via /etc/nftables.conf include

# Allow inter-node communication (server + agent nodes)
{% for host in (groups[server_group] | default([]) + groups[agent_group] | default([])) | unique %}
{% if hostvars[host].ansible_default_ipv4 is defined %}
insert rule inet filter input ip saddr {{ hostvars[host].ansible_default_ipv4.address }} accept
{% endif %}
{% endfor %}

# K3s core ports
insert rule inet filter input tcp dport {{ api_port | default(6443) }} accept
{% if groups[server_group] | length > 1 %}
insert rule inet filter input tcp dport 2379-2381 accept
{% endif %}

# Inter-node overlay ports
insert rule inet filter input tcp dport { 5001, 10250 } accept
insert rule inet filter input udp dport { 8472, 51820, 51821 } accept

# Cluster and service CIDRs
{% for cidr in (cluster_cidr + ',' + service_cidr) | split(',') %}
insert rule inet filter input ip saddr {{ cidr }} accept
{% endfor %}

# NodePort range
insert rule inet filter input tcp dport 30000-32767 accept
insert rule inet filter input udp dport 30000-32767 accept

# Keep forward traffic open for CNI/pod networking
insert rule inet filter forward ct state established,related accept
insert rule inet filter forward accept