你是否曾被 iptables 复杂的规则链绕晕,或者在调试 firewalld 时不小心把自己锁在了服务器外面?Linux 防火墙是系统的第一道防线,但其命令体系确实有些庞杂。本文将核心的分类与常用命令整理成册,方便你随时查阅,让防火墙从“拦路虎”变成你的好帮手。
一、Linux防火墙核心机制
1.1 防火墙定义与核心作用
Linux 防火墙实际上是内核级的流量过滤工具。它通过预设规则,对进出系统的数据包进行放行、拒绝或转发。其核心目的,是在风险区域与安全区域之间建立隔离——阻止未授权访问、过滤掉不安全的服务,并为安全监控提供数据支持。
这套机制的核心,是 Linux 内核中的 netfilter 网络过滤模块。它负责数据包最底层的过滤、转发等处理,模块路径通常位于 /lib/modules/(内核版本)/kernel/net/netfilter 。我们常用的各类防火墙管理工具,都是基于这个模块提供的接口进行规则配置的。
1.2 Linux防火墙主要分类
我们常用的 Linux 防火墙工具主要分三类,适配不同发行版与场景,核心区别就在于操作的便捷性:
- firewalld:动态防火墙。 CentOS 7 及以上版本、 Fedora 等 RedHat 系发行版默认自带。它支持规则实时生效,不用重启服务就能应用新配置,采用“区域(Zone)”管理机制,配置灵活,适用于大多数生产和日常场景。
- iptables:传统底层防火墙工具,基于
netfilter 模块,几乎所有 Linux 发行版都能用。它能直接操作内核防火墙规则,支持精细的流量控制(如 NAT 转换、复杂过滤规则),但规则默认临时生效,需手动进行持久化配置,语法相对繁琐。
- ufw:Ubuntu 等 Debian 系发行版默认的简化防火墙工具,本质上是
iptables 的一个前端封装,命令简洁易懂,非常适合初学者快速上手。
1.3 核心概念补充
(1)firewalld 核心概念
- 区域:
firewalld 通过区域对网络接口和流量进行分组。不同区域对应不同安全级别,如 drop(强制丢弃所有流量)、block(拒绝并返回响应)、public(公共网络,规则严格)、trusted(信任所有流量)等。未指定时,使用设定的默认区域。
- 规则类型:分为临时规则(重启防火墙后失效)和永久规则(需重载配置生效,用
--permanent 参数区分)。
- 富规则:用于实现更精细的控制,比如针对特定源地址、端口并记录日志的复杂规则。
(2)iptables 核心概念
- 表:不同的规则集合。最常用的是
filter 表(默认表,用于流量过滤)和 nat 表(用于网络地址转换)。
- 链:表里的规则集合,对应数据包处理的不同节点。核心链包括
INPUT(入站)、OUTPUT(出站)、FORWARD(转发)。
- 目标:规则匹配后执行的动作,如
ACCEPT(放行)、DROP(悄悄丢弃)、REJECT(拒绝并返回错误信息)。
二、Linux防火墙常用命令速查
以下按 firewalld、iptables、ufw 分类整理核心操作命令。
2.1 firewalld 常用命令(CentOS 7+ 首选)
(1)服务基础管理
- 查看运行状态:
firewall-cmd --state (输出 running 表示在跑,not running 表示没跑)
- 查看详细状态:
systemctl status firewalld
- 启动服务:
systemctl start firewalld
- 开机自启:
systemctl enable firewalld
- 停止服务:
systemctl stop firewalld
- 禁用自启:
systemctl disable firewalld
- 重启服务(会中断连接):
systemctl restart firewalld
- 重载配置(不中断连接,修改规则后必用):
firewall-cmd --reload
(2)区域相关操作
- 查看所有区域:
firewall-cmd --get-zones
- 查看默认区域:
firewall-cmd --get-default-zone
- 设置默认区域:
firewall-cmd --set-default-zone=public
- 查看激活区域:
firewall-cmd --get-active-zones
- 查看某区域详细配置:
firewall-cmd --zone=public --list-all
- 将网卡绑定到区域:
firewall-cmd --zone=public --add-interface=eth0 --permanent
(3)端口与服务管理
- 查看临时开放的端口:
firewall-cmd --list-ports
- 查看永久开放的端口:
firewall-cmd --permanent --list-ports
- 临时开放 TCP 80 端口:
firewall-cmd --zone=public --add-port=80/tcp
- 永久开放 TCP 80 端口:
firewall-cmd --zone=public --add-port=80/tcp --permanent (之后别忘了 reload)
- 永久开放一个端口范围:
firewall-cmd --zone=public --add-port=18881-18885/tcp --permanent
- 永久移除端口:
firewall-cmd --zone=public --remove-port=80/tcp --permanent
- 查询端口是否开放:
firewall-cmd --zone=public --query-port=80/tcp
- 开放预定义服务(如 http):
firewall-cmd --zone=public --add-service=http --permanent
(4)富规则配置
- 允许特定 IP 访问 22 端口:
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port protocol="tcp" port="22" accept'
- 拒绝特定网段访问 80 端口:
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="10.0.0.0/24" port protocol="tcp" port="80" reject'
(5)其他常用操作
- 开启 IP 转发:编辑
/etc/sysctl.conf,添加 net.ipv4.ip_forward = 1,然后执行 sysctl -p 使其生效。
- 启用伪装(用于内网访问公网):
firewall-cmd --add-masquerade --permanent
- 端口转发(将 80 转发至 8080):
firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 --permanent
2.2 iptables 常用命令(传统底层工具)
(1)服务与规则查看
- 查看 filter 表规则(简洁):
iptables -L
- 查看 filter 表规则(详细,不解析 IP 与端口):
iptables -L -n -v
- 查看 nat 表规则:
iptables -t nat -L -n -v
- 查看规则并显示行号:
iptables -L -n --line-numbers
- 清空 filter 表所有规则:
iptables -F
- 重置计数器:
iptables -Z
(2)核心规则配置
- 设置默认策略(入站丢包,出站放行):
iptables -P INPUT DROP && iptables -P OUTPUT ACCEPT
- 放行本地回环接口:
iptables -A INPUT -i lo -j ACCEPT
- 放行已建立及关联连接:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
- 放行特定 IP 入站:
iptables -A INPUT -s 192.168.1.100 -j ACCEPT
- 放行特定端口(如 SSH 22):
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
- 拒绝特定 IP 入站(悄悄丢弃):
iptables -A INPUT -s 10.0.0.5 -j DROP
(3)规则删改与持久化
- 按行号删除(如删 INPUT 链第 3 条):
iptables -D INPUT 3
- 按内容删除:
iptables -D INPUT -p tcp --dport 22 -j ACCEPT
- 保存规则(CentOS 7):
iptables-save > /etc/sysconfig/iptables
- 恢复规则:
iptables-restore < /etc/sysconfig/iptables
2.3 ufw 常用命令(Ubuntu 默认)
- 启用(默认拒绝入站):
ufw enable
- 查看状态:
ufw status
- 放行端口:
ufw allow 22 或 ufw allow 80/tcp
- 拒绝端口:
ufw deny 3306
- 放行特定 IP:
ufw allow from 192.168.1.100
- 删除规则:
ufw delete allow 80/tcp
- 重置所有规则:
ufw reset
三、运维避坑指南
- 二选一原则:
firewalld 与 iptables 绝不要同时启用,这会直接导致规则冲突、网络异常。启用一个前,务必停掉另一个。
- 临时规则的陷阱:任何临时规则在服务或系统重启后都会消失。在生产环境中,记得在测试无误后立即加上
--permanent 参数并重载。
- 别把自己关在门外:操作远程服务器防火墙时,务必先配置一条放行你自己 IP 的规则,再去设置全局拒绝策略。这能避免因误封 SSH 端口而永远失去连接。
- 顺序即命运:
iptables 的规则是顺序匹配的,第一条命中后便不再继续。配置时,必须将更具体的规则放在较宽泛的规则前面。
在云栈社区,我们后续还会深入更多关于 运维与系统脚本 的实战话题,比如如何用脚本自动化检测并备份防火墙策略,欢迎保持关注。
|