Linux 防火墙(iptable、nftables、ufw)

Linux 防火墙

Linux 防火墙的核心是内核态的包过滤引擎 + 用户态的配置工具 ,前者是真正实现网络流量拦截/放行的核心,后者是管理员操作内核引擎的接口。与Windows可视化防火墙不同,Linux防火墙均为命令行操作,且分经典原生工具(iptables)新一代原生工具(nftables)新手友好型前端工具(ufw/firewalld) 三类,适配不同发行版和使用场景。

一、Linux 防火墙原理

Linux 防火墙的底层核心是内核中的 netfilter 框架 (Linux 2.4及以上内核原生集成),它是内核级的包过滤引擎,工作在网络层(IP)传输层(TCP/UDP) ,所有网络数据包进入/离开服务器时,都会经过netfilter的检查点,按预设规则处理。

1. 工作逻辑

数据包从网卡进入服务器到最终到达应用/离开服务器,会经过netfilter5个固定检查点 (对应iptables的5条链),每个检查点都会匹配预设规则,匹配到即执行动作,不再向下匹配 ,未匹配到则执行默认策略(兜底规则)。

复制代码
复制
用户空间
    ↑
[应用层]
    ↓
[NAT/路由决策] ← PREROUTING (DNAT)
    ↓
[路由判断] → 本机? → [INPUT] → 本地进程
    ↓                    ↑
   FORWARD ←--------------------------------- 回复流
    ↓                    ↓
[POSTROUTING] → 出接口 (SNAT)
    ↓
网络接口
  • PREROUTING:刚进入协议栈,路由决策前(DNAT/端口转发)
  • INPUT:路由到本机的包(入站过滤)
  • FORWARD:路由转发的包(网关/防火墙)
  • OUTPUT:本机进程发出的包(出站控制)
  • POSTROUTING:离开协议栈前(MASQUERADE/SNAT)

核心原则最小权限原则------只放行必要的流量,默认拒绝所有未明确允许的流量,这是服务器防火墙配置的黄金准则。

2. 核心概念

无论使用iptables/ufw/firewalld,都绕不开以下3个概念:

(1)规则(Rule)

防火墙的最小执行单元,由匹配条件 +处理动作组成:

  • 匹配条件:源IP、目的IP、协议(TCP/UDP/ICMP)、端口、连接状态、网卡、用户代理等;
  • 处理动作 :服务器常用3种,优先级从高到低:
    • DROP:丢弃数据包,无任何回应(攻击者显示"超时",推荐使用,避免被探测);
    • REJECT:拒绝数据包,返回错误信息(如connection refused,易被攻击者探测,不推荐);
    • ACCEPT:允许数据包通过,放行合法流量。
(2)默认策略(Default Policy)

链的兜底规则,当数据包未匹配到任何自定义规则时,执行默认策略。

  • 入站流量(INPUT)默认DROP,出站流量(OUTPUT)默认ACCEPT,转发流量(FORWARD)默认DROP(单机服务器禁用转发);
  • 设置默认DROP前,必须先放行SSH(22端口)和本地回环,否则会直接断连!
(3)规则执行顺序

从上到下,精准优先,匹配即停止

  • 规则按添加顺序排列,越靠前的规则优先级越高;
  • 配置时需遵循**「封禁恶意IP→放行精准规则→放行通用规则→默认策略」**的顺序,避免规则冲突。

二、经典内核原生防火墙:iptables(所有Linux发行版支持)

iptables是netfilter框架的经典用户态配置工具(Linux 2.4+),也是所有前端工具(ufw/firewalld)的底层基础,功能强大但命令复杂,适合运维人员和精细化配置场景。

注意:iptables本身不是防火墙 ,只是操作netfilter内核引擎的命令行工具,真正的防火墙是内核中的netfilter

1. iptables 核心架构:四表五链

iptables通过 对规则按功能分类 ,通过 定义规则的触发时机 (数据包的检查点),规则最终存储在「表的链 」中,核心为四表五链 ,90%的场景只需掌握filter表(过滤)nat表(地址转换)

(1)四表

按功能划分,优先级从高到低

