Skip to content

Commit 8b2a583

Browse files
committed
Do not enable nftables by default
Signed-off-by: Ionut <ionutnciocoiu@gmail.com>
1 parent e9e0978 commit 8b2a583

File tree

3 files changed

+64
-7
lines changed

3 files changed

+64
-7
lines changed

roles/prereq/handlers/main.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
- name: Reload nftables
3+
ansible.builtin.systemd:
4+
name: nftables
5+
state: reloaded

roles/prereq/tasks/main.yml

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
reload: true
3333
when: ansible_facts['all_ipv6_addresses'] | length > 0
3434

35-
- name: Handle modern nftables/iptables-nft stack (Arch Linux ARM 6.18+)
35+
- name: Handle modern nftables/iptables-nft stack (Arch Linux 6.18+)
3636
when:
3737
- ansible_facts['distribution'] == 'Archlinux'
3838
- ansible_facts['kernel'] is version('6.18', '>=')
@@ -48,7 +48,6 @@
4848
force: true
4949
when:
5050
- "'iptables' in ansible_facts.packages"
51-
- "'iptables-nft' not in ansible_facts.packages"
5251

5352
- name: Install iptables-nft and nftables
5453
community.general.pacman:
@@ -57,11 +56,33 @@
5756
- nftables
5857
state: present
5958

60-
- name: Ensure nftables is enabled and started
61-
ansible.builtin.systemd:
62-
name: nftables
63-
state: started
64-
enabled: true
59+
- name: Check nftables service
60+
ansible.builtin.service_facts:
61+
62+
- name: Configure nftables include and K3s rules fragment
63+
when:
64+
- ansible_facts.services['nftables.service'] is defined
65+
- ansible_facts.services['nftables.service'].status == 'enabled'
66+
block:
67+
- name: Ensure nftables include directory exists
68+
ansible.builtin.file:
69+
path: /etc/nftables.d
70+
state: directory
71+
mode: "0755"
72+
73+
- name: Ensure nftables loads /etc/nftables.d rules
74+
ansible.builtin.lineinfile:
75+
path: /etc/nftables.conf
76+
regexp: '^include "/etc/nftables\\.d/\\*\\.nft"$'
77+
line: 'include "/etc/nftables.d/*.nft"'
78+
insertafter: EOF
79+
80+
- name: Install K3s nftables rules fragment
81+
ansible.builtin.template:
82+
src: k3s.nft.j2
83+
dest: /etc/nftables.d/k3s.nft
84+
mode: "0644"
85+
notify: Reload nftables
6586

6687
- name: Populate service facts
6788
ansible.builtin.service_facts:

roles/prereq/templates/k3s.nft.j2

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# K3s rules managed by ansible-k3s; loaded via /etc/nftables.conf include
2+
3+
# Allow inter-node communication (server + agent nodes)
4+
{% for host in (groups[server_group] | default([]) + groups[agent_group] | default([])) | unique %}
5+
{% if hostvars[host].ansible_default_ipv4 is defined %}
6+
insert rule inet filter input ip saddr {{ hostvars[host].ansible_default_ipv4.address }} accept
7+
{% endif %}
8+
{% endfor %}
9+
10+
# K3s core ports
11+
insert rule inet filter input tcp dport {{ api_port | default(6443) }} accept
12+
{% if groups[server_group] | length > 1 %}
13+
insert rule inet filter input tcp dport 2379-2381 accept
14+
{% endif %}
15+
16+
# Inter-node overlay ports
17+
insert rule inet filter input tcp dport { 5001, 10250 } accept
18+
insert rule inet filter input udp dport { 8472, 51820, 51821 } accept
19+
20+
# Cluster and service CIDRs
21+
{% for cidr in (cluster_cidr + ',' + service_cidr) | split(',') %}
22+
insert rule inet filter input ip saddr {{ cidr }} accept
23+
{% endfor %}
24+
25+
# NodePort range
26+
insert rule inet filter input tcp dport 30000-32767 accept
27+
insert rule inet filter input udp dport 30000-32767 accept
28+
29+
# Keep forward traffic open for CNI/pod networking
30+
insert rule inet filter forward ct state established,related accept
31+
insert rule inet filter forward accept

0 commit comments

Comments
 (0)