深入 Linux 防火墙:双组件原理与落地配置指南17认证网

正规官方授权
更专业・更权威

深入 Linux 防火墙:双组件原理与落地配置指南

问题背景

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 → 数据包

生产环境防火墙配置原则

  1. 默认拒绝:INPUT 和 FORWARD 链默认策略设为 DROP
  2. 最小权限:只开放业务必需的端口
  3. 来源限制:SSH 端口只允许运维 IP 访问,禁止 0.0.0.0/0
  4. 规则顺序:允许规则在前,拒绝规则在后
  5. 状态追踪:放行 ESTABLISHED,RELATED 连接,减少规则数量
  6. 日志审计:记录 DROP 的流量,便于发现攻击
  7. 备份恢复:变更前备份,变更后验证,异常时回滚

工具选择

  • CentOS 7/8、RHEL 7/8:使用 firewalld
  • Ubuntu:使用 ufw
  • Debian、CentOS 6 及更早版本:使用 iptables

排错核心:规则不生效时,先看顺序(iptables -L -n –line-numbers),再看默认策略,最后用 tcpdump 抓包确认数据包是否到达。

转自:运维派

版权申明:内容来源网络,版权归原创者所有,如有侵权请联系删除

想了解更多干货,可通过下方扫码关注

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

未经允许不得转载:17认证网 » 深入 Linux 防火墙:双组件原理与落地配置指南
分享到:0

评论已关闭。

400-663-6632
咨询老师
咨询老师
咨询老师