新系统优先用nftables,因其原子提交、映射支持等优势;老系统如CentOS 7仍用iptables。防火墙策略应默认拒绝、显式放行,并限制源地址;防暴力SSH宜用limit+counter组合;出站流量必须限制,避免C2外连。

iptables 和 nftables 哪个该用?
新系统优先选 nftables,不是因为更“高级”,而是 iptables 在内核 5.10+ 已被标记为 legacy,且规则同步、原子提交、表达能力都弱于 nftables。但如果你维护的是 CentOS 7 或 Ubuntu 18.04 这类老系统,iptables 仍是默认且稳定的选择。
-
iptables规则靠链式追加,iptables-restore加载时无法保证原子性;nftables的nft -f是原子加载,避免中间态开放端口 -
nftables支持映射(maps)、动态集合(dynamic sets),适合做 IP 黑名单自动更新;iptables需依赖ipset配合才能达到类似效果 - 别混用:同一台机器上同时运行
iptables和nftables可能导致规则冲突或跳过预期链,尤其在netfilterhook 点重叠时
只允许 SSH 和 HTTPS 入站,怎么写最稳?
核心是「默认拒绝 + 显式放行」,且必须限制源地址范围(哪怕只是内网段)。直接放通 0.0.0.0/0 的 22 或 443 是高危操作,真实环境中几乎总要配合来源控制。
nft add table inet filter
nft add chain inet filter input { type filter hook input priority 0 \; policy drop \; }
nft add rule inet filter input iifname "eth0" ip saddr 192.168.10.0/24 tcp dport 22 accept
nft add rule inet filter input iifname "eth0" tcp dport 443 ct state established,related accept
nft add rule inet filter input iifname "eth0" tcp dport 443 ip saddr { 203.0.113.5, 203.0.113.12 } accept
- 第一条
accept针对内网管理流量,带明确ip saddr - 第二条放行已建立连接的返回包(避免影响长连接),必须放在第三条之前
- 第三条才是对外暴露的 HTTPS 白名单,用
{ }语法定义多个 CIDR 或 IP,比写多条 rule 更高效
如何阻止暴力 SSH 登录又不封错人?
用 nftables 的 limit + counter 组合比单纯封 IP 更可控,避免因误操作或共享出口 IP 导致大面积误伤。
nft add rule inet filter input tcp dport 22 ct state new limit rate 5/minute burst 10 packets counter reject with icmp type host-unreachable
-
limit rate 5/minute burst 10表示每分钟最多 5 次新连接请求,允许突发 10 次(应对合法用户快速重试) -
ct state new确保只限速新建连接,不影响已有会话 - 用
reject而非drop,让客户端立刻收到失败响应,减少重试等待时间,也降低扫描器停留时长 - 搭配
counter可后续用nft list ruleset | grep ssh查看命中次数,判断是否需调参
出站流量要不要限制?容易被忽略的关键点
多数人只盯入站,但恶意软件一旦上线,第一件事就是外连 C2 服务器。出站不限制,等于防火墙只关了一半门。
- 默认策略设为
policy drop的output链必须配白名单:至少放开lo、DNS(udp dport 53)、NTP(udp dport 123)、HTTPS(tcp dport 443)——但注意:不能无条件放通所有443,应结合ip daddr或域名(需配合应用层代理) -
output链中oifname要明确指定物理接口(如eth0),否则容器或虚拟网卡可能绕过规则 - 若系统跑 Docker,
docker0网桥流量默认不经过output链,得额外在forward链处理容器出站,或改用iptables -t nat -A POSTROUTING做 SNAT 控制










