🚪 Linux 防火墙入门指南(Firewalld/Iptables/UFW)
一、防火墙是什么?(新手必懂)
防火墙就像你家的“网络门卫”,专门控制进出你电脑/服务器的网络数据。
- 作用:只允许你“允许”的流量通过(比如网页访问、远程登录),拒绝危险的流量(比如黑客攻击、病毒连接)。
- 为什么需要?:防止外部恶意访问,保护内部数据安全,就像给你的电脑加一道“安全门”。
二、三大防火墙工具对比(选对工具少踩坑)
工具 | 特点 | 适合场景 | 难度指数 |
---|---|---|---|
Firewalld | 图形化+区域管理,动态更新规则 | CentOS 7+/企业级环境 | ★★☆☆☆ |
Iptables | 老牌底层工具,灵活控制每一个数据包 | 复杂网络策略/旧版系统 | ★★★★☆ |
UFW | 简化版 Iptables,命令简单易上手 | Ubuntu/Debian/新手入门 | ★☆☆☆☆ |
三、Firewalld 入门(适合 CentOS 新手)
🔥 基础概念(超通俗版)
- 区域(Zone):预设的“安全房间”,不同房间有不同规则:
public
(公共区):像咖啡厅WiFi,只允许必要服务(如SSH远程登录)。home
(家庭区):像家里WiFi,允许更多服务(如文件共享)。trusted
(信任区):完全信任,所有流量都放行。- 服务(Service):提前定义好的“访客类型”,比如
http
(网页访问)、ssh
(远程登录),允许服务就像给访客发通行证。
🛠 常用命令(每天必用)
1. 查看状态
sudo firewall-cmd --state # 查看是否运行(running/stopped)
sudo firewall-cmd --list-all # 查看当前区域的规则(如public区允许哪些服务)
2. 允许服务(例:开放网页访问)
sudo firewall-cmd --add-service=http # 临时允许(重启后失效)
sudo firewall-cmd --add-service=http --permanent # 永久允许(需重载)
sudo firewall-cmd --reload # 重载配置让规则生效
3. 允许端口(例:开放自定义端口 8080)
sudo firewall-cmd --add-port=8080/tcp # 临时允许TCP 8080端口
sudo firewall-cmd --add-port=8080/tcp --permanent # 永久允许
4. 拒绝流量(例:禁止某个IP访问)
sudo firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.100" reject'
🔥 进阶案例(实战必备)
案例1:端口转发(公网80端口转发到内网服务器8080端口)
# 添加端口转发规则(永久生效)
sudo firewall-cmd --permanent --zone=public --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.1.100
sudo firewall-cmd --reload
案例2:限制IP访问频率(防暴力破解)
# 允许192.168.1.0/24网段每分钟最多10次SSH连接
sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="ssh" limit value="10/min" accept'
sudo firewall-cmd --reload
案例3:自定义服务(开放Redis端口6379,使用vim编辑)
# 创建自定义服务文件
sudo vim /etc/firewalld/services/redis.xml
输入以下内容后保存(:wq
退出):
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>Redis</short>
<description>Redis Database Service</description>
<port protocol="tcp" port="6379"/>
</service>
sudo firewall-cmd --permanent --add-service=redis # 应用自定义服务
sudo firewall-cmd --reload
🚫 关闭 Firewalld 防火墙
临时关闭(重启后恢复)
sudo systemctl stop firewalld
永久关闭(禁止开机启动)
sudo systemctl disable firewalld
四、Iptables 入门(适合想深入理解原理)
🛡 基础概念(底层逻辑)
- 表(Table):不同功能的“工作区”:
filter
表:最常用,过滤进出的数据包(比如允许/拒绝)。nat
表:处理网络地址转换(比如端口转发)。- 链(Chain):数据包的“检查流水线”:
INPUT
链:检查进入电脑的数据包(从外部来)。OUTPUT
链:检查从电脑发出的数据包(去外部)。FORWARD
链:检查经过电脑转发的数据包(当路由器时用)。
🛠 常用命令(新手先学这5个)
1. 查看当前规则
sudo iptables -L # 查看filter表的所有规则
sudo iptables -L -t nat # 查看nat表规则(端口转发用)
sudo iptables -L --line-numbers # 显示规则编号(删规则时用)
2. 允许 SSH 访问(仅特定IP)
sudo iptables -A INPUT -s 192.168.1.100 -p tcp --dport 22 -j ACCEPT
-A INPUT
:在INPUT链末尾添加规则-s 192.168.1.100
:源IP地址--dport 22
:目标端口(SSH默认22)-j ACCEPT
:允许通过
3. 设置默认策略(拒绝所有未允许的流量)
sudo iptables -P INPUT DROP # 输入链默认拒绝(安全第一!)
sudo iptables -P OUTPUT ACCEPT # 输出链默认允许(一般不改)
4. 删除规则(按编号删除第3条规则)
sudo iptables -D INPUT 3
5. 开放本地回环(必学,否则电脑可能连自己都访问不了)
sudo iptables -A INPUT -i lo -j ACCEPT # 允许本地回环接口流量
🛡 进阶案例(实战必备)
案例1:状态检测(允许已建立的连接返回流量)
# 允许已建立的连接和相关流量(如FTP、邮件客户端)
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
案例2:端口转发(公网80→内网8080,NAT转换)
# 第一步:在nat表PREROUTING链转发端口
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:8080
# 第二步:在nat表POSTROUTING链做地址伪装(共享上网必备)
sudo iptables -t nat -A POSTROUTING -j MASQUERADE
🗑️ Iptables 规则清理与重置(新手必学)
实际操作中,常需清理旧规则或重置防火墙(如调试错误规则、恢复初始状态)。以下是核心方法:
1. 删除指定规则(按编号/内容)
场景:删除某条错误的允许/拒绝规则
- 按规则编号删除(先查看编号):
sudo iptables -L --line-numbers # 查看规则列表及编号(如INPUT链第3条规则)
sudo iptables -D INPUT 3 # 删除INPUT链的第3条规则
- 按规则内容删除(适用于忘记编号的情况):
# 示例:删除允许192.168.1.100访问22端口的规则
sudo iptables -D INPUT -s 192.168.1.100 -p tcp --dport 22 -j ACCEPT
2. 清空所有规则(快速重置)
场景:调试时临时清空所有过滤规则,重新配置
- 清空单个链(如INPUT链):
sudo iptables -F INPUT # 清空INPUT链的所有规则
sudo iptables -F OUTPUT # 清空OUTPUT链
sudo iptables -F FORWARD # 清空FORWARD链
- 清空所有链(一键重置filter表):
sudo iptables -F # 清空filter表的所有链(INPUT/OUTPUT/FORWARD)
- 清空其他表(如nat表):
sudo iptables -t nat -F # 清空nat表的所有规则(端口转发相关)
3. 删除自定义链
场景:删除自己创建的无用链(默认链无法删除)
sudo iptables -X my_custom_chain # 删除名为my_custom_chain的自定义链
4. 恢复默认策略(安全兜底)
场景:规则混乱时,恢复默认的“允许输出,拒绝输入”策略
sudo iptables -P INPUT DROP # 输入链默认拒绝所有流量(最安全状态)
sudo iptables -P OUTPUT ACCEPT # 输出链默认允许所有流量(一般不变)
sudo iptables -P FORWARD DROP # 转发链默认拒绝(非路由器场景)
5. 彻底重置防火墙(初始化)
场景:从头开始配置,清除所有用户规则和自定义链
sudo iptables -F # 清空所有过滤规则
sudo iptables -X # 删除所有自定义链
sudo iptables -t nat -F # 清空NAT规则
sudo iptables -t nat -X # 删除NAT自定义链
sudo iptables -t mangle -F # 清空mangle表规则(高级场景用)
sudo iptables -P INPUT DROP # 设置输入链默认策略为拒绝
sudo iptables -P OUTPUT ACCEPT # 设置输出链默认策略为允许
6. 保存/恢复规则(防止重启丢失)
场景:生产环境中永久保存规则,避免重启后失效
- CentOS 6/7 保存规则:
sudo service iptables save # 将当前规则保存到/etc/sysconfig/iptables
sudo systemctl restart iptables # 重启后自动加载规则
- Ubuntu/Debian 保存规则(需安装工具):
sudo apt install iptables-persistent # 安装持久化工具
sudo netfilter-persistent save # 保存当前规则到/etc/iptables/rules.v4(IPv4)和rules.v6(IPv6)
- 恢复规则(从备份文件加载):
sudo iptables-restore < /etc/iptables/rules.v4 # Ubuntu/Debian恢复
sudo iptables-restore < /etc/sysconfig/iptables # CentOS恢复
⚠️ 注意:清理规则的风险
- 生产环境慎用:直接清空规则可能导致服务中断或安全漏洞,建议先备份:
sudo iptables-save > iptables_backup.txt # 备份当前规则到文件
- 保留本地回环:清理后务必确保允许本地流量(否则localhost无法访问):
sudo iptables -A INPUT -i lo -j ACCEPT # 添加回环接口允许规则
- 逐步操作:复杂规则建议逐条删除,避免一次性清空导致不可控风险。
🚫 关闭 Iptables 防火墙(完善版)
临时关闭(重启后恢复)
# CentOS 6/7
sudo systemctl stop iptables # 停止服务,规则失效
# Ubuntu/Debian(UFW基于Iptables,关闭UFW即停用Iptables规则)
sudo ufw disable # 临时关闭UFW,Iptables规则同时失效
永久关闭(禁止开机启动)
# CentOS 6/7
sudo systemctl disable iptables # 禁止开机启动,需手动启用时用systemctl start
# Ubuntu/Debian(不推荐完全关闭,如需彻底禁用)
sudo apt remove ufw # 卸载UFW,同时移除Iptables前端管理工具(谨慎!)
五、UFW 入门(适合 Ubuntu 新手,最简单!)
🧰 基础概念(一键开关)
UFW 是 Iptables 的“简化版遥控器”,用简单命令就能管理防火墙,不需要记复杂的链和表。
🛠 常用命令(5分钟学会)
1. 启用/禁用防火墙
sudo ufw enable # 启用(开机自启,推荐!)
sudo ufw disable # 临时禁用(不推荐,测试时用)
2. 允许服务(例:允许SSH和网页访问)
sudo ufw allow ssh # 允许远程登录(对应22端口)
sudo ufw allow http # 允许HTTP访问(80端口)
sudo ufw allow https # 允许HTTPS访问(443端口)
3. 允许端口(例:开放TCP 8080端口)
sudo ufw allow 8080/tcp # 允许TCP 8080端口
sudo ufw allow 8000-9000/tcp # 允许8000-9000端口范围(TCP协议)
4. 拒绝流量(例:禁止某个IP段)
sudo ufw deny from 192.168.1.100 # 禁止单个IP访问任何端口
sudo ufw deny from 192.168.1.0/24 to any port 80 # 禁止某个网段访问80端口
🧰 进阶案例(实战必备)
案例1:允许某个IP访问多个端口(用vim编辑自定义服务)
# 创建自定义服务文件(如MySQL)
sudo vim /etc/ufw/applications.d/mysql
输入以下内容后保存(:wq
退出):
[MySQL]
title=MySQL Database
description=MySQL is a database service.
ports=3306/tcp
sudo ufw allow MySQL # 允许MySQL服务(自动开放3306端口)
🚫 关闭 UFW 防火墙
临时关闭(重启后恢复)
sudo ufw disable
永久关闭(禁止开机启动)
sudo systemctl disable ufw
六、新手必看!三大工具怎么选?
1. 选 UFW 的场景
- 系统:Ubuntu/Debian
- 需求:简单放行 SSH、HTTP 等常用服务,不想记复杂命令。
- 示例:
sudo ufw allow ssh && sudo ufw allow http && sudo ufw enable # 一键开启常用服务
2. 选 Firewalld 的场景
- 系统:CentOS 7+/Rocky Linux
- 需求:按网络环境切换规则(如笔记本连公司用
public
区,回家用home
区)。 - 示例:
sudo firewall-cmd --zone=home --add-service=samba --permanent && sudo firewall-cmd --reload # 家庭网络允许文件共享
3. 选 Iptables 的场景
- 系统:旧版 CentOS 6/复杂网络环境
- 需求:精细控制每个数据包(如端口转发、状态检测、速率限制)。
- 示例:
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 192.168.1.100:8080 # 端口转发
七、新手常见问题(避坑指南)
1. 关闭防火墙的风险
- 临时关闭:适合本地调试(如测试服务是否正常),但生产环境中关闭会暴露所有端口,极易被攻击。
- 永久关闭:仅建议在完全信任的内网环境操作,否则必须通过其他方式(如硬件防火墙)保障安全。
2. 规则不生效?
- 检查是否用了
--permanent
(Firewalld),或是否执行了sudo ufw enable
(UFW)。 - Iptables 规则默认重启丢失,需用
sudo service iptables save
保存(CentOS 6)或安装iptables-persistent
(Ubuntu)。
3. 本地服务连不上?
- 所有工具默认允许本地回环(
lo
接口),若误删规则,用以下命令恢复(仅Iptables需要):
sudo iptables -A INPUT -i lo -j ACCEPT
八、总结(新手一句话攻略)
- 入门首选 UFW:简单命令搞定基础防护,适合 Ubuntu 新手。
sudo ufw allow ssh && sudo ufw enable # 快速开启远程登录防护
- CentOS 用 Firewalld:按区域管理网络,动态切换规则更方便。
sudo firewall-cmd --zone=public --add-service=ssh --permanent && sudo firewall-cmd --reload # 永久开放SSH
- 深入学 Iptables:理解数据包过滤原理,打造定制化策略(适合服务器管理员)。
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 允许已建立连接
- 规则清理:用
iptables -F
清空链,-D
删除指定规则,-P
恢复默认策略。 - 永久保存:CentOS用
service iptables save
,Ubuntu用iptables-persistent
工具。 - 安全提示:清理前先备份规则(
iptables-save
),避免生产环境直接清空规则。