知识库

一个合理的 nftables 基线

一个默认丢弃的规则集,允许实例真正需要的东西,对 SSH 进行速率限制,并且在你还在编写它时不会把你锁在门外。

一个防火墙,不是两个

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 行放回导出文件的顶部。没有它们,下一次加载会追加到正在运行的规则集而不是替换它,你的每个规则都会出现两次。

随时恭候

选择城市,选择大小,用加密货币支付。

无需填写关于您的身份信息的表格,无需等待人工审批,无需电话验证。账单结清后,凭证将发送到您的邮箱。