Linux中iptables原理的图文详解

 、netfilter与iptables

  (1)netfilter是由rusty russell提出的linux 2.4内核防火墙框架,该框架既简洁又灵活,可实现安全策略应用中的许多功能,如数据包过滤、数据包处理、地址伪装、透明代理、动态网络地址转换(network address translation,nat),以及基于用户及媒体访问控制(media access control,mac)地址的过滤和基于状态的过滤、包速率限制等。iptables/netfilter的这些规则可以通过灵活组合,形成非常多的功能、涵盖各个方面,这一切都得益于它的优秀设计思想。

  Netfilter是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能:

网络地址转换(Network Address Translate)

数据包内容修改

数据包过滤防火墙

  (2)Netfilter 平台中制定了数据包的五个挂载点(Hook Point,我们可以理解为回调函数点,数据包到达这些位置的时候会主动调用我们的函数,使我们有机会能在数据包路由的时候改变它们的方向、内容),这5个挂载点分别是PRE_ROUTINGINPUTOUTPUTFORWARDPOST_ROUTING

Linux中iptables原理的图文详解

 

  (3)Netfilter 所设置的规则是存放在内核内存中的,而 iptables 是一个应用层的应用程序,它通过 Netfilter 放出的接口来对存放在内核内存中的 XXtables(Netfilter的配置表)进行修改。这个XXtables由表tables、链chains、规则rules组成,iptables在应用层负责修改这个规则文件。类似的应用程序还有 firewalld 。

   Linux中iptables原理的图文详解

 

 二、filter、nat、mangle等规则四表

 (1)table有 filter、nat、mangle等规则表;

  filter表

    主要用于对数据包进行过滤,根据具体的规则决定是否放行该数据包(如DROP、ACCEPT、REJECT、LOG)。filter 表对应的内核模块为iptable_filter,包含三个规则链:

INPUT链:INPUT针对那些目的地是本地的包

FORWARD链:FORWARD过滤所有不是本地产生的并且目的地不是本地(即本机只是负责转发)的

OUTPUT链:OUTPUT是用来过滤所有本地生成的包    

  nat表

    主要用于修改数据包的IP地址、端口号等信息(网络地址转换,如SNAT、DNAT、MASQUERADE、REDIRECT)。属于一个流的包(因为包的大小限制导致数据可能会被分成多个数据包)只会经过

  这个表一次。如果第一个包被允许做NAT或Masqueraded,那么余下的包都会自动地被做相同的操作,也就是说,余下的包不会再通过这个表。表对应的内核模块为 iptable_nat,包含三个链

PREROUTING链:作用是在包刚刚到达防火墙时改变它的目的地址

OUTPUT链:改变本地产生的包的目的地址

POSTROUTING链:在包就要离开防火墙之前改变其源地址

  mangle表

    主要用于修改数据包的TOS(Type Of Service,服务类型)、TTL(Time To Live,生存周期)指以及为数据包设置Mark标记,以实现Qos(Quality Of Service,服务质量)调整以及策略路由等

  应用,由于需要相应的路由设备支持,因此应用并不广泛。包含五个规则链——PREROUTING,POSTROUTING,INPUT,OUTPUT,FORWARD。

  raw表

    是自1.2.9以后版本的iptables新增的表,主要用于决定数据包是否被状态跟踪机制处理。在匹配数据包时,raw表的规则要优先于其他表。包含两条规则链——OUTPUT、PREROUTING

Linux中iptables原理的图文详解

 

(2)iptables中数据包和4种被跟踪连接的4种不同状态:

NEW该包想要开始一个连接(重新连接或将连接重定向)

RELATED该包是属于某个已经建立的连接所建立的新连接。例如:FTP的数据传输连接就是控制连接所 RELATED出来的连接。--icmp-type 0 ( ping 应答) 就是--icmp-type 8 (ping 请求)所RELATED出来的。

ESTABLISHED :只要发送并接到应答,一个数据连接从NEW变为ESTABLISHED,而且该状态会继续匹配这个连接的后续数据包。

INVALID数据包不能被识别属于哪个连接或没有任何状态比如内存溢出,收到不知属于哪个连接的ICMP错误信息,一般应该DROP这个状态的任何数据。

 

三、INPUT、FORWARD等规则五链和规则 

 

(1)在处理各种数据包时,根据防火墙规则的不同介入时机,iptables供涉及5种默认规则链,从应用时间点的角度理解这些链:

INPUT链:当接收到防火墙本机地址的数据包(入站)时,应用此链中的规则。

OUTPUT链:当防火墙本机向外发送数据包(出站)时,应用此链中的规则。

FORWARD链:当接收到需要通过防火墙发送给其他地址的数据包(转发)时,应用此链中的规则。

