当前位置: 首页 > news >正文

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 算法:必选参数,指定字符串匹配算法(bm 或 kmpbm 效率更高)
  • --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”:

bash

http://www.dtcms.com/a/399909.html

相关文章:

  • Matlab通过GUI实现点云的最远点下采样(Farthest point sampling)
  • 品牌设计公司哪家好网站可以做多少优化关键词
  • RK3588+MCU机器人控制器解决方案
  • JavaScript内存泄漏与闭包详解:从原理到实践
  • ARM芯片架构之CoreSight Programmers‘ Model 深入解析
  • Video-XL-2论文阅读
  • 在网站建设工作会议上讲话网站安全管理制度
  • JAVA第一阶段结束喽后天更新第二阶段至于明天当然是练习时间回顾一下之前学的太良心了
  • 专业门户网站建设用流媒体做的电台网站
  • python(74) 调用dll文件
  • 国家关于网站信息建设管理文件郴州市人口
  • 温州市城市建设档案馆网站公司宣传册排版
  • redis的set集合的编码方式以及应用场景
  • 【MySQL初阶】03-常见的数据类型
  • CPU调用频率偏高 原因调查
  • Nest 中的数据库集成、JWT身份认证与任务调度全解析
  • 中小型企业网站建设与管理设计制作软件
  • 常德网站建设套餐报价怎么制作公司网页教程
  • 音频基础知识
  • 如何在网上建立自己的网站自助建站信息网
  • 网站域名找回密码 用户名景区网站的建设公司
  • HTML应用指南:利用GET请求获取全国奥迪授权经销商门店位置信息
  • golang基础语法(三)常量、指针、别名、关键字、运算符、字符串类型转换
  • 普定县建设局网站河北seo平台
  • dify-随笔
  • 免费开店的平台有哪些标题优化方法
  • seo顾问服务公司站长怎么做软文网站
  • 【JNA】JAVA使用JNA调用C++ dll文件(3)编译Linux版本.so文件
  • MyBatis 操作数据库(⼊⻔)
  • [baka编程]初入C++,如何理解新概念——类和对象