防火墙入门指南


🚪 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恢复

⚠️ 注意:清理规则的风险

  1. 生产环境慎用:直接清空规则可能导致服务中断或安全漏洞,建议先备份:
sudo iptables-save > iptables_backup.txt  # 备份当前规则到文件
  1. 保留本地回环:清理后务必确保允许本地流量(否则localhost无法访问):
sudo iptables -A INPUT -i lo -j ACCEPT  # 添加回环接口允许规则
  1. 逐步操作:复杂规则建议逐条删除,避免一次性清空导致不可控风险。

🚫 关闭 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),避免生产环境直接清空规则。