Skip to content
Draft
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
1 change: 1 addition & 0 deletions mkosi.images/buildernet/mkosi.conf
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ Packages=cryptsetup
haproxy
jq
nano-tiny
nftables
openssh-server
prometheus-node-exporter
rclone
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@ disable ssh.*
disable systemd-pcrphase.service
disable systemd-pcrphase-initrd.service
disable systemd-pcrphase-sysinit.service
enable nftables-load.service
enable ntpd-rs-metrics.service
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
[Unit]
Description=Load nftables ruleset
Wants=render-config.service
After=render-config.service
Before=haproxy.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/sbin/nft -f /etc/nftables/ruleset.nft
ExecReload=/usr/sbin/nft -f /etc/nftables/ruleset.nft
ExecStop=/usr/sbin/nft delete table inet filter

[Install]
WantedBy=multi-user.target
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#!/usr/sbin/nft -f

table inet filter {
# Privileged source IPs (same list HAProxy uses). Members bypass all caps.
set privileged_ips {
type ipv4_addr
flags interval
elements = { {{#haproxy.rate_limit_privileged_ips}}{{.}}, {{/haproxy.rate_limit_privileged_ips}} }
}

# Per-source concurrent-connection counter.
set conn_count {
type ipv4_addr
size 131072
flags dynamic
}

# Per-source new-connection rate counter.
set conn_rate {
type ipv4_addr
size 131072
flags dynamic
timeout 1m
}

chain ingress {
type filter hook input priority filter; policy accept;

iif "lo" accept
ct state established,related accept
ct state invalid counter drop

meta l4proto != tcp accept
tcp dport != { 80, 443 } accept
ip saddr @privileged_ips accept
ct state new add @conn_count { ip saddr ct count over {{haproxy.rate_limit_total_conn_regular}} } counter drop
ct state new add @conn_rate { ip saddr limit rate over {{haproxy.nft_conn_rate_per_sec_regular}}/second burst {{haproxy.rate_limit_conn_rate_regular}} packets } counter drop
}
}