PREROUTING链:在对数据包作路由选择之前,应用此链中的规则,如DNAT。

POSTROUTING链:在对数据包作路由选择之后,应用此链中的规则,如SNAT。

Linux中iptables原理的图文详解

 

(2)其中中INPUT、OUTPUT链更多的应用在“主机防火墙”中,即主要针对服务器本机进出数据的安全控制;而FORWARD、PREROUTING、POSTROUTING链更多的应用在“网络防火 墙”中,特别是防火墙服务器作为网关使用时的情况。

 四、Linux数据包路由原理

 

   (1)理解了Netfilter和Iptables的架构和作用,并且学习了控制Netfilter行为的Xtables表的结构,那么这个Xtables表是怎么在内核协议栈的数据包路由中起作用的呢?

文心大模型 文心大模型

百度飞桨-文心大模型 ERNIE 3.0 文本理解与创作

文心大模型 56 查看详情 文心大模型

  工作流程:网口数据包由底层的网卡NIC接收,通过数据链路层的解包之后(去除数据链路帧头),就进入了TCP/IP协议栈(本质就是一个处理网络数据包的内核驱动)和Netfilter混合的数据包处理流程中了。数据包的接收、处理、转发流程构成一个有限状态向量机,经过一些列的内核处理函数、以及Netfilter Hook点,最后被转发、或者本次上层的应用程序消化掉。

如图:

Linux中iptables原理的图文详解

 从上图中,我们可以总结出以下规律:

当一个数据包进入网卡时,数据包首先进入PREROUTING链,在PREROUTING链中我们有机会修改数据包的DestIP(目的IP),然后内核的”路由模块”根据”数据包目的IP”以及”内核中的路由表”判断是否需要转送出去(注意,这个时候数据包的DestIP有可能已经被我们修改过了)

如果数据包就是进入本机的(即数据包的目的IP是本机的网口IP),数据包就会沿着图向下移动,到达INPUT链。数据包到达INPUT链后,任何进程都会-收到它

本机上运行的程序也可以发送数据包,这些数据包经过OUTPUT链,然后到达POSTROTING链输出(注意,这个时候数据包的SrcIP有可能已经被我们修改过了)

如果数据包是要转发出去的(即目的IP地址不再当前子网中),且内核允许转发,数据包就会向右移动,经过FORWARD链,然后到达POSTROUTING链输出(选择对应子网的网口发送出去)

  在写iptables规则的时候,要时刻牢记这张路由次序图,根据所在Hook点的不同,灵活配置规则

 

 五、iptables编写规则

 

        命令格式:

                      Linux中iptables原理的图文详解

  示例:

     1 iptables -I INPUT -s 0/0 -d 192.168.42.153 -p tcp -m multiport –dports 22,80,3306 -j ACCEPT 

     1 iptables -t filter -I INPUT -d 192.168.42.153 -p tcp –dport 80 -j ACCEPT 

  1.[-t 表名]:该规则所操作的哪个表,可以使用filter、nat等,如果没有指定则默认为filter

-A:新增一条规则,到该规则链列表的最后一行

-I:插入一条规则,原本该位置上的规则会往后顺序移动,没有指定编号则为1

-D:从规则链中删除一条规则,要么输入完整的规则,或者指定规则编号加以删除

-R:替换某条规则,规则替换不会改变顺序,而且必须指定编号。

-P:设置某条规则链的默认动作

-nL-L-n,查看当前运行的防火墙规则列表

  2.chain名:指定规则表的哪个链,如INPUT、OUPUT、FORWARD、PREROUTING等

[规则编号]:插入、删除、替换规则时用,--line-numbers显示号码

[-i|o 网卡名称]:i是指定数据包从哪块网卡进入,o是指定数据包从哪块网卡输出

[-p 协议类型]:可以指定规则应用的协议,包含tcp、udp和icmp等

[-s 源IP地址]:源主机的IP地址或子网地址

[--sport 源端口号]:数据包的IP的源端口号

[-d目标IP地址]:目标主机的IP地址或子网地址

[--dport目标端口号]:数据包的IP的目标端口号

  3.-m:extend matches,这个选项用于提供更多的匹配参数,如:

-m state –state ESTABLISHED,RELATED

-m tcp –dport 22

-m multiport –dports 80,8080

-m icmp –icmp-type 8

  4.:处理数据包的动作,包括ACCEPT、DROP、REJECT等

ACCEPT允许数据包通过

DROP直接丢弃数据包,不给任何回应信息

REJECT拒绝数据包通过,必要时会给数据发送端一个响应的信息。

SNAT源地址转换。在进入路由层面的route之后,出本地的网络栈之前,改写源地址,目标地址不变,并在本机建立NAT表项,当数据返回时,根据NAT表将目的地址数据改写为数据发送出去时候的源地址,并发送给主机。解决内网用户用同一个公网地址上网的问题。
MASQUERADE,是SNAT的一种特殊形式,适用于像adsl这种临时会变的ip上

