一、什么是防火墙?为什么需要它?¶
想象你的Linux服务器是一座“城堡”,防火墙就像城堡的“门卫”——它会检查每一个试图进入城堡的“访客”(网络请求),只允许合法的访客进入,拒绝可疑的访问。如果没有防火墙,你的服务器就像大门敞开,任何外部网络的攻击(比如恶意扫描端口、入侵脚本)都可能直接渗透进来,导致数据丢失或服务瘫痪。
核心作用:限制网络访问(只允许必要的连接通过),保护服务器免受未经授权的攻击。
二、Linux系统有哪些防火墙工具?¶
Linux系统的防火墙工具主要分为两类,适合不同发行版(系统),初学者可以从简单易用的工具入手:
-
ufw(Uncomplicated Firewall)
- 特点:Ubuntu/Debian系统的默认防火墙,命令简单,适合新手。
- 本质:基于iptables的简化工具,隐藏了底层复杂规则。 -
firewalld
- 特点:CentOS/RHEL/Rocky Linux等系统的默认防火墙,支持动态规则(无需重启),适合需要更灵活配置的场景。
- 本质:基于netfilter框架,支持“区域”概念(如public、trusted等),规则管理更直观。 -
iptables
- 特点:最底层的防火墙工具,功能强大但规则复杂,适合进阶用户或需要精细控制的场景。
- 提示:ufw和firewalld本质上都是iptables的“上层工具”,新手建议优先用ufw或firewalld。
三、基础操作:以ufw和firewalld为例¶
以下分场景讲解核心操作,你可以根据自己的系统选择对应工具。
场景1:用ufw管理防火墙(Ubuntu/Debian)¶
- 检查ufw状态
sudo ufw status # 查看当前规则(默认:未启用)
输出示例:Status: inactive(未启用)或Status: active(已启用)。
- 启用防火墙
sudo ufw enable # 启用防火墙(默认策略:拒绝所有入站,允许所有出站)
注意:启用后,服务器默认拒绝所有外部连接,仅允许你配置的端口。
- 开放常用端口/服务
- 开放SSH(22端口,用于远程登录):
sudo ufw allow ssh # 直接用服务名(对应端口22)
# 或手动开放端口:sudo ufw allow 22/tcp
- 开放HTTP(80端口,网页服务):
sudo ufw allow 80/tcp # 允许80端口的TCP连接
- 允许特定IP访问:
sudo ufw allow from 192.168.1.100 # 允许IP 192.168.1.100的所有连接
sudo ufw allow from 10.0.0.0/24 to any port 3306 # 允许10.0.0.0网段访问MySQL(3306端口)
- 查看已开放规则
sudo ufw status numbered # 查看带编号的规则列表
- 删除规则
sudo ufw delete 1 # 删除第1条规则(先通过status numbered查看编号)
- 设置默认策略(重要!)
- 默认拒绝所有入站连接(最安全):
sudo ufw default deny incoming
- 默认允许所有出站连接(服务器主动发起的请求不受限):
sudo ufw default allow outgoing
场景2:用firewalld管理防火墙(CentOS/RHEL/Rocky Linux)¶
- 检查firewalld状态
sudo systemctl status firewalld # 查看服务是否运行
sudo firewall-cmd --state # 查看防火墙状态(输出:running/inactive)
- 开放端口/服务
- 开放HTTP服务(80端口,firewalld内置了“服务”映射,如http=80,https=443):
sudo firewall-cmd --add-service=http --permanent # 临时添加(重启后失效)
# 或永久添加(需reload生效):
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --reload # 重新加载规则,生效永久配置
- 手动开放端口(如3306端口,MySQL):
sudo firewall-cmd --add-port=3306/tcp --permanent
- 允许特定IP访问
sudo firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port protocol="tcp" port="22" accept' --permanent
解释:--add-rich-rule用于添加复杂规则,允许IP 192.168.1.100访问22端口(SSH)。
- 查看已开放规则
sudo firewall-cmd --list-all # 列出所有规则(包括服务、端口、IP限制)
- 设置默认策略
- 默认拒绝所有入站连接(最安全):
sudo firewall-cmd --set-default-zone=deny # 临时设置默认区域为“拒绝所有”
- 永久设置默认区域(推荐):
sudo firewall-cmd --set-default-zone=public # public区域默认拒绝入站
四、新手必知的3个避坑点¶
- 忘记加
--permanent参数
防火墙规则默认是“临时生效”的,重启后会丢失!必须加--permanent才能永久保存,例如:
# 错误:临时开放80端口,重启后失效
sudo firewall-cmd --add-service=http
# 正确:永久开放80端口
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --reload # 生效
-
默认策略导致“配置了端口但访问不了”
- 若防火墙默认拒绝所有入站连接,即使开放了端口,外部也无法访问(如仅开放80端口,但默认策略是deny,就需要明确允许)。
- 建议:默认策略设为“拒绝所有入站”,仅开放必要端口/服务。 -
不要随意开放高危端口
- 22端口(SSH)、3306端口(MySQL)、5900端口(VNC)等不要直接暴露在公网!
- 正确做法:仅允许特定IP(如公司内网IP)访问,或通过VPN/跳板机连接。
五、总结¶
防火墙是服务器安全的“第一道防线”,Linux提供了ufw和firewalld等简单工具,无需深入底层知识就能配置。关键步骤:
1. 明确需求(开放哪些端口/服务?允许哪些IP?);
2. 用allow/deny规则限制访问;
3. 用--permanent确保规则持久化,--reload/restart生效;
4. 定期检查规则(如ufw status或firewall-cmd --list-all),删除无用规则。
行动建议:现在打开你的Linux服务器,尝试用ufw或firewalld开放一个安全的端口(如22端口,仅允许自己IP访问),体验防火墙的基本作用吧!