表名 核心功能 包含的链 日常使用频率 适用场景
raw 关闭连接跟踪,实现数据包免检,提升性能 PREROUTING、OUTPUT 极低 高并发服务器性能优化,新手无需关注
mangle 修改数据包头部(TTL/TOS/MARK),实现QOS流量整形 所有5条链 网络带宽管理、流量标记,小众场景
nat 网络地址转换(SNAT/DNAT) PREROUTING、POSTROUTING、OUTPUT 内网网关(内网上网)、端口映射(公网访问内网服务)
filter 数据包过滤(防火墙核心功能),决定放行/拦截 INPUT、OUTPUT、FORWARD 极高(默认表) 单机服务器防护(放行端口/封禁IP/限流),90%的场景用此表
(2)五链

数据包触发时机划分,对应netfilter的5个检查点

链名 触发时机 核心作用 关联核心表 常用场景
INPUT 数据包经路由后,目标是本机(如访问本机SSH/80端口) 控制外部对本机的访问 filter 单机服务器核心防护链,重点配置
OUTPUT 本机应用生成的数据包,向外发出(如本机访问外网) 控制本机对外的访问 filter/nat 一般默认放行,无需过多配置
FORWARD 数据包经路由后,目标不是本机,需本机转发 控制跨网段/内网转发 filter/nat 网关/路由器场景,单机服务器禁用
PREROUTING 数据包刚进入网卡,未做路由决策前 目标地址转换(DNAT)、端口映射 nat/raw 公网端口映射到内网服务(如公网8080→内网80)
POSTROUTING 数据包即将离开网卡,路由决策完成后 源地址转换(SNAT)、内网伪装 nat 内网机器通过网关访问外网(如192.168.1.0/24→公网IP)

2. iptables 基础操作

(1)安装与状态检查
bash 复制代码
# Ubuntu/Debian 安装
apt update && apt install -y iptables iptables-persistent
# CentOS/RHEL 安装
yum install -y iptables-services
# 查看服务状态
systemctl status iptables
# 开机自启
systemctl enable iptables
(2)核心查看/清空命令
bash 复制代码
# 查看所有规则(-n:数字显示IP/端口,-v:详细信息,-L:列出,--line-numbers:显示行号(删规则用))
iptables -nvL --line-numbers
# 只查看filter表INPUT链(重点,单机服务器核心)
iptables -nvL INPUT --line-numbers
# 查看指定表(如nat表)的规则
iptables -t nat -nvL

# 清空所有链的规则(不修改默认策略,安全)
iptables -F
# 清空指定链(如INPUT)的规则
iptables -F INPUT
# 重置所有规则(清空规则+恢复默认策略为ACCEPT)
iptables -F && iptables -X && iptables -P INPUT ACCEPT && iptables -P OUTPUT ACCEPT && iptables -P FORWARD ACCEPT
(3)设置默认策略

单机服务器(非网关) 只需配置filter表,必须先放行22端口和本地回环,再设默认DROP,否则直接断连

bash 复制代码
# 设filter表三大链默认策略(推荐配置)
iptables -P INPUT DROP    # 入站默认丢弃
iptables -P OUTPUT ACCEPT # 出站默认放行
iptables -P FORWARD DROP  # 转发默认丢弃(单机禁用)

3. iptables 核心配置

单机服务器防护,防挖矿/防SSH暴力破解

规则执行顺序 配置,执行完必须保存规则 ,否则重启后丢失!以下为Ubuntu/Debian/CentOS通用配置,适配Web服务器(放行22/80/443)。

bash 复制代码
# 步骤1:放行本地回环(127.0.0.1),必备!本机程序通信依赖
iptables -A INPUT -i lo -j ACCEPT
# 步骤2:放行已建立的连接,必备!否则服务器无法给客户端回应(如访问80端口后无页面返回)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 步骤3:封禁恶意IP(矿池IP/暴力破解IP,如之前的31.56.209.53/192.168.1.226)
iptables -A INPUT -s 31.56.209.53 -j DROP
iptables -A INPUT -s 192.168.1.226 -j DROP
# 步骤4:放行核心合法端口(SSH/22、HTTP/80、HTTPS/443),TCP协议
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 步骤5:限制访问频率(防SSH暴力破解/CC攻击),limit模块
iptables -A INPUT -p tcp --dport 22 -m limit --limit 60/min --limit-burst 10 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -m limit --limit 100/min --limit-burst 20 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -m limit --limit 100/min --limit-burst 20 -j ACCEPT
# 步骤6:保存规则(重中之重!)
# Ubuntu/Debian
iptables-save > /etc/iptables/rules.v4
# CentOS/RHEL
service iptables save

4. iptables 高级用法

