Linux安全 | 防火墙工具 iptables 详解

iptables 是 Linux 系统中功能强大的内核级防火墙工具,通过配置规则实现对网络数据包的过滤、转发和地址转换等操作,是保障 Linux 服务器网络安全的核心组件之一。

本指南将从基础概念、核心架构、语法规则到实际操作进行系统性讲解。

更多技术专栏【linux】

一、iptables 基础概念

在学习 iptables 之前,需先理解防火墙的分类及操作系统的内核 / 用户空间概念,这是掌握 iptables 工作原理的基础。

1. 防火墙分类

(1)按逻辑功能分类
分类 说明
主机防火墙 针对单个主机进行防护,仅保护安装防火墙的主机本身,如 Linux 本机的 iptables。
网络防火墙 部署在网络边缘或入口(如网关、路由器),保护整个局域网,如企业出口的硬件防火墙。
(2)按物理形态分类
分类 说明
硬件防火墙 硬件级别实现防火墙功能,性能强、稳定性高,通常用于企业级场景(如华为、思科硬件防火墙)。
软件防火墙 基于通用硬件平台(如 x86 服务器),通过应用软件实现防火墙逻辑,iptables 即典型的软件防火墙。

2. 内核空间与用户空间

Linux 操作系统将内存划分为两个核心区域,iptables 的工作依赖于这两个区域的协作:

  • 内核空间(内核态)

    操作系统内核占据的内存区域,拥有最高权限,负责硬件管理、内存调度和网络数据包处理。iptables 的核心规则引擎运行在此区域,直接处理数据包。

  • 用户空间(用户态)

    普通用户进程所在的内存区域,权限受限。用户通过 iptables 命令(运行在用户态)配置规则,规则最终会被加载到内核空间生效。

二、iptables 核心架构:四表五链

iptables 的核心是 "表(Table)" 和 "链(Chain)" 的组合,表决定功能,链决定数据包流经的位置,规则则配置在 "链" 上实现具体逻辑。

1. 四表:定义功能维度

表是规则的集合,不同表对应不同的网络功能,内核通过加载不同模块实现表的功能。

表(Table) 核心功能 依赖内核模块
filter 表 最常用表,负责数据包过滤(允许 / 拒绝数据包通过),是防火墙的核心功能。 iptable_filter
nat 表 实现网络地址转换(如 SNAT 源地址转换、DNAT 目标地址转换),用于局域网访问互联网或端口转发。 iptable_nat
mangle 表 拆解数据包,修改数据包的 TOS(服务类型)、TTL(生存时间)等字段,用于流量整形或标记。 iptable_mangle
raw 表 关闭 nat 表启用的连接追踪机制,用于处理不需要追踪的数据包(如高并发服务),优先级最高。 iptable_raw

2. 五链:定义数据包流经路径

链是内核中预设的数据包处理节点,数据包从进入主机到离开主机会依次经过不同的链,规则按顺序在链上执行。

链(Chain) 流经时机 关联的表(优先级从高到低)
PREROUTING 数据包进入主机后、路由判断前(如 DNAT 需在此链处理,修改目标地址后再路由)。 raw 表 → mangle 表 → nat 表
INPUT 数据包经过路由判断后,目标是本机(如访问本机的 80 端口),用于主机本地防护。 mangle 表 → filter 表
FORWARD 数据包经过路由判断后,需转发到其他主机(如本机作为网关时),用于转发过滤。 mangle 表 → filter 表
OUTPUT 本机主动发送的数据包(如本机访问外部网站),在路由判断前处理。 raw 表 → mangle 表 → nat 表 → filter 表
POSTROUTING 数据包转发或发送前、离开主机前(如 SNAT 需在此链处理,修改源地址后再发送)。 mangle 表 → nat 表

3. 表与链的关联及优先级

(1)表 - 链关联关系
表(Table) 包含的链(Chain)
raw 表 PREROUTING、OUTPUT
mangle 表 PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
nat 表 PREROUTING、OUTPUT、POSTROUTING
filter 表 INPUT、FORWARD、OUTPUT
(2)表的优先级(从高到低)

raw 表mangle 表nat 表filter 表即数据包会先经过高优先级表的链,再进入低优先级表的链,例如:外部数据包进入主机时,先经过 raw 表的 PREROUTING 链,再到 mangle 表的 PREROUTING 链,最后到 nat 表的 PREROUTING 链。

三、iptables 基本语法

iptables 命令的核心格式为 "指定表→指定链→匹配条件→执行动作",需熟练掌握常用参数、动作和操作命令。

