linux防火墙详细配置命令
Linux 防火墙的核心作用是 过滤网络流量(允许 / 禁止特定端口、IP、协议的访问),保障系统网络安全。主流 Linux 发行版的防火墙工具分为三类:
- firewalld(CentOS 7+/RHEL 7+/Fedora,默认工具,动态规则,推荐);
- iptables(传统工具,兼容所有红帽系 / Debian 系,静态规则);
- ufw(Ubuntu/Debian 默认工具,简化版,适合桌面 / 轻量服务器)。
以下按「工具分类 + 核心概念 + 常用配置 + 实战场景」详细介绍,覆盖 90% 服务器 / 桌面使用场景。
一、先明确:你的系统用哪个防火墙工具?
| 发行版 | 默认防火墙工具 | 切换说明(如需) |
|---|---|---|
| CentOS 7+/RHEL 7+/Fedora | firewalld | 若想改用 iptables:需停止 firewalld 并禁用 |
| CentOS 6/RHEL 6 | iptables | 无默认替代工具 |
| Ubuntu/Debian | ufw | 若想改用 iptables:直接安装配置即可 |
查看当前防火墙状态(快速判断):
bash
运行
# 查看 firewalld 状态(CentOS 7+)
systemctl status firewalld
# 查看 ufw 状态(Ubuntu)
ufw status
# 查看 iptables 规则(所有系统)
iptables -L -n
二、firewalld 配置详解(CentOS 7+/RHEL 7+ 推荐)
firewalld 是 动态防火墙(修改规则无需重启服务,即时生效),核心概念是「区域(Zone)」—— 通过不同区域定义不同的安全策略(如允许哪些端口 / IP 访问)。
1. 核心概念
(1)区域(Zone):按场景划分安全策略
firewalld 预设 9 个区域,常用 4 个:
| 区域名 | 核心策略(默认) | 适用场景 |
|---|---|---|
| public | 允许出站流量,仅开放常用服务(ssh、dhcp) | 服务器公网环境(默认区域,推荐) |
| trusted | 允许所有流量 | 内网信任环境(如局域网服务器) |
| drop | 拒绝所有入站流量(无响应) | 高安全场景(仅开放必要端口) |
| block | 拒绝所有入站流量(返回拒绝响应) | 需明确拒绝访问的场景 |
查看当前默认区域:firewall-cmd --get-default-zone切换默认区域(如切到 drop):sudo firewall-cmd --set-default-zone=drop
(2)规则类型:临时规则 vs 永久规则
- 临时规则:
firewall-cmd不加--permanent,重启 firewalld 或系统后失效; - 永久规则:加
--permanent,需执行firewall-cmd --reload生效(无需重启服务)。
2. 基础命令(启动 / 停止 / 状态)
bash
运行
# 启动 firewalld
sudo systemctl start firewalld
# 停止 firewalld(不推荐,暴露风险)
sudo systemctl stop firewalld
# 重启 firewalld(临时规则会丢失,永久规则保留)
sudo systemctl restart firewalld
# 开机自启(推荐服务器开启)
sudo systemctl enable firewalld
# 禁止开机自启
sudo systemctl disable firewalld
# 查看状态(active 为运行中)
sudo systemctl status firewalld
# 或查看详细规则状态
sudo firewall-cmd --list-all
3. 核心配置(常用场景)
(1)开放端口(最常用,如 80/443/22)
bash
运行
# 临时开放 80 端口(TCP 协议,web 服务)
sudo firewall-cmd --add-port=80/tcp
# 永久开放 443 端口(HTTPS)+ 立即生效(reload 加载永久规则)
sudo firewall-cmd --add-port=443/tcp --permanent && sudo firewall-cmd --reload
# 永久开放端口范围(如 8080-8090,TCP 协议)
sudo firewall-cmd --add-port=8080-8090/tcp --permanent && sudo firewall-cmd --reload
(2)开放服务(按服务名,无需记端口)
firewalld 预设了常用服务的端口映射(如 http=80,ssh=22),直接用服务名更方便:
bash
运行
# 永久开放 ssh 服务(22 端口,远程登录必备)
sudo firewall-cmd --add-service=ssh --permanent && sudo firewall-cmd --reload
# 永久开放 http + https 服务(web 服务器)
sudo firewall-cmd --add-service=http --permanent && sudo firewall-cmd --add-service=https --permanent && sudo firewall-cmd --reload
# 查看所有支持的服务名
sudo firewall-cmd --get-services
(3)禁止端口 / IP(拦截恶意访问)
bash
运行
# 永久禁止 3306 端口(MySQL,不对外暴露)
sudo firewall-cmd --remove-port=3306/tcp --permanent && sudo firewall-cmd --reload
# 永久禁止单个 IP 访问(如 192.168.1.100)
sudo firewall-cmd --add-rich-rule="rule family='ipv4' source address='192.168.1.100' reject" --permanent && sudo firewall-cmd --reload
# 永久禁止 IP 段访问(如 192.168.1.0/24 网段)
sudo firewall-cmd --add-rich-rule="rule family='ipv4' source address='192.168.1.0/24' reject" --permanent && sudo firewall-cmd --reload
(4)查看当前规则
bash
运行
# 查看所有开放的端口和服务(当前生效的规则)
sudo firewall-cmd --list-all
# 查看永久规则(需加 --permanent)
sudo firewall-cmd --list-all --permanent
# 查看开放的端口(仅端口)
sudo firewall-cmd --list-ports
# 查看开放的服务(仅服务)
sudo firewall-cmd --list-services
4. 高级配置(进阶场景)
(1)端口转发(如 80 转发到 8080)
适合服务端口变更但不想暴露新端口的场景:
bash
运行
# 永久转发 80 端口(TCP)到 8080 端口(需开启 IP 伪装)
sudo firewall-cmd --add-masquerade --permanent # 开启 IP 伪装(NAT)
sudo firewall-cmd --add-forward-port=port=80:proto=tcp:to-port=8080 --permanent
sudo firewall-cmd --reload
(2)IP 伪装(内网服务器上网 / 对外提供服务)
相当于 NAT 功能,让内网机器通过防火墙主机访问外网:
bash
运行
# 永久开启 IP 伪装(仅在 public 区域,根据实际区域调整)
sudo firewall-cmd --zone=public --add-masquerade --permanent && sudo firewall-cmd --reload
(3)自定义服务(如自己的应用端口)
如果服务端口不在预设列表中,可自定义服务名:
bash
运行
# 1. 复制模板创建自定义服务(如 myapp,端口 9000)
sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/myapp.xml
# 2. 编辑 myapp.xml,修改服务名、端口(用 vi 编辑)
sudo vi /etc/firewalld/services/myapp.xml
# 内容修改为:
<service>
<short>MyApp</short> <!-- 服务简称 -->
<description>My Custom Application</description> <!-- 描述 -->
<port protocol="tcp" port="9000"/> <!-- 对应端口 -->
</service>
# 3. 重新加载 firewalld,即可使用服务名开放端口
sudo firewall-cmd --reload
sudo firewall-cmd --add-service=myapp --permanent && sudo firewall-cmd --reload
(4)富规则(灵活匹配多条件)
支持组合 IP、端口、协议、动作(允许 / 拒绝 / 日志),适合复杂场景:
bash
运行
# 允许 192.168.1.0/24 网段访问 3306 端口(MySQL 仅内网访问)
sudo firewall-cmd --add-rich-rule="rule family='ipv4' source address='192.168.1.0/24' port protocol='tcp' port='3306' accept" --permanent && sudo firewall-cmd --reload
# 拒绝 10.0.0.5 访问 22 端口(禁止特定 IP 远程登录)
sudo firewall-cmd --add-rich-rule="rule family='ipv4' source address='10.0.0.5' port protocol='tcp' port='22' reject" --permanent && sudo firewall-cmd --reload
# 日志记录 80 端口的访问(日志前缀 "HTTP_ACCESS")
sudo firewall-cmd --add-rich-rule="rule family='ipv4' port protocol='tcp' port='80' log prefix='HTTP_ACCESS' level='info' accept" --permanent && sudo firewall-cmd --reload
三、iptables 配置详解(传统工具,兼容所有系统)
iptables 是 静态防火墙(修改规则后需重启服务或刷新规则),核心是「规则链」和「默认策略」,适合旧系统(CentOS 6)或需要复杂自定义规则的场景。
1. 核心概念
(1)规则链(默认 5 条,常用 3 条)
INPUT:处理进入系统的流量(如外部访问本机端口);OUTPUT:处理系统发出的流量(如本机访问外部网站);FORWARD:处理转发的流量(如防火墙作为网关转发内网流量)。
(2)默认策略(链的默认动作)
ACCEPT:允许流量通过(默认策略,安全性低);DROP:拒绝流量通过(无响应,推荐服务器使用,仅开放必要端口);REJECT:拒绝流量并返回「拒绝响应」。
(3)规则匹配优先级
按规则添加顺序匹配,匹配到第一条规则后立即执行,不再继续匹配。
2. 基础命令(查看 / 清空规则)
bash
运行
# 查看所有规则(-L 列表,-n 数字显示 IP/端口,-v 详细信息)
sudo iptables -L -n -v
# 查看 INPUT 链规则(仅关注入站流量)
sudo iptables -L INPUT -n -v
# 清空所有规则(-F 清空,-X 清除自定义链)
sudo iptables -F && sudo iptables -X
# 重置默认策略(如 INPUT 链默认 DROP,OUTPUT 链默认 ACCEPT)
sudo iptables -P INPUT DROP
sudo iptables -P OUTPUT ACCEPT
sudo iptables -P FORWARD DROP
3. 核心配置(常用场景)
(1)开放必要端口(如 22/80/443)
bash
运行
# 允许本地回环(lo 接口,本机内部通信必备,如数据库本地连接)
sudo iptables -A INPUT -i lo -j ACCEPT
# 允许已建立的连接(如本机访问外部后,外部的响应流量)
sudo iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# 开放 22 端口(ssh 远程登录)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 开放 80(http)和 443(https)端口
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
(2)禁止 IP / 端口访问
bash
运行
# 禁止单个 IP 访问(如 192.168.1.100)
sudo iptables -A INPUT -s 192.168.1.100 -j DROP
# 禁止 IP 段访问(如 10.0.0.0/24)
sudo iptables -A INPUT -s 10.0.0.0/24 -j DROP
# 禁止访问 3306 端口(MySQL 不对外暴露)
sudo iptables -A INPUT -p tcp --dport 3306 -j DROP
(3)端口转发(如 80 转发到 8080)
需开启内核转发(临时生效):
bash
运行
# 开启内核 IP 转发(需 root 权限)
echo 1 > /proc/sys/net/ipv4/ip_forward
# 永久开启内核转发(编辑 sysctl.conf)
sudo vi /etc/sysctl.conf
# 添加/修改:net.ipv4.ip_forward = 1
# 生效:sysctl -p
# 转发 80 端口到 8080(需开启 NAT)
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
4. 规则保存(避免重启失效)
iptables 规则默认是「临时的」,重启系统或 iptables 服务后丢失,需手动保存:
bash
运行
# CentOS 7+/RHEL 7+(firewalld 已禁用,用 iptables-services)
# 1. 安装 iptables-services
sudo yum install -y iptables-services
# 2. 保存规则(保存到 /etc/sysconfig/iptables)
sudo service iptables save
# 3. 开机自启 iptables
sudo systemctl enable iptables
# Ubuntu/Debian
# 1. 安装 iptables-persistent
sudo apt install -y iptables-persistent
# 2. 保存规则(ipv4 规则保存到 /etc/iptables/rules.v4)
sudo netfilter-persistent save
四、ufw 配置详解(Ubuntu/Debian 默认,简化版)
ufw(Uncomplicated Firewall)是 iptables 的简化封装,命令直观,适合桌面用户和轻量服务器(如 Ubuntu 云服务器)。
1. 基础命令(启动 / 禁用 / 状态)
bash
运行
# 启用 ufw(默认策略:拒绝所有入站,允许所有出站,安全)
sudo ufw enable
# 禁用 ufw
sudo ufw disable
# 查看状态(verbose 显示详细规则)
sudo ufw status verbose
# 重置所有规则(恢复默认)
sudo ufw reset
2. 核心配置(常用场景)
(1)开放端口 / 服务
bash
运行
# 开放 22 端口(ssh,远程登录)
sudo ufw allow 22/tcp
# 开放 80(http)+ 443(https)端口
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# 用服务名开放(如开放 ssh 服务,等同于 22/tcp)
sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https
# 开放端口范围(如 8080-8090)
sudo ufw allow 8080:8090/tcp
(2)禁止端口 / IP 访问
bash
运行
# 禁止 3306 端口(MySQL)
sudo ufw deny 3306/tcp
# 禁止单个 IP 访问(如 192.168.1.100)
sudo ufw deny from 192.168.1.100
# 禁止 IP 段访问(如 10.0.0.0/24)
sudo ufw deny from 10.0.0.0/24
# 禁止特定 IP 访问 22 端口
sudo ufw deny from 192.168.1.100 to any port 22
(3)删除规则
bash
运行
# 先查看规则编号(--line-numbers 显示编号)
sudo ufw status numbered
# 删除编号为 3 的规则(根据实际编号调整)
sudo ufw delete 3
五、服务器常用场景实战配置
场景 1:Web 服务器(开放 80/443/22 端口)
bash
运行
# firewalld(CentOS 7+)
sudo firewall-cmd --add-service=ssh --permanent
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --add-service=https --permanent
sudo firewall-cmd --reload
# ufw(Ubuntu)
sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https
sudo ufw enable
场景 2:MySQL 仅内网访问(3306 端口不对外暴露)
bash
运行
# firewalld(仅允许 192.168.1.0/24 网段访问 3306)
sudo firewall-cmd --add-rich-rule="rule family='ipv4' source address='192.168.1.0/24' port protocol='tcp' port='3306' accept" --permanent && sudo firewall-cmd --reload
# ufw(仅允许 192.168.1.0/24 访问 3306)
sudo ufw allow from 192.168.1.0/24 to any port 3306
场景 3:禁止恶意 IP 访问(如频繁尝试 ssh 登录的 IP)
bash
运行
# firewalld
sudo firewall-cmd --add-rich-rule="rule family='ipv4' source address='123.45.67.89' reject" --permanent && sudo firewall-cmd --reload
# iptables
sudo iptables -A INPUT -s 123.45.67.89 -j DROP && sudo service iptables save
六、工具对比与选择建议
| 工具 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| firewalld | 动态规则(无需重启)、区域化管理、功能全 | 仅支持 CentOS 7+/RHEL 7+/Fedora | 红帽系服务器(推荐) |
| iptables | 兼容所有系统、规则灵活、可自定义程度高 | 静态规则(需重启 / 保存)、命令复杂 | 旧系统(CentOS 6)、复杂规则场景 |
| ufw | 命令简单、配置快速、Ubuntu 默认 | 功能较少,不支持复杂转发 / 伪装 | Ubuntu 桌面 / 轻量服务器 |
七、注意事项(避坑指南)
-
临时规则 vs 永久规则:
- firewalld 不加
--permanent是临时规则,重启后失效; - iptables 规则默认临时,必须用
service iptables save(CentOS)或netfilter-persistent save(Ubuntu)保存。
- firewalld 不加
-
默认策略优先安全:服务器建议默认策略设为「拒绝所有入站流量」(firewalld 选 drop 区域,iptables/ufw 设 INPUT 链为 DROP),仅开放必要端口。
-
避免误封 ssh 端口:配置前确保已开放 22 端口(ssh),否则远程登录会被断开,需物理机或控制台修复。
-
测试规则是否生效:开放端口后,用外部机器测试(如
telnet 服务器IP 80或curl 服务器IP:80),能连通则规则生效。 -
防火墙与 SELinux 区分:SELinux 是「系统内部访问控制」(如限制进程访问文件),防火墙是「网络访问控制」,二者互补,不冲突(服务器建议都开启)。
通过以上配置,可实现 Linux 系统的网络安全防护,根据自己的发行版和需求选择对应的工具即可。如果需要更复杂的场景(如负载均衡、VPN 转发),可基于 firewalld/iptables 的高级规则扩展。
更多推荐
所有评论(0)