一个防火墙,不是两个
Debian 13 附带了 /etc/nftables.conf 的 nftables 和一个加载它的服务。AlmaLinux 10 在 nftables 之上附带了 firewalld,它的服务读取 /etc/sysconfig/nftables.conf 包含的内容。选择一个。让 firewalld 与手写的规则集一起运行会产生一个你们谁都没有写的规则集。
systemctl disable --now firewalld # AlmaLinux, if going manual
systemctl enable --now nftables规则集
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
set ssh_flood {
type ipv4_addr
flags dynamic, timeout
timeout 1h
}
chain input {
type filter hook input priority filter; policy drop;
ct state established,related accept
ct state invalid drop
iif lo accept
ip protocol icmp icmp type { echo-request, destination-unreachable, time-exceeded } accept
ip6 nexthdr ipv6-icmp accept
tcp dport 22 ct state new add @ssh_flood { ip saddr limit rate over 6/minute } drop
tcp dport 22 accept
tcp dport { 80, 443 } accept
udp dport 443 accept
counter comment "dropped by policy"
}
chain forward {
type filter hook forward priority filter; policy drop;
}
chain output {
type filter hook output priority filter; policy accept;
}
}人们容易出错的地方:
- ICMPv6 是有意全盘接受的。邻居发现和“数据包太大”都在其中,手工过滤它们会以应用程序错误的形式破坏 IPv6,持续一天半才暴露。
ssh_flood集合会将任何在一分钟内超过六个新连接的地址添加到一小时的超时列表中。没有日志解析器,没有 cron 任务,没有第二个守护进程。- 对于 IPv6,用
type ipv6_addr复制集合,用ip6 saddr复制规则。集合是单一地址族的。 udp dport 443是为 QUIC 而存在的。如果你不提供 QUIC,就删掉它。
在不锁定自己的情况下加载它
systemd-run --on-active=120 nft flush ruleset
nft -f /etc/nftables.conf第一条命令调度一个临时单元,在两分钟内清除规则集并打印其名称。打开一个新会话。如果正常,停止计时器:
systemctl stop run-u1234.timer如果不行,等待,机器会自动让你重新进入。空规则集意味着没有过滤,所以完成这项工作,而不是把它留在那里过夜。
检查它实际在做什么
nft list ruleset
nft -a list chain inet filter input
nft list set inet filter ssh_flood-a 打印句柄,这是在不重写文件的情况下删除单条规则的方法:
nft delete rule inet filter input handle 12计数器回答了一个没人问的问题:一周后仍停留在零的规则要么是错误的,要么是不必要的,两者都值得知道。
跟踪
当一个数据包拒绝按照规则集所说的行为行事时:
nft add rule inet filter input tcp dport 8443 meta nftrace set 1
nft monitor trace之后删除跟踪规则。它是便宜的,而不是免费的。
主机防火墙不适合做什么
它过滤策略,而不是洪泛。体积攻击在到达你的端口之前很久就在边缘被丢弃了,实例上的规则只会花费你的 CPU 去处理那些已经被处理过的数据包。有关详细信息,请参阅 DDoS 防护。
持久化
nft list ruleset > /etc/nftables.conf
systemctl restart nftables把 shebang 和 flush ruleset 行放回导出文件的顶部。没有它们,下一次加载会追加到正在运行的规则集而不是替换它,你的每个规则都会出现两次。