(1)ipset 批量封禁恶意IP(适合大量IP,比单条iptables规则高效)
bash 复制代码
# 安装ipset
apt install -y ipset || yum install -y ipset
# 创建ipset集合(命名为malicious_ip,类型为hash:ip)
ipset create malicious_ip hash:ip
# 添加恶意IP到集合
ipset add malicious_ip 31.56.209.53
ipset add malicious_ip 192.168.1.226
# 批量封禁集合中的所有IP
iptables -A INPUT -m set --match-set malicious_ip src -j DROP
# 查看集合
ipset list malicious_ip
# 删除集合中的IP
ipset del malicious_ip 31.56.209.53
(2)DNAT 端口映射(公网→内网,如公网8080→内网192.168.1.100:80)
bash 复制代码
# 开启内核转发(网关必备)
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf && sysctl -p
# 配置DNAT(PREROUTING链,nat表)
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
# 配置SNAT(POSTROUTING链,nat表),内网伪装成公网IP
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 你的公网IP

5. iptables 规则维护(删规则/解封IP/重启)

bash 复制代码
# 1. 查规则行号
iptables -nvL INPUT --line-numbers
# 2. 删除指定行号的规则(如INPUT链第5行)
iptables -D INPUT 5
# 3. 解封指定IP(删除封禁规则)
iptables -D INPUT -s 31.56.209.53 -j DROP
# 4. 重启iptables(规则生效)
systemctl restart iptables (CentOS) || systemctl restart netfilter-persistent (Ubuntu)
# 5. 备份规则
iptables-save > /root/iptables_backup_$(date +%Y%m%d).conf
# 6. 恢复规则
iptables-restore < /root/iptables_backup_20260327.conf

三、新一代内核原生防火墙:nftables(Linux 3.13+)

nftables是Linux内核推出的新一代netfilter配置工具 (替代iptables),解决了iptables规则冗余、性能低、IPv4/IPv6分离配置的问题,语法更简洁,性能更高,是未来Linux防火墙的主流。

特点:单内核模块、IPv4/IPv6统一配置、规则集更简洁、支持变量/条件判断,CentOS8+/Ubuntu20.04+默认推荐使用。

1. nftables 优势

特性 iptables nftables
内核模块 多模块(iptables_filter/iptables_nat等) 单模块(nftables),资源占用低
配置方式 IPv4/IPv6分离(iptables/ip6tables) IPv4/IPv6统一配置,一条规则适配双协议
规则存储 规则分散,冗余度高 规则集式存储,无冗余
语法 命令繁琐,无变量 语法简洁,支持变量/条件判断/正则
性能 高并发下性能下降 性能更高,支持批量规则匹配

2. nftables 基础操作

bash 复制代码
# 安装
apt install -y nftables || yum install -y nftables
# 启动并开机自启
systemctl start nftables && systemctl enable nftables
# 查看规则
nft list ruleset
# 清空所有规则
nft flush ruleset

3. nftables 配置

单机Web服务器,替代iptables

bash 复制代码
# 步骤1:创建表(命名为inet filter,inet表示适配IPv4/IPv6,filter为表名)
nft add table inet filter
# 步骤2:创建链(input链,默认策略DROP)
nft add chain inet filter input { type filter hook input priority 0; policy drop; }
# 步骤3:添加规则(放行本地回环+已建立连接+核心端口+封禁恶意IP)
nft add rule inet filter input iif lo accept
nft add rule inet filter input ct state established,related accept
nft add rule inet filter input ip saddr 31.56.209.53 drop
nft add rule inet filter input tcp dport {22,80,443} accept
# 步骤4:保存规则(自动保存到/etc/nftables.conf)
nft list ruleset > /etc/nftables.conf

四、新手友好型前端工具:ufw & firewalld

对于新手,无需记复杂的iptables/nftables命令,Linux发行版提供了轻量前端工具,底层仍调用iptables/nftables,但操作极简,适配不同发行版:

  • ufw:Ubuntu/Debian默认,轻量极简,无多余特性,专为单机服务器设计;
  • firewalld :CentOS7+/RHEL/Fedora默认,动态防火墙,支持区域(Zone) 概念,适合桌面/服务器/网关。

(一)UFW(Uncomplicated Firewall)

Ubuntu/Debian专属,极简高效

UFW的设计哲学是简单,所有命令都直观易懂,核心围绕「放行/封禁」,适合单机服务器新手。

