前言
在之前的文章中,我们提到了阿里云ECS的“第一道防线”——安全组。但对于追求极致安全的生产环境来说,仅仅依靠云厂商的安全组是不够的,我们通常会构建“纵深防御”体系。
Linux系统自带的防火墙(Firewalld 或 Iptables)就是服务器的“第二道防线”。
- 安全组:相当于小区的门禁,挡在服务器外面。
- 本地防火墙:相当于你家的大门,挡在操作系统层面。
在 CentOS 7/8 及 Alibaba Cloud Linux 中,默认的防火墙管理工具是 Firewalld(它底层其实还是调用的 iptables,但操作更人性化)。今天我们就来攻克它。
1. 查看防火墙状态
首先,我们需要确认防火墙是不是活着的。
Bash
# 查看 firewalld 服务状态 systemctl status firewalld
- 如果显示
Active: active (running),说明防火墙正在运行。 - 如果显示
inactive (dead),说明防火墙是关闭的。
2. 开启与关闭
如果在测试环境下不想被防火墙干扰,可以临时关闭(生产环境不建议):
Bash
# 启动防火墙 systemctl start firewalld # 停止防火墙 systemctl stop firewalld # 禁止开机自启(永久关闭) systemctl disable firewalld
3. 核心操作:如何开放端口?
这是开发中最最高频的操作。比如你部署了一个 Tomcat 在 8080 端口,安全组放行了,但如果 Firewalld 没放行,外网依然访问不了。
命令语法:firewall-cmd --zone=public --add-port=端口号/协议 --permanent
- --zone=public:作用域为公共区域(默认)。
- --permanent:永久生效(没有这个参数的话,重启服务器就失效了)。
代码示例:
Bash
# 1. 永久开放 80 端口 (HTTP) firewall-cmd --zone=public --add-port=80/tcp --permanent # 2. 永久开放 8080 端口 firewall-cmd --zone=public --add-port=8080/tcp --permanent # 3. 【重要】重新加载配置 # 每次修改带 --permanent 的配置后,必须执行这句才能生效! firewall-cmd --reload
4. 查看已开放的端口
不知道服务器现在到底开了哪些口子?查一下:
Bash
# 查看所有开放的端口 firewall-cmd --list-ports # 输出示例: # 80/tcp 8080/tcp 3306/tcp
5. 如何关闭(移除)端口?
如果你发现有个不常用的端口(比如 3306 数据库端口)暴露在外网太危险,想要关闭它:
Bash
# 移除 3306 端口 firewall-cmd --zone=public --remove-port=3306/tcp --permanent # 记得刷新 firewall-cmd --reload
6. 进阶技巧:设置“白名单”IP
这是专家级的配置。比如 SSH 的 22 端口,你希望只允许你公司的固定IP访问,拒绝其他所有人的暴力破解。
我们可以使用 rich-rule(富规则):
Bash
# 允许 IP 为 192.168.1.100 的机器访问 22 端口 firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='192.168.1.100' port protocol='tcp' port='22' accept" # 重新加载 firewall-cmd --reload
7. 避坑指南:双重检查
这是新手最容易撞墙的地方:
以此为准:想要外网能访问一个端口,必须 阿里云安全组 和 Linux Firewalld 同时放行! 想要外网能访问一个端口,必须 阿里云安全组 和 Linux Firewalld 同时放行! (重要的事情说两遍)
很多时候你配置了 Firewalld 却不通,是因为阿里云控制台没配;反之亦然。
结语
掌握了 firewall-cmd 的这几个核心命令(add-port, remove-port, reload),你就掌握了Linux主机防护的钥匙。建议大家在搭建环境时,养成“最小权限原则”的习惯,只开放必要的端口。