DNAT:目标地址转换。和SNAT相反,IP包经过route之前,重新修改目标地址,源地址不变,在本机建立NAT表项,当数据返回时,根据NAT表将源地址修改为数据发送过来时的目标地址,并发给远程主机。可以隐藏后端服务器的真实地址。(感谢网友提出之前这个地方与SNAT写反了)
REDIRECT:是DNAT的一种特殊形式,将网络包转发到本地host上(不管IP头部指定的目标地址是啥),方便在本机做端口转发。

LOG在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则

     除去最后一个LOG,前3条规则匹配数据包后,该数据包不会再往下继续匹配了,所以编写的规则顺序极其关键。

 

以上就是Linux中iptables原理的图文详解的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/559219.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Linux环境中C++代码如何优化
上一篇 2025年11月10日 00:14:32
聊聊Angular中NgTemplateOutlet指令的理解和用法
下一篇 2025年11月10日 00:14:38

相关推荐

  • linux如何安装php7?

    linux如何安装php7? 1、安装依赖包 yum install -y gcc gcc-c++ make zlib zlib-devel pcre pcre-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-dev…

    2026年8月28日
    000
  • linuxphp安装在哪里

    linuxphp安装在哪里linuxphp安装在哪里linuxphp安装在哪里linuxphp安装在哪里

    1、首先,连接相应linux主机,进入到linux命令行状态下,等待输入shell指令 2、在linux命令行下输入shell指令:find / -name *php* 3、键盘按“回车键”运行shell指令,此时会看到php安装目录在/usr/local/lib/php 立即学习“PHP免费学习笔…

    2026年8月28日 用户投稿
    000
  • linux配置nginx伪静态

    1、首页,进入linux的命令窗口 2、然后输入以下命令 #vim /usr/local/nginx/conf/nginx.conf 3、编辑linux的设置文件并找到以下代码: server{ …… location / { index index.htm index.html index.php…

    2026年8月28日
    000
  • Listen1如何启用离线模式_Listen1启用离线模式的详细步骤

    答案:可通过三种方式启用Listen1离线模式。一、进入设置菜单手动切换至离线模式;二、关闭设备网络连接触发应用自动进入离线状态;三、使用开发者工具输入命令强制开启离线功能,适用于高级用户。 如果您在使用Listen1时遇到网络连接不稳定或无法访问在线资源的情况,可以通过启用离线模式来继续管理已缓存…

    2026年8月28日
    000
  • linux下如何配置php连接数据库

    一、安装oracle-instantclient 下载oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm 下载oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm 放在/usr/pack…

    2026年8月28日
    000
  • linux执行php文件结果怎么看

    linux执行php文件结果怎么看     1、首先确保linux系统安装了php,若没有请安装 Debian sudo apt-get install php7.2 CentOS yum install php56 php56-php php56-php-mbstring php56-php-fp…

    2026年8月28日
    000
  • linux虚拟机如何配置php

    linux虚拟机如何配置phplinux虚拟机如何配置phplinux虚拟机如何配置phplinux虚拟机如何配置php

    1、安装gd库及相关程序 2、解压GD库压缩包 3、指定GD库的安装路径,并安装 立即学习“PHP免费学习笔记(深入)”; 4、将安装执行文件转换为二进制文件,并进行安装 5、解压php压缩包 6、配置php安装模块,并进行安装 7、编辑Apache配置文件,使其可支持php 8、开启服务 9、关闭…

    2026年8月28日 用户投稿
    500
  • Windows + Claude Code + Cursor 安装、配置和激活!揭秘最全指南!

    Windows + Claude Code + Cursor 安装、配置和激活!揭秘最全指南!Windows + Claude Code + Cursor 安装、配置和激活!揭秘最全指南!Windows + Claude Code + Cursor 安装、配置和激活!揭秘最全指南!Windows + Claude Code + Cursor 安装、配置和激活!揭秘最全指南!

    前言 用过ai编程工具的小伙伴,肯定都知道claude。claude 系列模型在编程领域的口碑绝对是佼佼者!很多ai工具都接入claude的模型! 图片 鉴于Claude 系列模型的优秀表现,官方也推出自己的编程工具 Claude Code ,也是收费的。 图片 另外,单独的Claude模型需要一些…

    2026年8月28日 用户投稿
    000
  • linux查看内存使用情况

    linux查看内存使用情况     在做Linux系统优化的时候,物理内存是其中最重要的一方面。自然的,Linux也提供了非常多的方法来监控宝贵的内存资源的使用情况。下面的清单详细的列出了Linux系统下通过视图工具或命令行来查看内存使用情况的各种方法。 推荐:【Linux视频教程】 1. /pro…

    2026年8月28日
    100
  • linux安装gcc命令

    linux安装gcc命令 了解一下gcc gcc是GNU编译器套件(GNU Compiler Collection),它包括了C、C++、Objective-C、Fortran、Java、Ada、Go语言和D语言的前端,也包括了这些语言的库(如libstdc++、libgcj等等)。GCC的初衷是为…

    2026年8月28日
    100
  • linux重启服务命令

    linux重启服务命令     重启: service 服务名 restart 或 systemctl restart 服务名 service和systemctl 1.service命令 service命令其实是去/etc/init.d目录下,去执行相关程序 # service命令启动redis脚本…

    2026年8月28日
    200
  • VSCode怎么设置代码对齐_VSCode代码对齐与缩进规则配置教程

    答案:VSCode通过配置格式化工具和扩展实现代码对齐,需安装对应语言的工具(如Prettier、autopep8),启用formatOnSave自动格式化,或使用Shift+Alt+F手动格式化;通过.editorconfig统一团队风格,检查文件类型识别和扩展冲突解决格式化失效问题;在setti…

    2026年8月28日
    000
  • linux touch命令详解

    linux touch命令详解linux touch命令详解linux touch命令详解linux touch命令详解

    linux touch命令详解: 1、命令功能: 创建文件和修改文件或者目录的时间戳 2、命令语法:  touch  【选项】 【文件名或者目录名】 3、命令参数: -a  只修改文件的access(访问)时间. -c  或–no-create  不创建不存在的文件。 -d  使用指定的…

    2026年8月28日 用户投稿
    100
  • linux vi命令详解

    linux vi命令详解 推荐:【Linux视频教程】 vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里介绍一下它的用法和一部分指令。 由于 对Unix及Linux系统的任何版本,vi编辑器是完全相同的,因此您可以在其他任何介绍vi的地方进一步了解它…

    2026年8月28日
    000
  • 查看df的帮助说明命令

    查看df的帮助说明命令     查看df的帮助说明的命令可以使用man df,也可以使用df –help以及whatis df。 whatis:用于查询一个命令执行什么功能,并将查询结果打印到终端上。 man:会按照系统设计帮助目录,在各个文档里面查询,并且显示内容。 df &#8211…

    2026年8月28日
    100
  • 亚马逊浏览器指纹是什么意思 亚马逊账号防关联技术原理

    亚马逊通过浏览器指纹追踪用户,防关联需使用独立IP、不同浏览器与操作系统等技术,结合VPS、代理IP、虚拟机等工具模拟真实用户环境,避免账号关联风险。 亚马逊浏览器指纹是用于识别和追踪用户在亚马逊平台上的活动的一种技术手段,它通过收集用户浏览器和设备的各种属性信息,生成一个唯一的“指纹”,用于区分不…

    2026年8月28日
    100
  • 基于Windows的渗透测试虚拟机系统

    基于Windows的渗透测试虚拟机系统基于Windows的渗透测试虚拟机系统基于Windows的渗透测试虚拟机系统基于Windows的渗透测试虚拟机系统

    今天我们将为大家详细介绍一款名为commando vm的渗透测试虚拟机。这是一款基于windows的高度可定制的渗透测试虚拟机环境,目前已发布正式版本,适用于渗透测试和红队研究。 工具安装 基础要求:建议在安装Commando VM之前,确保虚拟机已更新至最新版本,并检查更新、重启设备并确认更新已完…

    2026年8月28日 用户投稿
    200
  • 查看网卡中断命令

    查看网卡中断命令 Linux中查看网卡中断的命令是:cat proc/interrupts cat是linux中读取文件并输出到屏幕的命令,cat proc/interrupts读取到的内容从左到右,分别为:1、逻辑中断号,2、中断在各CPU发生的次数,3、中断所属设备类名称,4、硬件中断号,5、中…

    2026年8月28日
    200
  • linux和unix的区别

    UNIX是一个功能强大、性能全面的多用户、多任务操作系统,可以应用从巨型计算机到普通PC机等多种不同的平台上,是应用面最广、影响力最大的操作系统。     (推荐学习:linux运维) Linux是一种外观和性能与UNIX相同或更好的操作系统,但Linux不源于任何版本的UNIX的源代码,并不是UN…

    2026年8月28日
    100
  • Jenkins Windows Server系统的文件上传到Linux服务

    一. 背景 在java项目中,需要通过jenkins将maven工程编译打包后的springboot服务部署到另一台linux服务器上。通过研究发现,windows 10可以使用scp命令来实现文件传输。然而,在购买的windows server上却没有找到这个命令。 二. 方案 在网上搜索到一个名…

    2026年8月28日
    200

发表回复

登录后才能评论
关注微信