linux防火墙规则编写关键在于理清逻辑、分步操作与验证闭环,推荐使用nftables(现代主流工具),按创建表→链→基础规则→业务规则→默认拒绝顺序实施,并需保存配置实现持久化。

Linux防火墙规则编写不难,关键在理清逻辑、分步操作、验证闭环。用 iptables(传统)或 nftables(现代推荐)均可实现,本文以 nftables 为主展开,兼顾 iptables 对照,帮你一次性打通全流程。
明确目标:先想清楚“要拦什么、放什么”
写规则前别急着敲命令,先回答三个问题:
- 哪些端口必须对外开放?比如 22(ssh)、80/443(Web)
- 哪些来源需要限制?比如只允许公司IP访问数据库端口(3306)
- 是否要防常见攻击?比如防 ping 泛洪、防连接数过载、防 SYN 洪水
例如:一台Web服务器,只需开放 80、443 和管理员固定IP的22端口,其余全部拒绝——这就是最典型的“白名单思维”,也是安全基线。
选择工具:nftables 是当前主线,iptables 已逐步被替代
debian 12 / ubuntu 22.04+ / centos 8+ 默认使用 nftables,它统一了内核接口,语法更简洁、性能更好。iptables 命令实际是通过 xtables 转译为 nftables 规则运行。
- 查当前生效规则:
nft list ruleset - 清空所有规则(谨慎!建议先备份):
nft flush ruleset - iptables 兼容写法仍可用,但新项目建议直接学 nftables
动手写规则:从链(chain)到规则(rule),四步落地
以 nftables 为例,按真实部署顺序组织:
- 创建表(table):命名空间,如
nft add table inet Filter - 创建链(chain):挂载点,如
nft add chain inet filter input { type filter hook input priority 0 ; } - 加基础规则:状态跟踪 + 回环放行 + 已建立连接放行
nft add rule inet filter input ct state established,related acceptnft add rule inet filter input iifname "lo" accept - 加业务规则:按优先级由高到低添加
nft add rule inet filter input ip saddr 203.0.113.5 tcp dport 22 acceptnft add rule inet filter input tcp dport {80, 443} acceptnft add rule inet filter input drop(默认拒绝,务必放在最后)
保存与持久化:重启不丢规则才是真生效
临时规则重启即失效,必须保存:
- Ubuntu/Debian:
nft list ruleset > /etc/nftables.conf,并确保nftables服务已启用:systemctl enable nftables - CentOS/RHEL:
nft list ruleset > /etc/sysconfig/nftables.conf,再systemctl enable nftables - 验证是否开机加载:
systemctl is-enabled nftables返回 enabled 即可
小技巧:先用 nft -f /path/to/rules.nft 测试规则文件语法,无报错再写入配置。
基本上就这些。写防火墙不是堆指令,而是建逻辑防线——目标清晰、工具选对、步骤闭环、持久到位。练熟几次,从建表到上线十分钟搞定。