1. 核心处理动作(-j 选项指定)

动作决定数据包匹配规则后的处理方式,常用动作如下:

动作(Target) 含义
ACCEPT 允许数据包通过,继续向下一个链或表传递。
DROP 直接丢弃数据包,不向客户端返回任何响应(客户端会等待超时)。
REJECT 拒绝数据包通过,向客户端返回 "拒绝响应"(如 ICMP 不可达),客户端会立即知道被拒绝。
SNAT 源地址转换,修改数据包的源 IP(如局域网主机通过网关访问互联网时,将私有 IP 改为公网 IP)。
DNAT 目标地址转换,修改数据包的目标 IP(如端口转发时,将访问网关的 IP 改为内网服务器 IP)。
REDIRECT 端口重定向,将数据包的目标端口修改为本机的其他端口(如将 8080 端口转发到 80 端口)。

2. 常用操作命令

操作命令用于对链中的规则进行增、删、改、清等操作:

操作命令 英文全称 说明
-A Append 在指定链的尾部添加一条新规则(新规则最后执行)。
-D Delete 删除链中匹配的规则(可按规则序号或匹配条件删除)。
-R Replace 替换链中指定序号的规则(修改已有规则)。
-I Insert 在指定链的首部或指定位置插入一条新规则(新规则优先执行)。
-F Flush 清空指定表或所有表的所有链规则(需谨慎使用,避免误删所有防护规则)。
-P Policy 设置指定链的默认策略(当数据包不匹配任何规则时,按默认策略处理,可选 ACCEPT/DROP)。

3. 常见匹配参数

匹配参数用于定义 "哪些数据包会被规则处理",常用参数如下:

匹配参数 说明
-s 源 IP / 网段 指定数据包的源地址 (如 -s 192.168.150.129-s 192.168.150.0/24),多个地址用逗号分隔。
-d 目标 IP / 网段 指定数据包的目标地址 (用法同 -s)。
-p 协议 指定数据包的协议类型 (如 -p tcp-p udp-p icmp)。
--dport 端口 指定数据包的目标端口 (仅用于 TCP/UDP 协议,如 --dport 80 匹配访问 80 端口的请求)。
--sport 端口 指定数据包的源端口 (用法同 --dport,如 --sport 1024:65535 匹配源端口在 1024-65535 之间的数据包)。
-i 网卡 指定数据包的流入网卡 (如 -i ens33,仅用于 INPUT、PREROUTING、FORWARD 链,因为 OUTPUT 链的数据包是本机发出的,无 "流入网卡")。
-o 网卡 指定数据包的流出网卡 (用法同 -i,仅用于 OUTPUT、POSTROUTING、FORWARD 链)。

四、iptables 实战操作

以下操作基于 Linux 系统(如 CentOS、Ubuntu),所有命令需以 root 用户执行(或加 sudo)。

1. 增加规则(-A/-I)

(1)在 INPUT 链尾部添加规则:允许 192.168.150.10 访问本机的 22 端口(SSH)

bash

复制代码
# -t filter:使用 filter 表(默认表,可省略);-A INPUT:在 INPUT 链尾部添加;-p tcp:匹配 TCP 协议;--dport 22:目标端口 22;-j ACCEPT:允许通过
iptables -t filter -A INPUT -p tcp --dport 22 -s 192.168.150.10 -j ACCEPT
(2)在 INPUT 链首部插入规则:拒绝所有来自 192.168.150.15 的数据包

bash

复制代码
# -I INPUT:在 INPUT 链首部插入(优先执行);-s 192.168.150.15:源地址为 192.168.150.15;-j DROP:丢弃数据包
iptables -I INPUT -s 192.168.150.15 -j DROP
(3)在 INPUT 链指定位置插入规则:在第 2 条规则位置插入 "允许 192.168.150.16 访问本机 80 端口(HTTP)"

bash

复制代码
iptables -I INPUT 2 -p tcp --dport 80 -s 192.168.150.16 -j ACCEPT

2. 查看规则(iptables -L)

查看当前 iptables 规则(加 -n 以 IP 形式显示,避免解析域名;加 --line-numbers 显示规则序号):

bash

复制代码
iptables -L INPUT -n --line-numbers

输出示例:

plaintext

复制代码
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    DROP       all  --  192.168.150.15       0.0.0.0/0           
2    ACCEPT     tcp  --  192.168.150.16       0.0.0.0/0           tcp dpt:80
3    ACCEPT     tcp  --  192.168.150.10       0.0.0.0/0           tcp dpt:22

3. 删除规则(-D)

(1)按规则序号删除:删除 INPUT 链的第 1 条规则