1. UFW 基础操作
bash 复制代码
# 查看状态(verbose显示详细信息)
ufw status verbose
# 启用UFW(启用前务必先放行22端口,否则断连!)
ufw enable
# 禁用UFW
ufw disable
# 重置UFW(清空所有规则+恢复默认)
ufw reset
2. UFW 核心配置(默认策略+放行/封禁)
bash 复制代码
# 步骤1:设置默认策略(推荐)
ufw default deny incoming  # 入站默认拒绝
ufw default allow outgoing # 出站默认允许
# 步骤2:放行核心服务/端口(支持服务名/端口号,服务名对应/etc/services)
ufw allow ssh/tcp  # 放行SSH(22/tcp),等同于ufw allow 22/tcp
ufw allow http/tcp # 放行HTTP(80/tcp)
ufw allow https/tcp# 放行HTTPS(443/tcp)
# 步骤3:封禁恶意IP
ufw deny from 31.56.209.53 to any
# 步骤4:只允许内网IP访问SSH(精细化控制)
ufw allow from 192.168.1.0/24 to any port 22 proto tcp
# 步骤5:删除规则(先查规则号,再删)
ufw status numbered
ufw delete 3 # 删除第3条规则
3. UFW 日志开启(排查问题)
bash 复制代码
# 开启日志(low/medium/high,推荐medium)
ufw logging medium
# 查看UFW日志(默认/var/log/ufw.log)
tail -f /var/log/ufw.log
# 过滤被封禁的IP
grep "UFW BLOCK" /var/log/ufw.log

(二)Firewalld:CentOS7+/RHEL专属,动态防火墙(支持区域)

Firewalld的核心特性是动态更新规则 (无需重启服务)和区域(Zone) ,将网络按信任级别划分为不同区域,每个区域有独立的规则,适合复杂网络环境。

1. Firewalld 核心概念:区域(Zone)

默认提供9个区域,信任级别从高到低 ,默认区域为public(不信任的公共网络),可根据网卡的网络环境切换区域:

区域 信任级别 核心规则
trusted 最高 允许所有入站流量
internal 允许内网入站流量,适合内网服务器
public 默认 只允许放行的端口/服务,适合公网服务器
dmz 只允许放行的服务,适合隔离区(如数据库服务器)
drop 最低 丢弃所有入站流量,无任何回应
2. Firewalld 基础操作
bash 复制代码
# 安装(CentOS7+默认安装)
yum install -y firewalld
# 启动并开机自启
systemctl start firewalld && systemctl enable firewalld
# 查看状态
systemctl status firewalld
# 查看所有区域规则
firewall-cmd --list-all-zones
# 查看默认区域规则(public)
firewall-cmd --list-all
3. Firewalld 核心配置(默认区域public,公网服务器)
bash 复制代码
# 步骤1:设置默认策略(入站默认拒绝)
firewall-cmd --set-default-zone=public
# 步骤2:放行核心服务/端口(--permanent表示永久生效,需重新加载)
firewall-cmd --permanent --add-service=ssh
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
# 按端口放行(如8080/tcp)
firewall-cmd --permanent --add-port=8080/tcp
# 步骤3:封禁恶意IP(需安装firewalld-rich-rules)
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="31.56.209.53" drop'
# 步骤4:只允许内网访问SSH
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="22" accept'
# 步骤5:重新加载规则(永久规则生效)
firewall-cmd --reload
# 步骤6:删除规则
firewall-cmd --permanent --remove-service=http
firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="31.56.209.53" drop'
firewall-cmd --reload
4. Firewalld 高级配置:端口转发(DNAT)
bash 复制代码
# 开启内核转发
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf && sysctl -p
# 开启masquerade(地址伪装,必备)
firewall-cmd --permanent --add-masquerade
# 配置端口转发(公网8080→内网192.168.1.100:80)
firewall-cmd --permanent --add-forward-port=port=8080:proto=tcp:toaddr=192.168.1.100:toport=80
firewall-cmd --reload

五、Linux 防火墙日志与排错

配置防火墙后,日志是排查问题的唯一途径,可通过日志查看「哪些IP被封禁、哪些流量被拦截、规则是否生效」,不同防火墙的日志路径和开启方式不同。

1. 各防火墙日志路径与筛选命令

防火墙工具 日志默认路径 核心筛选命令
iptables /var/log/syslog(Ubuntu)/var/log/messages(CentOS) grep "iptables DROP" /var/log/syslog
ufw /var/log/ufw.log grep "UFW BLOCK" /var/log/ufw.log
firewalld /var/log/syslog grep "firewalld DENY" /var/log/syslog

