Linux防火墙配置详解:零基础保姆级教程
前置准备
在开始配置 Linux 防火墙之前,请确保你拥有:
- 一台 Linux 服务器(CentOS 7+/Ubuntu 18.04+)
- SSH 或终端访问权限(root 或 sudo 用户)
- 知道需要放行或拦截的服务端口(例如 Web 服务需要 80/443,SSH 默认 22)
- 系统防火墙状态:先确认当前是否已安装。
大多数 VPS 默认已安装firewalld(红帽系)或ufw(Debian 系),本文以 firewalld 为主演示,同时附带 iptables 的通用方法。
分步操作
1. 查看并管理防火墙服务
# CentOS/RHEL
systemctl status firewalld # 检查是否运行
sudo systemctl start firewalld # 启动防火墙
sudo systemctl enable firewalld # 设置开机自启
Ubuntu(使用 ufw 或者 firewalld)
sudo ufw status verbose # 查看状态
sudo ufw enable # 启用防火墙
2. 开放常用端口(以 firewalld 为例)
临时开放(立即生效,重启后失效):
sudo firewall-cmd --add-port=80/tcp
sudo firewall-cmd --add-port=443/tcp永久开放(推荐):
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --reload # 重载使永久规则生效允许服务名称(更简单,如 http,https 等):
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --reload3. 关闭/限制端口(以 firewalld 为例)
sudo firewall-cmd --permanent --remove-port=3306/tcp # 移除 MySQL 端口
sudo firewall-cmd --reload4. 使用 iptables(通用方法)
如果系统没有 firewalld,可以直接操作 iptables:
# 查看当前规则
sudo iptables -L -n
放行 80 端口
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
保存规则(不同发行版命令不同)
CentOS 6:service iptables save
Ubuntu:iptables-save > /etc/iptables/rules.v4
注意:iptables 规则重启后丢失,必须持久化。
避坑指南
- 忘记 reload:使用
--permanent添加规则后,必须执行firewall-cmd --reload才能生效。 - SSH 端口被误封:永远不要在没有备用连接的情况下关闭 22 端口(或你的 SSH 端口)。建议先添加规则放行 SSH,再测试。
- firewalld 与 iptables 冲突:不能同时运行两个防火墙管理工具,停用其中一个。
- icmp 被拦截导致 ping 不通:如果不需要,可放行 icmp:
firewall-cmd --permanent --add-protocol=icmp;firewall-cmd --reload - Ubuntu 默认无 firewalld:安装即可
sudo apt install firewalld,但推荐使用ufw,更简单。
高频问题解答
Q1:防火墙规则添加后没有生效怎么办?
A:检查是否使用了 --permanent 并执行了 --reload;或者检查规则顺序,iptables 默认第一条匹配后不再处理后续。
Q2:如何临时关闭防火墙进行排查?
sudo systemctl stop firewalld # 临时关闭 firewalld
或者 iptables -F 清空所有规则(危险)
测试完记得重启:sudo systemctl start firewalld。
Q3:如何查看当前开放的端口?
firewall-cmd --list-ports
或者
ufw status numbered
Q4:配置防火墙后网站访问不了,怎么排查?
A:确认端口已开放;检查云服务商安全组(如阿里云、腾讯云)是否也有独立防火墙,两者必须同时放行。
效果验证
配置完成后,按以下步骤验证防火墙是否按预期工作:
- 检查防火墙状态(运行中):
systemctl is-active firewalld # 输出 active 或 inactive- 查看已开放的端口/服务:
firewall-cmd --list-all # 包含 ports、services、interfaces 等- 本地测试端口连通性(在服务器自身):
curl -I http://localhost:80
或
telnet localhost 80
- 远程测试(从另一台机器):
nc -vz 你的服务器IP 80如果返回 Connected to 表示端口已放行;
若超时或被拒绝,说明防火墙或安全组有问题。
- 验证规则优先级:尝试访问一个未开放的端口(如 8080),应被拒绝。
根据上述方法确认防火墙配置生效后,你的服务器安全性已得到提升。
如果你正在处理 Linux 防火墙配置,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。