一、什么是防火墙?为什么需要它?

想象你的Linux服务器是一座“城堡”,防火墙就像城堡的“门卫”——它会检查每一个试图进入城堡的“访客”(网络请求),只允许合法的访客进入,拒绝可疑的访问。如果没有防火墙,你的服务器就像大门敞开,任何外部网络的攻击(比如恶意扫描端口、入侵脚本)都可能直接渗透进来,导致数据丢失或服务瘫痪。

核心作用:限制网络访问(只允许必要的连接通过),保护服务器免受未经授权的攻击。

二、Linux系统有哪些防火墙工具?

Linux系统的防火墙工具主要分为两类,适合不同发行版(系统),初学者可以从简单易用的工具入手:

  1. ufw(Uncomplicated Firewall)
    - 特点:Ubuntu/Debian系统的默认防火墙,命令简单,适合新手。
    - 本质:基于iptables的简化工具,隐藏了底层复杂规则。

  2. firewalld
    - 特点:CentOS/RHEL/Rocky Linux等系统的默认防火墙,支持动态规则(无需重启),适合需要更灵活配置的场景。
    - 本质:基于netfilter框架,支持“区域”概念(如public、trusted等),规则管理更直观。

  3. iptables
    - 特点:最底层的防火墙工具,功能强大但规则复杂,适合进阶用户或需要精细控制的场景。
    - 提示:ufw和firewalld本质上都是iptables的“上层工具”,新手建议优先用ufw或firewalld。

三、基础操作:以ufw和firewalld为例

以下分场景讲解核心操作,你可以根据自己的系统选择对应工具。

场景1:用ufw管理防火墙(Ubuntu/Debian)
  1. 检查ufw状态
   sudo ufw status  # 查看当前规则(默认:未启用)

输出示例:Status: inactive(未启用)或Status: active(已启用)。

  1. 启用防火墙
   sudo ufw enable  # 启用防火墙(默认策略:拒绝所有入站,允许所有出站)

注意:启用后,服务器默认拒绝所有外部连接,仅允许你配置的端口。

  1. 开放常用端口/服务
    - 开放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端口)
  1. 查看已开放规则
   sudo ufw status numbered  # 查看带编号的规则列表
  1. 删除规则
   sudo ufw delete 1  # 删除第1条规则(先通过status numbered查看编号)
  1. 设置默认策略(重要!)
    - 默认拒绝所有入站连接(最安全):
     sudo ufw default deny incoming
  • 默认允许所有出站连接(服务器主动发起的请求不受限):
     sudo ufw default allow outgoing
场景2:用firewalld管理防火墙(CentOS/RHEL/Rocky Linux)
  1. 检查firewalld状态
   sudo systemctl status firewalld  # 查看服务是否运行
   sudo firewall-cmd --state  # 查看防火墙状态(输出:running/inactive)
  1. 开放端口/服务
    - 开放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
  1. 允许特定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)。

  1. 查看已开放规则
   sudo firewall-cmd --list-all  # 列出所有规则(包括服务、端口、IP限制)
  1. 设置默认策略
    - 默认拒绝所有入站连接(最安全):
     sudo firewall-cmd --set-default-zone=deny  # 临时设置默认区域为“拒绝所有”
  • 永久设置默认区域(推荐):
     sudo firewall-cmd --set-default-zone=public  # public区域默认拒绝入站

四、新手必知的3个避坑点

  1. 忘记加--permanent参数
    防火墙规则默认是“临时生效”的,重启后会丢失!必须加--permanent才能永久保存,例如:
   # 错误:临时开放80端口,重启后失效
   sudo firewall-cmd --add-service=http  

   # 正确:永久开放80端口
   sudo firewall-cmd --add-service=http --permanent  
   sudo firewall-cmd --reload  # 生效
  1. 默认策略导致“配置了端口但访问不了”
    - 若防火墙默认拒绝所有入站连接,即使开放了端口,外部也无法访问(如仅开放80端口,但默认策略是deny,就需要明确允许)。
    - 建议:默认策略设为“拒绝所有入站”,仅开放必要端口/服务。

  2. 不要随意开放高危端口
    - 22端口(SSH)、3306端口(MySQL)、5900端口(VNC)等不要直接暴露在公网!
    - 正确做法:仅允许特定IP(如公司内网IP)访问,或通过VPN/跳板机连接。

五、总结

防火墙是服务器安全的“第一道防线”,Linux提供了ufw和firewalld等简单工具,无需深入底层知识就能配置。关键步骤:
1. 明确需求(开放哪些端口/服务?允许哪些IP?);
2. 用allow/deny规则限制访问;
3. 用--permanent确保规则持久化,--reload/restart生效;
4. 定期检查规则(如ufw statusfirewall-cmd --list-all),删除无用规则。

行动建议:现在打开你的Linux服务器,尝试用ufwfirewalld开放一个安全的端口(如22端口,仅允许自己IP访问),体验防火墙的基本作用吧!

小夜