bash

复制代码
iptables -D INPUT 1
(2)按匹配条件删除:删除 INPUT 链中 "拒绝 192.168.150.15" 的规则

bash

复制代码
iptables -D INPUT -s 192.168.150.15 -j DROP

4. 修改规则(-R)

将 INPUT 链第 2 条规则修改为 "允许 192.168.150.17 访问 80 端口":

bash

复制代码
iptables -R INPUT 2 -p tcp --dport 80 -s 192.168.150.17 -j ACCEPT

5. 清空规则与设置默认策略

(1)清空所有表的规则(谨慎使用!)

bash

复制代码
iptables -F
(2)设置 INPUT 链默认策略为 "拒绝所有数据包"(仅允许匹配规则的数据包通过)

bash

复制代码
# -P:设置默认策略;INPUT 链默认策略为 DROP
iptables -P INPUT DROP

注意:设置默认策略为 DROP 前,需先确保已添加 "允许 SSH 端口(22)" 的规则,否则会导致远程连接断开!

五、iptables 进阶用法

除基础匹配外,iptables 支持通过扩展模块实现更灵活的匹配逻辑,以下介绍常用扩展模块。

1. iprange 模块:匹配连续 IP 范围

通过 iprange 模块可匹配 "一段连续的 IP 地址",而非单个 IP 或网段。参数

  • --src-range 起始IP-结束IP:匹配源 IP 范围
  • --dst-range 起始IP-结束IP:匹配目标 IP 范围
  • -m iprange:声明使用 iprange 模块

示例:拒绝 192.168.150.15 到 192.168.150.25 的所有 IP 访问本机:

bash

复制代码
iptables -I INPUT -m iprange --src-range 192.168.150.15-192.168.150.25 -j DROP

2. string 模块:匹配数据包中的字符串

通过 string 模块可检测数据包中是否包含指定字符串,常用于过滤特定内容(如敏感信息)。参数

  • --algo 算法:必选参数,指定字符串匹配算法(bmkmpbm 效率更高)
  • --string "目标字符串":指定要匹配的字符串
  • -m string:声明使用 string 模块

示例:拒绝包含 "bit" 字符串的数据包进入本机:

bash

复制代码
iptables -I INPUT -m string --algo bm --string "bit" -j DROP

3. 端口转发(nat 表 + SNAT/DNAT)

端口转发是 iptables 的核心功能之一,需通过 nat 表实现,且需先开启内核转发功能。

(1)开启内核 IP 转发(临时生效,重启后失效)

bash

复制代码
echo 1 > /proc/sys/net/ipv4/ip_forward

永久生效 :编辑 /etc/sysctl.conf,添加或修改以下配置,然后执行 sysctl -p 生效:

bash

复制代码
net.ipv4.ip_forward = 1
(2)实例 1:本机 8080 端口转发到内网服务器(192.168.150.15:8088)

假设本机 IP 为 192.168.150.16,需实现 "外部访问 192.168.150.16:8080 → 转发到 192.168.150.15:8088":

复制代码
# 1. PREROUTING 链:修改目标地址(DNAT),将访问 8080 端口的数据包目标 IP 改为 192.168.150.15,端口改为 8088
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.150.15:8088

# 2. POSTROUTING 链:修改源地址(SNAT),将转发到 8088 端口的数据包源 IP 改为本机 IP(192.168.150.16),确保内网服务器能回包
iptables -t nat -A POSTROUTING -p tcp --dport 8
相关推荐
2301_800050992 小时前
DHCP 服务器
linux·运维·笔记
墨^O^2 小时前
网络通信协议全解析:HTTP/UDP/TCP核心要点
linux·服务器·网络·学习
_Re.3 小时前
DSC 参数ARCH_HANG_FLAG对集群的影响
linux·服务器·数据库
望获linux3 小时前
【Linux基础知识系列:第一百三十九篇】使用Bash编写函数提升脚本功能
linux·运维·服务器·arm开发·chrome·性能优化·bash
hhhwx6664 小时前
Linux学习记录--利用信号量来调度共享资源(2)
linux·c语言·c++·学习
biubiubiu07064 小时前
coqui-ai/TTS 安装
linux·运维·服务器
打不了嗝 ᥬ᭄4 小时前
【Linux】UDP 网络编程
linux·运维·服务器
kcoo4 小时前
Jupyter Lab 汉化
linux·开发语言·python
Lynnxiaowen5 小时前
今天我们开始学习nginx缓存功能,CORS以及nginx防盗链
linux·运维·学习·nginx·云计算·bash