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

相关推荐

  • Python命令怎样使用profile分析脚本性能 Python命令性能分析的基础教程

    使用Python的cProfile模块分析脚本性能最直接的方式是通过命令行执行python -m cProfile your_script.py,它会输出每个函数的调用次数、总耗时、累积耗时等关键指标,帮助定位性能瓶颈;为进一步分析,可将结果保存为文件python -m cProfile -o ou…

    2026年5月10日
    000
  • c++如何实现UDP通信_c++基于UDP的网络通信示例

    UDP通信基于套接字实现,适用于实时性要求高的场景。1. 流程包括创建套接字、绑定地址(接收方)、发送(sendto)与接收(recvfrom)数据、关闭套接字;2. 服务端监听指定端口,接收客户端消息并回传;3. 客户端发送消息至服务端并接收响应;4. 跨平台需处理Winsock初始化与库链接,编…

    2026年5月10日
    100
  • 谷歌浏览器如何截图 谷歌浏览器页面截图技巧

    谷歌浏览器如何截图 谷歌浏览器页面截图技巧谷歌浏览器如何截图 谷歌浏览器页面截图技巧谷歌浏览器如何截图 谷歌浏览器页面截图技巧谷歌浏览器如何截图 谷歌浏览器页面截图技巧

    使用谷歌浏览器的开发者工具截图步骤:1. 按ctrl+shift+i(windows/linux)或cmd+option+i(mac)打开开发者工具。2. 点击右上角三个点,选择”更多工具”,再选择”截图”。3. 选择截取整个页面。推荐的谷歌浏览器扩展…

    2026年5月10日 用户投稿
    100
  • pycharm解析器怎么添加 解析器添加详细流程

    在pycharm中添加解析器的步骤包括:1) 打开pycharm并进入设置,2) 选择project interpreter,3) 点击齿轮图标并选择add,4) 选择解析器类型并配置路径,5) 点击ok完成添加。添加解析器后,选择合适的类型和版本,配置环境变量,并利用解析器的功能提高开发效率。 在…

    2026年5月10日
    000
  • JavaScript Electron桌面应用

    答案:使用JavaScript开发%ignore_a_1%桌面应用需结合Web技术与Node.js,通过主进程管理窗口、渲染进程展示界面,并利用IPC通信,调用系统功能如文件对话框,最后用electron-builder打包发布,注意安全与进程职责分离。 用JavaScript开发Electron桌…

    2026年5月10日
    000
  • Linux文件系统iostat命令使用技巧

    Linux文件系统iostat命令使用技巧Linux文件系统iostat命令使用技巧Linux文件系统iostat命令使用技巧Linux文件系统iostat命令使用技巧

    iostat是Linux系统中用于监控I/O设备负载的关键工具,能分析磁盘性能并识别瓶颈。默认输出包括CPU使用率和设备I/O统计,分为系统启动以来的平均值和当前采样周期数据。核心指标有:%util反映设备利用率,持续接近100%可能表示I/O瓶颈;await为平均I/O等待时间,过高说明响应变慢;…

    2026年5月10日 用户投稿
    000
  • HTML的语法详解

    这次给大家带来html的语法详解,怎么使用html的语法?使用html语法的注意事项有哪些,下面就是实战案例,一起来看一下。 什么是HTML标记语言? HTML是表示网页信息的符号标记语言。 2.HTML的标记和他的属性 1.HTML文档的保存格式:.html、.htm、.xhtml 立即学习“前端…

    用户投稿 2026年5月10日
    000
  • 如何测试html5编码_测试HTML5页面编码兼容性方法【编码测试】

    HTML5页面编码兼容性测试需五步:一查meta charset是否正确且前置;二验HTTP响应头Content-Type charset是否为utf-8;三用file或chardet工具探测实际编码;四跨浏览器测试URL参数中中文、Emoji解析;五通过W3C验证服务检查编码声明与字节一致性。 如…

    2026年5月10日
    100
  • 后缀php怎么打开_php文件打开方式与运行环境搭建指南

    要打开PHP文件需根据用途选择方式:查看代码可用文本编辑器或IDE,运行则需服务器环境。推荐新手使用XAMPP、WAMP等集成环境,将文件放入htdocs目录后访问localhost;开发者可利用PHP内置服务器,命令行执行php -S localhost:8000运行;高级用户可手动配置Apach…

    2026年5月10日
    000
  • Go语言:检查预编译库的构建版本与平台信息

    本文详细介绍了如何利用go语言内置的`go tool pack`工具,从预编译的go静态库(`.a`文件)中提取其构建信息,包括go编译器版本、操作系统和cpu架构。当`go build`因库版本不匹配而失败时,此方法能帮助开发者准确诊断问题,确保构建环境与库的兼容性。 在Go语言的开发实践中,我们…

    2026年5月10日
    000
  • 解决Python脚本中相对路径文件找不到的常见问题与策略

    本文旨在解决python脚本中因相对路径处理不当导致的文件找不到错误,尤其是在项目迁移后。文章将深入探讨python中相对路径的工作原理、当前工作目录(cwd)的影响,并提供使用`os.getcwd()`诊断问题以及利用`os.path.dirname(__file__)`结合`os.path.jo…

    2026年5月10日
    000
  • Golang如何提升TCP长连接处理效率_Golang TCP长连接处理性能优化实践详解

    答案:通过非阻塞I/O、单Goroutine双工模型、sync.Pool对象复用、TCP_NODELAY优化及高效心跳管理,结合系统调优,可显著提升Golang百万级TCP长连接处理效率。 在高并发网络服务场景中,TCP长连接的处理效率直接影响系统的吞吐能力和资源消耗。Golang凭借其轻量级Gor…

    2026年5月10日
    000
  • C++内存检测工具 Valgrind使用实践指南

    Valgrind是一款主要用于Linux和macOS的内存调试工具,可检测内存泄漏、越界访问、未初始化内存使用等问题,通过memcheck工具结合–leak-check=full、–track-origins=yes等选项进行详细分析,需编译时添加-g选项以支持调试信息,虽然…

    2026年5月10日
    000
  • php源码怎么运行手机_php源码手机运行环境搭建步骤【教程】

    可在手机上通过特定工具运行PHP源码。首先选择支持PHP的移动应用,安卓用户可安装UserLAnd或KSWEB,iOS用户可尝试iSH Shell或a-Shell;然后配置本地服务器环境,启动HTTP和PHP服务,将PHP文件放入指定根目录;接着可通过Termux搭建完整开发环境,更新包列表并安装P…

    2026年5月10日
    200
  • PHP动态网页数据库备份恢复_PHP动态网页MySQL数据库备份教程

    答案:PHP动态网页的MySQL数据库备份与恢复需通过定期导出SQL文件并安全存储来保障数据安全,核心方法包括使用mysqldump命令行工具实现高效灵活的自动化备份,利用phpMyAdmin图形化工具进行手动导出导入以降低操作门槛,以及通过PHP脚本调用系统命令将备份过程集成到应用中;恢复时可采用…

    2026年5月10日
    000
  • 解决Go语言中GOPATH未设置错误及工作区配置指南

    本文旨在解决go语言开发中常见的“gopath not set”错误,并提供详细的go工作区配置指南。内容涵盖`gopath`环境变量的设置、go项目目录结构、`path`变量的扩展,以及一些高级配置技巧,旨在帮助开发者建立一个高效、规范的go开发环境,确保包的下载、编译和运行顺利进行。 Go语言在…

    2026年5月10日
    000
  • Linux用scp命令上传HTML文件到远程服务器

    使用scp命令可安全上传HTML文件至远程服务器:1、上传单个文件需指定源路径与目标地址;2、批量上传可用*.html通配符;3、递归上传目录需加-r参数;4、非默认端口需用-P指定端口号,依次执行并输入密码即可完成传输。 如果您需要将本地的HTML文件上传到远程服务器,并且拥有SSH访问权限,可以…

    2026年5月10日
    000
  • c++如何调用系统命令_c++执行系统命令方法

    使用std::system()可执行系统命令,需包含cstdlib头文件,传入命令字符串,返回值表示执行结果。示例:Linux下用”ls -l”列出文件,Windows下用”dir”。返回0表示成功,非0表示失败,可用于判断命令执行状态。注意跨平台命令…

    2026年5月10日
    200
  • 跨平台 C++ 代码中设计模式的移植问题与解决方案

    在跨平台 c++++ 开发中,设计模式移植问题包括:平台依赖性、头文件可用性、命名冲突、内存管理。解决方案包括使用跨平台库、预处理器指令、命名空间、跨平台内存管理库等。 跨平台 C++ 代码中设计模式的移植问题与解决方案 在跨平台 C++ 开发中,将设计模式从一个平台移植到另一个平台时,可能会遇到一…

    2026年5月10日
    000
  • C++怎么使用静态库和动态库_C++链接静态库与动态库的方法与区别

    静态库在编译时链接,生成独立可执行文件;动态库运行时加载,节省内存。1. 静态库用ar打包.o文件为.a,编译时通过-L和-l链接;2. 动态库需-fPIC编译生成.so,运行前配置LD_LIBRARY_PATH或系统路径;3. 静态库体积大但部署方便,动态库共享内存利于更新。 在C++项目开发中,…

    2026年5月10日
    000

发表回复

登录后才能评论
关注微信