问题背景
Linux 防火墙是服务器网络安全的第一道屏障。无论是在本地数据中心还是云服务器上,正确配置防火墙都是运维工程师的基本功。配置不当可能导致:
-
该开放的端口没开放,业务无法访问 -
该关闭的端口没关闭,攻击面暴露 -
规则顺序错误导致流量被意外放行或阻断 -
生产环境操作时把自己踢出去,无法远程登录
Linux 防火墙有两套主流工具:iptables 和 firewalld(CentOS 7+ 默认使用)。Ubuntu 默认使用 ufw(底层也是 iptables)。这三者原理相通,只是配置方式不同。这篇文章面向初中级 Linux 运维工程师,系统讲解 iptables 和 firewalld 的工作原理、配置方法、常见场景和排错思路。
防火墙基本原理
1.1 什么是 Netfilter
Linux 防火墙的核心是 Netfilter,它是内核模块,负责在网络包经过的各个 Hook 点检查和处理数据包。iptables/firewalld/ufw 都是用来配置 Netfilter 规则的工具,不是防火墙本身。
Netfilter 的 5 个 Hook 点:
PREROUTING → 路由决策前(DNAT)
FORWARD → 转发流量(不是本机进出的包)
INPUT → 到达本机的包
OUTPUT → 本机发出的包
POSTROUTING → 路由决策后(SNAT)
1.2 iptables 的表(tables)和链(chains)
iptables 将规则组织成表和链:
表(tables):
-
filter:最常用,负责过滤流量(放行/拒绝) -
nat:网络地址转换(DNAT/SNAT) -
mangle:修改数据包的特殊字段(如 TOS、TTL) -
raw:绕过连接追踪(raw 表的 PREROUTING 和 OUTPUT)
链(chains): 每个表有不同的内置链:
filter 表:INPUT, FORWARD, OUTPUT
nat 表:PREROUTING, INPUT, OUTPUT, POSTROUTING
mangle 表:PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
raw 表:PREROUTING, OUTPUT
数据包在 iptables 中的处理流程:
入站流量:
eth0 → PREROUTING (nat) → 路由判断 → INPUT (filter) → 本机进程
转发流量:
eth0 → PREROUTING (nat) → 路由判断 → FORWARD (filter) → POSTROUTING (nat) → eth1
出站流量:
本机进程 → OUTPUT (filter/nat) → POSTROUTING (nat) → eth0
1.3 规则匹配顺序
iptables 规则按顺序匹配,第一个匹配的规则决定数据包的处理方式。如果没有任何规则匹配,则使用链的默认策略(Policy)。
匹配顺序:从头到尾依次匹配,遇到第一条匹配的规则就执行该规则的动作(ACCEPT/DROP/REJECT),不再继续匹配后续规则。
这就是为什么经常有人把”允许 SSH”规则放在所有拒绝规则之前——如果放错了顺序,所有流量都会被前面的拒绝规则拦住。
第二步:iptables 基础操作
2.1 查看当前规则
# 查看 filter 表的规则(最常用的表)
sudo iptables -L -n -v
# 参数说明:
# -L: 列出规则
# -n: 不做 DNS 反解,显示 IP 和端口数字
# -v: 显示详细信息(包计数、字节计数)
# 只看某个链(INPUT/OUTPUT/FORWARD)
sudo iptables -L INPUT -n -v
sudo iptables -L OUTPUT -n -v
sudo iptables -L FORWARD -n -v
# 查看 nat 表的规则
sudo iptables -t nat -L -n -v
# 查看规则编号(用于删除特定规则)
sudo iptables -L INPUT -n --line-numbers
# 查看规则并显示规则所属的链和表
sudo iptables -L -n --table filter
2.2 iptables 的基本语法
# 基本语法:
# iptables [-t table] -A chain rule-specification [options]
# iptables [-t table] -D chain rule-specification [options]
# iptables [-t table] -I chain [rulenum] rule-specification [options]
# iptables [-t table] -R chain rulenum rule-specification [options]
# iptables [-t table] -F [chain]
# iptables [-t table] -P chain target [options]
# 常用动作(target):
# ACCEPT:放行
# DROP:丢弃(不响应客户端)
# REJECT:拒绝(响应客户端一个 ICMP 或 TCP RST)
# LOG:记录日志(但不改变数据包的处理)
# SNAT:源地址转换
# DNAT:目标地址转换
# MASQUERADE:动态源地址转换(常用于 NAT 场景)
2.3 规则的匹配条件
# 按源 IP 匹配
sudo iptables -A INPUT -s 192.168.1.100 -j ACCEPT
# 按目标 IP 匹配
sudo iptables -A OUTPUT -d 8.8.8.8 -j DROP
# 按协议匹配
sudo iptables -A INPUT -p tcp -j ACCEPT
sudo iptables -A INPUT -p udp -j ACCEPT
sudo iptables -A INPUT -p icmp -j ACCEPT
# 按端口匹配(必须先指定 -p tcp 或 -p udp)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 按源端口匹配(通常用于 OUTPUT 链)
sudo iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT
# 按多个端口匹配
sudo iptables -A INPUT -p tcp -m multiport --dports 80,443,8080 -j ACCEPT
# 按 IP 和端口组合匹配
sudo iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 22 -j ACCEPT
# 按网络接口匹配(-i 指定入站网卡,-o 指定出站网卡)
sudo iptables -A INPUT -i eth0 -j ACCEPT
sudo iptables -A OUTPUT -o eth0 -j ACCEPT
# 按连接状态匹配(ESTABLISHED, RELATED 是已建立连接,NEW 是新建连接)
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 按 ICMP 类型匹配
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
sudo iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
2.4 规则基本操作
# 追加规则(-A):在链的最后添加规则
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 插入规则(-I):在链的开头或指定位置插入规则
sudo iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT
# 这条规则会被插入到 INPUT 链的第 1 位(最前面)
# 删除规则(-D):删除匹配的规则
sudo iptables -D INPUT -p tcp --dport 22 -j ACCEPT
# 按编号删除
sudo iptables -D INPUT 3 # 删除 INPUT 链的第 3 条规则
# 替换规则(-R):替换指定位置的规则
sudo iptables -R INPUT 3 -p tcp --dport 2222 -j ACCEPT
# 清空链的所有规则(-F)
sudo iptables -F INPUT # 清空 INPUT 链
sudo iptables -F OUTPUT # 清空 OUTPUT 链
sudo iptables -F # 清空 filter 表的所有链
# 设置默认策略(-P)
sudo iptables -P INPUT DROP # 默认拒绝所有入站
sudo iptables -P FORWARD DROP # 默认拒绝转发
sudo iptables -P OUTPUT ACCEPT # 默认允许所有出站
2.5 保存和恢复规则
# CentOS/RHEL: 使用 iptables-services
sudo yum install -y iptables-services
# 保存当前规则到文件
sudo iptables-save > /etc/sysconfig/iptables
# 从文件恢复规则
sudo iptables-restore < /etc/sysconfig/iptables
# 设置开机自动加载(CentOS)
sudo systemctl enable iptables
# Ubuntu: 使用 iptables-persistent
sudo apt-get install -y iptables-persistent
# 保存规则
sudo netfilter-persistent save
# Ubuntu 低版本使用:
sudo sh -c "iptables-save > /etc/iptables/rules.v4"
第三步:生产环境规则配置实战
3.1 最小化防火墙规则模板
以下是一套最小化、安全的 iptables 规则配置,适合大多数 Linux 服务器:
#!/bin/bash
# save as: setup_iptables.sh
# ⚠️ 重要:执行前确保你有 VNC/ILO 等备用登录方式
# 清空现有规则(会断开所有现有连接,确保这是通过本地 console 执行的)
sudo iptables -F
sudo iptables -X
sudo iptables -t nat -F
sudo iptables -t nat -X
sudo iptables -t mangle -F
sudo iptables -t mangle -X
# 设置默认策略
sudo iptables -P INPUT DROP # 默认拒绝所有入站
sudo iptables -P FORWARD DROP # 默认拒绝转发
sudo iptables -P OUTPUT ACCEPT # 默认允许所有出站
# 允许本地回环流量
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT
# 允许已建立的连接
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许 SSH(把你的 IP 替换进去,多个 IP 用逗号分隔)
ALLOWED_SSH_IPS="192.168.1.100"
for ip in $ALLOWED_SSH_IPS; do
sudo iptables -A INPUT -p tcp -s $ip --dport 22 -j ACCEPT
done
# 如果没有固定 IP,临时允许所有 SSH(生产环境建议用 fail2ban + 有限 IP)
# sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 允许 HTTP/HTTPS
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 允许 ICMP(ping),可选
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
# 保存规则
sudo iptables-save > /etc/sysconfig/iptables
# 如果是 Ubuntu
# sudo netfilter-persistent save
3.2 开放 MySQL/Redis 等数据库端口
⚠️ 警告:数据库端口(MySQL 3306、Redis 6379、MongoDB 27017 等)默认不应该暴露在公网。以下配置假设数据库只允许应用服务器访问。
# 允许应用服务器 IP 访问 MySQL(3306)
sudo iptables -A INPUT -p tcp -s 10.0.1.0/24 --dport 3306 -j ACCEPT
# 允许应用服务器 IP 访问 Redis(6379)
# 注意:Redis 默认没有密码,不应该暴露在公网
sudo iptables -A INPUT -p tcp -s 10.0.1.0/24 --dport 6379 -j ACCEPT
# 允许应用服务器 IP 访问 PostgreSQL(5432)
sudo iptables -A INPUT -p tcp -s 10.0.1.0/24 --dport 5432 -j ACCEPT
# 允许内网 IP 访问 MongoDB(27017)
sudo iptables -A INPUT -p tcp -s 10.0.1.0/24 --dport 27017 -j ACCEPT
# 保存规则
sudo iptables-save > /etc/sysconfig/iptables
3.3 限制 SSH 访问来源
# 只允许特定 IP 或 IP 段访问 SSH
# 先清除之前的 SSH 规则(如果有)
sudo iptables -D INPUT -p tcp --dport 22 -j ACCEPT
# 或者按编号删除
# sudo iptables -D INPUT <rule_number>
# 允许特定 IP 访问 SSH
sudo iptables -A INPUT -p tcp -s 192.168.1.100 --dport 22 -j ACCEPT
# 允许 IP 段访问 SSH
sudo iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 22 -j ACCEPT
# 允许多个 IP 段(用逗号分隔不生效,需要多条规则)
sudo iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp -s 10.0.0.0/8 --dport 22 -j ACCEPT
# 保存
sudo iptables-save > /etc/sysconfig/iptables
3.4 防止 SYN Flood 攻击
# 启用 SYN Cookie(防止 SYN Flood)
sudo sysctl -w net.ipv4.tcp_syncookies=1
# 限制 SYN 队列长度
sudo sysctl -w net.ipv4.tcp_max_syn_backlog=4096
# 在 iptables 中添加 SYN 限制
sudo iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m recent --set --name SYN_FLOOD
sudo iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m recent --update --seconds 10 --count 100 --rttl --name SYN_FLOOD -j DROP
# 限制每个 IP 的并发连接数
sudo iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j DROP
sudo iptables -A INPUT -p tcp --dport 443 -m connlimit --connlimit-above 50 -j DROP
3.5 配置 NAT 和端口转发
场景:内网服务器无法直接访问公网,需要通过有公网 IP 的服务器做 NAT 上网:
# 开启 IP 转发(临时)
sudo sysctl -w net.ipv4.ip_forward=1
# 开启 IP 转发(永久)
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
# 配置 SNAT(源地址转换,适合有固定公网 IP)
sudo iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.10
# 配置 MASQUERADE(动态源地址转换,适合公网 IP 会变化的情况)
sudo iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -o eth0 -j MASQUERADE
# 配置 DNAT(端口转发,把公网 IP 的 8080 端口转发到内网 10.0.1.100 的 80 端口)
sudo iptables -t nat -A PREROUTING -p tcp -d 203.0.113.10 --dport 8080 -j DNAT --to-destination 10.0.1.100:80
# 本机端口转发(访问本机的 8080 端口,转发到内网 10.0.1.100:80)
sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 10.0.1.100:80
sudo iptables -A FORWARD -d 10.0.1.100 -p tcp --dport 80 -j ACCEPT
# 保存 NAT 规则
sudo iptables-save > /etc/sysconfig/iptables
第四步:firewalld 基础操作
CentOS 7/8 和 RHEL 7/8 默认使用 firewalld 作为防火墙管理工具。firewalld 是 iptables 的上层封装,提供了 Zone(区域)和 Service(服务)的概念,简化了规则配置。
4.1 firewalld 基本概念
Zone(区域):firewalld 使用预定义的 Zone 来管理不同信任级别的网络:
drop:丢弃所有连接,完全不响应(最严格)
block:拒绝所有入站连接,并返回 ICMP 错误
public:不信任的网络,只允许选定的入站连接
external:用于外部网络,启用 NAT/MASQUERADE
dmz:只允许 SSH 入站(隔离区)
work:工作网络,信任程度较高
home:家庭网络,信任程度较高
internal:内部网络,信任程度较高
trusted:完全信任,允许所有流量
Service(服务):预定义的服务包含一组端口和协议:
ssh:22/TCP
http:80/TCP
https:443/TCP
mysql:3306/TCP
4.2 firewalld 基本命令
# 查看 firewalld 状态
sudo firewall-cmd --state
# running 表示运行中
# 查看默认 zone
sudo firewall-cmd --get-default-zone
# 查看激活的 zone
sudo firewall-cmd --get-active-zones
# 查看某个 zone 的规则
sudo firewall-cmd --zone=public --list-all
# 查看所有预定义服务
sudo firewall-cmd --get-services
# 查看所有预定义 ICMP 类型
sudo firewall-cmd --get-icmptypes
4.3 firewalld 配置规则
# 临时放行端口(重启后失效)
sudo firewall-cmd --add-port=8080/tcp
sudo firewall-cmd --add-port=3306/tcp
# 永久放行端口(重启后仍有效,需要 --permanent)
sudo firewall-cmd --permanent --add-port=8080/tcp
# 临时放行服务
sudo firewall-cmd --add-service=http
sudo firewall-cmd --add-service=https
# 永久放行服务
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
# 移除端口
sudo firewall-cmd --remove-port=8080/tcp
# 移除服务
sudo firewall-cmd --remove-service=http
# 允许特定 IP 访问端口
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port port="22" protocol="tcp" accept'
# 允许 IP 段访问端口
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="3306" protocol="tcp" accept'
# 拒绝特定 IP 访问
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="1.2.3.4" port port="22" protocol="tcp" reject'
# 丢弃来自特定 IP 的所有流量
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="1.2.3.4" drop'
# 限制并发连接数
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="0.0.0.0/0" port port="80" protocol="tcp" limit value="50/m" accept'
# 重新加载规则(每次修改 --permanent 规则后需要执行)
sudo firewall-cmd --reload
# 查看当前规则
sudo firewall-cmd --list-all
4.4 firewalld Zone 配置实战
# 将网卡添加到特定 Zone
sudo firewall-cmd --zone=trusted --change-interface=eth0
# 设置默认 Zone 为 trusted(完全信任)
sudo firewall-cmd --set-default-zone=trusted
# 为特定 Zone 添加服务
sudo firewall-cmd --zone=work --add-service=ssh
sudo firewall-cmd --zone=work --add-service=https
# 设置 Zone 的默认策略
sudo firewall-cmd --zone=public --set-target=DROP
sudo firewall-cmd --zone=public --add-service=ssh
sudo firewall-cmd --zone=public --add-service=http
4.5 firewalld 配置 NAT
# 开启 NAT(类似 iptables 的 MASQUERADE)
sudo firewall-cmd --permanent --zone=external --add-masquerade
# 端口转发
# 把 external zone 的 8080 端口转发到内网 10.0.1.100:80
sudo firewall-cmd --permanent --zone=external --add-forward-port=port=8080:proto=tcp:toport=80:toaddr=10.0.1.100
# IP 转发(类似 DNAT)
sudo firewall-cmd --permanent --zone=external --add-forward-port=port=80:proto=tcp:toaddr=10.0.1.100
# reload 后查看
sudo firewall-cmd --reload
sudo firewall-cmd --zone=external --list-all
第五步:ufw 基础操作(Ubuntu)
Ubuntu 默认使用 ufw(Uncomplicated Firewall),是 iptables 的简化封装。
5.1 ufw 基本命令
# 查看 ufw 状态
sudo ufw status verbose
# 启用 ufw
sudo ufw enable
# 禁用 ufw
sudo ufw disable
# 查看规则编号
sudo ufw status numbered
# 删除规则
sudo ufw delete <rule_number>
5.2 ufw 配置规则
# 设置默认策略
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 允许 SSH
sudo ufw allow ssh
# 或
sudo ufw allow 22/tcp
# 允许特定 IP 访问 SSH
sudo ufw allow from 192.168.1.100 to any port 22
# 允许 IP 段访问 SSH
sudo ufw allow from 192.168.1.0/24 to any port 22
# 允许 HTTP/HTTPS
sudo ufw allow http
sudo ufw allow https
# 或
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# 拒绝特定 IP
sudo ufw deny from 1.2.3.4
# 限制 SSH 登录(5 分钟内最多 6 次尝试)
sudo ufw limit 22/tcp
# 删除规则
sudo ufw delete allow 80/tcp
# 重置所有规则
sudo ufw reset
第六步:常见问题排错
6.1 被防火墙规则挡了,无法 SSH 登录
⚠️ 如果你已经把自己踢出去了,通过 VNC/ILO/云控制台登录:
# 1. 先查看当前规则
sudo iptables -L INPUT -n --line-numbers
# 2. 查看是否有 SSH 规则
sudo iptables -L INPUT -n | grep 22
# 3. 如果 SSH 规则没有了,从 console 本地添加
sudo iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT
# 4. 如果防火墙是 DROP 掉了所有流量,先允许 console 登录
# 在云环境中,eth0 通常是管理网卡
sudo iptables -I INPUT 1 -i eth0 -j ACCEPT
# 5. 如果是 firewalld,在 console 中执行
sudo firewall-cmd --zone=trusted --add-interface=eth0
sudo firewall-cmd --zone=public --add-service=ssh
6.2 规则顺序错误导致流量被意外放行
问题:添加了一条 REJECT 规则在 ACCEPT 规则之前,导致所有流量都被 REJECT 了。
# 查看规则顺序
sudo iptables -L INPUT -n --line-numbers
# 错误示例:
# Chain INPUT (policy ACCEPT)
# num target prot opt source destination
# 1 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
# 2 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
# 第 1 条规则把所有人都 REJECT 了,第 2 条永远不会匹配到
# 修复:删除错误的 REJECT 规则,插入到正确位置
sudo iptables -D INPUT 1 # 删除错误的规则
sudo iptables -I INPUT 2 -p tcp --dport 22 -j ACCEPT # 插入到正确位置(通常是最前面)
# firewalld 查看和删除 rich rule
sudo firewall-cmd --list-rich-rules
sudo firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="0.0.0.0/0" reject'
6.3 DNS 解析失败
问题:配置防火墙后,DNS 解析不工作了。
# DNS 使用 53/UDP
sudo iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
sudo iptables -A INPUT -p udp --sport 53 -j ACCEPT
# 或者允许所有 DNS 流量
sudo iptables -A OUTPUT -p udp -m udp --dport 53 -j ACCEPT
sudo iptables -A INPUT -p udp -m udp --sport 53 -j ACCEPT
6.4 规则生效但端口仍然无法访问
排查顺序:
# 1. 确认规则是否已添加
sudo iptables -L INPUT -n | grep <port>
# 2. 确认端口确实在监听
sudo ss -tunapl | grep <port>
sudo netstat -tunapl | grep <port>
# 3. 确认服务已启动
sudo systemctl status <service-name>
# 4. 确认链的默认策略
sudo iptables -L | grep "policy"
# 5. 查看数据包计数(判断规则是否被匹配)
sudo iptables -L INPUT -n -v
# pkts 列:如果一直是 0,说明规则没有被匹配到
# 6. 尝试抓包确认数据包是否到达
sudo tcpdump -i eth0 port <port> -n
6.5 服务启动后端口未监听
# 查看服务状态
sudo systemctl status nginx
# 查看端口是否监听
sudo ss -tunapl | grep :80
# 查看服务启动日志
sudo journalctl -u nginx -n 50
# 如果是 Docker 容器,检查容器是否在运行
sudo docker ps
# 检查 iptables 规则是否有误拦截
sudo iptables -L INPUT -n --counter | grep <port>
第七步:生产环境防火墙管理最佳实践
7.1 规则变更流程
# 1. 变更前:备份当前规则
sudo iptables-save > /etc/sysconfig/iptables.bak.$(date +%Y%m%d_%H%M%S)
# 2. 变更中:先在本地 console 测试(如果有)
# 如果必须通过 SSH 操作,先开一个新的 SSH session 测试
# 新增规则时先写好删除命令,万一失败可以立即回滚
# 3. 变更后:验证
# - 确认新规则已添加
sudo iptables -L INPUT -n | grep <port>
# - 验证端口可达性
# 从外部机器测试:telnet <server-ip> <port>
# 或:nc -zv <server-ip> <port>
# - 验证业务功能正常
# 4. 保存规则
sudo iptables-save > /etc/sysconfig/iptables
7.2 防火墙规则审计脚本
#!/bin/bash
# save as: iptables_audit.sh
# 定期审计防火墙规则
echo "===== iptables 规则审计 ====="
echo "执行时间: $(date)"
echo ""
echo "[1] 默认策略"
sudo iptables -L -n | grep "policy"
echo ""
echo "[2] INPUT 链规则数量"
sudo iptables -L INPUT -n | wc -l
echo ""
echo "[3] 当前监听端口"
sudo ss -tunapl | grep LISTEN | awk '{print $5}' | awk -F: '{print $2}' | sort -n | uniq
echo ""
echo "[4] SSH 访问规则"
sudo iptables -L INPUT -n | grep ":22 "
echo ""
echo "[5] 所有 ACCEPT 规则(允许的流量)"
sudo iptables -L INPUT -n | grep ACCEPT
echo ""
echo "[6] 所有 DROP/REJECT 规则(拒绝的流量)"
sudo iptables -L INPUT -n | grep -E "DROP|REJECT"
echo ""
echo "[7] NAT 规则"
sudo iptables -t nat -L -n --line-numbers
echo ""
echo "[8] 规则保存位置"
if [ -f /etc/sysconfig/iptables ]; then
echo "规则已保存到 /etc/sysconfig/iptables"
echo "最后修改时间: $(stat -c %y /etc/sysconfig/iptables)"
else
echo "⚠️ 警告:规则未保存到 /etc/sysconfig/iptables"
fi
总结
Linux 防火墙的核心是理解表、链、规则顺序三个概念:
iptables 的处理顺序:
数据包 → PREROUTING → 路由判断 → INPUT/FORWARD/OUTPUT → POSTROUTING → 数据包
生产环境防火墙配置原则:
-
默认拒绝:INPUT 和 FORWARD 链默认策略设为 DROP -
最小权限:只开放业务必需的端口 -
来源限制:SSH 端口只允许运维 IP 访问,禁止 0.0.0.0/0 -
规则顺序:允许规则在前,拒绝规则在后 -
状态追踪:放行 ESTABLISHED,RELATED 连接,减少规则数量 -
日志审计:记录 DROP 的流量,便于发现攻击 -
备份恢复:变更前备份,变更后验证,异常时回滚
工具选择:
-
CentOS 7/8、RHEL 7/8:使用 firewalld -
Ubuntu:使用 ufw -
Debian、CentOS 6 及更早版本:使用 iptables
排错核心:规则不生效时,先看顺序(iptables -L -n –line-numbers),再看默认策略,最后用 tcpdump 抓包确认数据包是否到达。
转自:运维派
版权申明:内容来源网络,版权归原创者所有,如有侵权请联系删除
想了解更多干货,可通过下方扫码关注

可扫码添加上智启元官方客服微信👇

17认证网