2. 关键排错场景与解决方法

(1)场景1:配置后SSH断连
  • 原因:设置默认DROP前未放行22端口,或规则顺序错误;
  • 解决 :物理机接显示器/云服务器通过控制台登录,执行iptables -P INPUT ACCEPT(临时放行),重新配置规则。
(2)场景2:规则配置后不生效
  • 原因:未保存规则/未重新加载服务/云服务器安全组未放行;
  • 解决 :① 保存规则(iptables-save/ufw enable/firewall-cmd --reload);② 检查云服务器安全组(云服务器安全组优先级高于本地防火墙,需先在控制台放行端口)。
(3)场景3:合法流量被拦截
  • 原因:规则冲突(如先封禁了整个IP段,再放行单个IP);
  • 解决 :① 查看日志grep "DROP" /var/log/syslog找到被拦截的IP/端口;② 调整规则顺序(精准规则放前面)。

3. 自动化封禁恶意IP:fail2ban(搭配防火墙使用)

手动封禁IP效率低,可通过fail2ban监控日志,自动封禁频繁发起恶意请求的IP(如SSH暴力破解、CC攻击),底层调用iptables/ufw/firewalld。

bash 复制代码
# 安装
apt install -y fail2ban || yum install -y fail2ban
# 配置SSH防护(编辑/etc/fail2ban/jail.local)
cat > /etc/fail2ban/jail.local << EOF
[sshd]
enabled = true
maxretry = 3  # 3次失败后封禁
bantime = 3600 # 封禁1小时
findtime = 600 # 10分钟内达到maxretry
banaction = iptables-multiport # 适配iptables
EOF
# 重启fail2ban
systemctl restart fail2ban && systemctl enable fail2ban
# 查看被封禁的IP
fail2ban-client status sshd

六、Linux 防火墙选型与最佳实践

1. 选型建议

使用场景 推荐工具 理由
Ubuntu/Debian 单机服务器 UFW 极简,命令直观,专为单机设计,无需复杂配置
CentOS7+/RHEL 单机/网关服务器 Firewalld 动态规则,支持区域,适配复杂网络环境,自带端口转发
老系统(CentOS6/Ubuntu16.04) iptables 原生支持,无依赖,稳定可靠
新系统(CentOS8+/Ubuntu20.04+)/高并发服务器 nftables 性能高,IPv4/IPv6统一,规则简洁,未来主流
运维精细化配置/网关/路由 iptables/nftables 功能强大,支持所有高级特性(SNAT/DNAT/流量整形)

2. 实践准则

  1. 最小权限原则:只放行必要的端口/IP/服务,默认拒绝所有未明确允许的流量;
  2. 规则顺序原则 :按「封禁恶意IP→放行精准规则→放行通用规则」排序,精准规则放前面;
  3. 必放行规则:任何配置都必须先放行「本地回环(lo)」和「已建立的连接(ESTABLISHED,RELATED)」;
  4. 保存规则:配置后必须保存/重新加载,避免重启后规则丢失;
  5. 双层防护 :云服务器需「云安全组(硬件防火墙)+ 本地防火墙(软件防火墙)」,安全组优先级更高;
  6. 日志监控:开启防火墙日志,定期检查,结合fail2ban实现自动化封禁;
  7. 避免重复配置 :不要同时启用iptables和firewalld(会冲突),CentOS7+需先禁用iptables:systemctl stop iptables && systemctl disable iptables
相关推荐
Mapleay2 小时前
alsa-lib 的插件
linux
枫桥骤雨2 小时前
Ubuntu NVM部署Node.js教程
linux·ubuntu·node.js·nvm
bearpping2 小时前
nginx 代理 redis
运维·redis·nginx
z10_142 小时前
静态住宅IP VS 动态住宅IP,怎么选择?
服务器·网络·tcp/ip
网管NO.12 小时前
OpenClaw 完整配置详解 - 逐项深度剖析
运维·网络·人工智能
网管NO.12 小时前
OpenClaw 完整部署教程(双方案 + 混合模型)
运维·服务器·网络
cui_win2 小时前
Rocky Linux(9.7) 完整使用指南(ISO下载 + 系统安装 + 网络配置)
linux·网络·rocky linux
吴声子夜歌2 小时前
TypeScript——类型基础(一)
linux·ubuntu·typescript
有毒的教程2 小时前
Ubuntu 日常常用命令速查表(新手版)
linux·服务器·ubuntu