我的编程空间,编程开发者的网络收藏夹
学习永远不晚

iptables的状态机制如何分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

iptables的状态机制如何分析

这篇文章给大家介绍iptables的状态机制如何分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

1.6 状态机制

状态机制是iptables中较为特殊的一部分,这也是iptables和比较老的ipchains的一个比较大的区别之一,运行状态机制(连接跟踪)的防火墙称作带有状态机制的防火墙,以下简称为状态防火墙。状态防火墙比非状态防火墙要安全,因为它允许我们编写更严密的规则。

在iptables上一共有四种状态,分别被称为NEW、ESTABLISHED、INVALID、RELATED,这四种状态对于TCP、UDP、ICMP三种协议均有效。下面,我们来分别阐述四种状态的特性。

  1. NEW:NEW说明这个包是我们看到的***个包。意思就是,这是conntrack模块看到的某个连接的***个包,它即将被匹配了。比如,我们看到一个SYN 包,是我们所留意的连接的***个包,就要匹配它。

  2. ESTABLISHED: ESTABLISHED已经注意到两个方向上的数据传输,而且会继续匹配这个连接的包。处于ESTABLISHED状态的连接是非常容易理解的。只要发送并接到应答,连接就是ESTABLISHED的了。一个连接要从NEW变为ESTABLISHED,只需要接到应答包即可,不管这个包是发往防火墙的,还是要由防火墙转发的。ICMP的错误和重定向等信息包也被看作是ESTABLISHED,只要它们是我们所发出的信息的应答。

  3. RELATED: RELATED是个比较麻烦的状态。当一个连接和某个已处于ESTABLISHED状态的连接有关系时,就被认为是RELATED的了。换句话说,一个连接要想是RELATED的,首先要有一个ESTABLISHED的连接。这个ESTABLISHED连接再产生一个主连接之外的连接,这个新的连接就是 RELATED的了,当然前提是conntrack模块要能理解RELATED。ftp是个很好的例子,FTP-data 连接就是和FTP-control有关联的,如果没有在iptables的策略中配置RELATED状态,FTP-data的连接是无法正确建立的,还有其他的例子,比如,通过IRC的DCC连接。有了这个状态,ICMP应答、FTP传输、DCC等才能穿过防火墙正常工作。注意,大部分还有一些UDP协议都依赖这个机制。这些协议是很复杂的,它们把连接信息放在数据包里,并且要求这些信息能被正确理解。

  4. INVALID:INVALID说明数据包不能被识别属于哪个连接或没有任何状态。有几个原因可以产生这种情况,比如,内存溢出,收到不知属于哪个连接的ICMP错误信息。一般地,我们DROP这个状态的任何东西,因为防火墙认为这是不安全的东西。

每个状态相对于不同的第四层协议来讲,稍微有些区别,对于TCP协议来说,当防火墙收到***个数据包,也就是SYN报文时,将该会话标记为NEW状态,在系统的/proc/net/目录下,可以查阅文件ip_conntrack,这是在内存空间里存放防火墙当前状态表的临时文件,对于NEW状态的记录如下:

tcp 6 117 SYN_SENT class="lazy" data-src=192.168.1.5 dst=192.168.1.35 sport=1031 dport=23 [UNREPLIED] class="lazy" data-src=192.168.1.35 dst=192.168.1.5 sport=23 dport=1031 use=1

从上面的记录可以看出,SYN_SENT状态被设置了,这说明连接已经发出一个SYN包,但应答还没发送过来,这可从[UNREPLIED]标志看出,当服务器端回应了SYN/ACK包后,状态表改写为:

tcp 6 57 SYN_RECV class="lazy" data-src=192.168.1.5 dst=192.168.1.35 sport=1031 dport=23 class="lazy" data-src=192.168.1.35 dst=192.168.1.5 sport=23 dport=1031 use=1

现在我们已经收到了相应的SYN/ACK包,状态也变为SYN_RECV,这说明最初发出的SYN包已正确传输,并且SYN/ACK包也到达了防火墙。 这就意味着在连接的两方都有数据传输,因此可以认为两个方向都有相应的回应。

接下来,TCP三次握手的随后一个报文ACK包也到达了防火墙,防火墙上的状态表变成了:

tcp 6 431999 ESTABLISHED class="lazy" data-src=192.168.1.5 dst=192.168.1.35 sport=1031 dport=23 class="lazy" data-src=192.168.1.35 dst=192.168.1.5 sport=23 dport=1031 use=1

现在,我们来看看UDP协议的状态描述方法,从协议本身的特性来看,UDP连接是无状态的,因为它没有任何的连接建立和关闭过程。以某个顺序收到的两个数据包是无法确定它们的发出顺序的。但内核仍然可以对UDP连接设置状态。我们来看看是如何跟踪UDP连接的,以及在核心目录 /proc/net/ip_conntrack的相关记录。

当***个UDP的数据包到达防火墙后,防火墙在他的状态表中留下了这样的记录:

udp 17 20 class="lazy" data-src=192.168.1.2 dst=192.168.1.5 sport=137 dport=1025 [UNREPLIED] class="lazy" data-src=192.168.1.5 dst=192.168.1.2 sport=1025 dport=137 use=1

UNREPLIED代表这是一个状态为NEW的数据包,当这条连接的回应数据包到达防火墙后,防火墙立即将修改这条状态记录:

udp 17 160 class="lazy" data-src=192.168.1.2 dst=192.168.1.5 sport=137 dport=1025 class="lazy" data-src=192.168.1.5 dst=192.168.1.2 sport=1025 dport=137 use=1

在这条新的状态记录中,UNREPLIED被删除了,这代表现在防火墙已经建立了一条UDP协议的会话,但这里并没有象TCP协议那样显示 ESTABLISHED标记,这是TCP的状态记录和UDP的状态记录稍微不同的一个地方,当然,还有一个地方需要注意,在测试中,还需要有一些数据包经过,防火墙才会将状态记录改写成:

udp 17 179 class="lazy" data-src=192.168.1.2 dst=192.168.1.5 sport=137 dport=1025 class="lazy" data-src=192.168.1.5 dst=192.168.1.2 sport=1025 dport=137 [ASSURED] use=1

ASSURED状态表示当前有数据在进行传输,表面当前连接的状态是ACTIVE的。如果,在这个状态下数据停止了传输,则这条记录会有一个计时器,也就是记录中的第三个字段,上面这条记录的第三个字段是179,代表当前的ASSURED状态还能够保持179秒,如果还有新的数据包经过,那么计时器会被重新设置成缺省的180秒,如果在180秒内都没有流量,那么这条状态记录就会从状态表中被删除。

***,我们在来看看Linux kernel是如何标示ICMP协议的状态的,ICMP也是一种无状态协议,它只是用来控制而不是建立连接。ICMP包有很多类型,但只有四种类型有应答包,它们是回显请求和应答(Echo request and reply),时间戳请求和应答(Timestamp request and reply),信息请求和应答(Information request and reply),还有地址掩码请求和应答(Address mask request and reply),这些包有两种状态,NEW和ESTABLISHED 。时间戳请求和信息请求已经废除不用了,回显请求还是常用的,比如ping命令就用的到,地址掩码请求不太常用,但是可能有时很有用并且值得使用。看看下面的图,就可以大致了解ICMP连接的NEW和ESTABLISHED状态了。

如图所示,主机向目标发送一个回显请求,防火墙就认为这个包处于NEW状态。目标回应一个回显应答,防火墙就认为包处于ESTABLISHED了。当回显请求被发送时,ip_conntrack里就有这样的记录了:

icmp 1 25 class="lazy" data-src=192.168.1.6 dst=192.168.1.10 type=8 code=0 id=33029 [UNREPLIED] class="lazy" data-src=192.168.1.10 dst=192.168.1.6 type=0 code=0 id=33029 use=1

可以看到,ICMP的记录和TCP、UDP的有点区别,协议名称、超时时间和源、目地址都一样,不同之处在于没有了端口,而新增了三个新的字段:type,code和id。字段type说明ICMP的类型。code说明ICMP的代码,这些代码在附录ICMP类型里有说明。id是 ICMP包的ID。每个ICMP包被发送时都被分配一个ID,接受方把同样的ID 分配给应答包,这样发送方能认出是哪个请求的应答。

[UNREPLIED] 的含义和前面一样,说明数的传输只发生在一个方向上,也就是说未收到应答。再往后,是应答包的源、目地址,还有相应的三个新字段,要注意的是type和 code是随着应答包的不同而变化的,id和请求包的一样。和前面一样,应答包被认为是ESTABLISHED的。然而,在应答包之后,这个ICMP 连接就不再有数据传输了。所以,一旦应答包穿过防火墙,ICMP的连接跟踪记录就被销毁了。因此,要想在/proc/ip_conntrack文件中抓到 ICMP协议的状态记录实在不是一件容易的事。您可以用如下的命令来尝试获取这些记录:

#cat /proc/net/ip_conntrack | grep icmp

如果没有输出,那么就不停的重复这个命令,直到发现icmp的记录为止。

以上各种情况,请求被认为NEW,应答是ESTABLISHED。换句话说,就是当防火墙看到一个请求包时,就认为连接处于NEW状态,当有应答时,就是ESTABLISHED状态。

---------------------------

state匹配:state匹配在防火墙配置过程中非常重要的,如果没有state的配置,那么需要配置双向的规则才能满足通讯的需要,但防火墙既然有状态检测功能,我们为什么不好好使用它呢?

--state:state的状态有四种,指定要匹配包的的状态,当前有4种状态可用:INVALID,ESTABLISHED,NEW和RELATED。四种数据包的状态我们在前面已经做了详细的描述本节我们只进行state的用法描述,如下例所示:

#iptables –A FORWARD –p tcp –m state --state RELATED,ESTABLISHED –j ACCEPT

本例表明凡是数据包状态为“RELATED”、“ESTABLISHED”的tcp包允许通过防火墙。在一般情况下,基于状态的策略都是配置在每一条 chain的最前面,因为当包被匹配到以后,就能够直接被处理了,这是一种比较高效的配置方法。关键字ESTABLISHED比较容易理解,即匹配状态为 “已经建立连接”的数据包,那么怎么理解“RELATED”呢,RELATED表示不属于已经建立的那条连接,但和那条连接有关,比如ftp,ftp在建立连接的过程中会首先建立一条ftp-control连接用以传输指令等,真正传输数据的是一条叫做ftp-data的连接,而传输数据的连接是和传输控制信号的连接相关的,因此“RELATED”是用于类似这些特殊服务的。在正常情况下,对于每一种协议:TCP、UDP、ICMP都可以单独的配置状态策略,但一种比较简单高效的做法是:

#iptables –A INPUT –p all –m state --state RELATED,ESTABLISHED –j ACCEPT

multiport:这个匹配选项为我们解决了如何在一条策略种匹配那些端口不连续的服务,在一般情况下,一个公司或企业的安全策略是允许内部网络使用有限的Internet服务,如收发电子邮件、上网浏览网页、msn聊天等,看看下面的例子:

#iptables –A FORWARD –i eth0 –p tcp –m multiport --dports 25,80,110,443,1863 –j ACCEPT#iptables –A FORWARD –i eth0 –p udp --dport 53 –j ACCEPT

仅仅两条命令就解决了内部用户上网收发E_mail、浏览网页、使用msn聊天等需求,怎么样,就这么简单~

关于iptables的状态机制如何分析就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

iptables的状态机制如何分析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

iptables的状态机制如何分析

这篇文章给大家介绍iptables的状态机制如何分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1.6 状态机制状态机制是iptables中较为特殊的一部分,这也是iptables和比较老的ipchains的一个比较
2023-06-16

python状态机transitions库的示例分析

这篇文章主要介绍了python状态机transitions库的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、简介 transitions库pip install
2023-06-15

如何在bash中退出状态机制

本篇文章为大家展示了如何在bash中退出状态机制,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。程序的退出状态当一个程序结束时会向父进程报告自己的退出状态( exit status ). 通过传递 i
2023-06-09

如何进行Iptables的脚本分析

这篇文章给大家介绍如何进行Iptables的脚本分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。环境:redhat9 加载了string time等模块,加载方法参照 http://bbs.chinaunix.net
2023-06-13

如何理解PHP中的无状态传输机制

PHP中的无状态传输机制在Web开发中,无状态传输机制是指服务器不会保存客户端的状态信息,每次请求都是独立的,服务器不会保持任何关于客户端状态的信息。PHP作为一种服务器端脚本语言,在处理HTTP请求时采用无状态传输机制,这对于维护服务器
如何理解PHP中的无状态传输机制
2024-03-06

React状态更新的优先级机制源码解析

这篇文章主要为大家介绍了React状态更新的优先级机制源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-11-13

深度解析HTTP状态码301:永久重定向的机制和应用

探究HTTP状态码301:永久重定向的原理与实现在互联网的世界中,网页的重定向是一个常见的操作。当我们在浏览器中访问一个网址时,有时会被自动重定向到另一个页面,这背后使用的就是HTTP状态码301。本文将着重探究301状态码的原理与实现。
深度解析HTTP状态码301:永久重定向的机制和应用
2024-02-23

Java反射机制中动态代理的示例分析

这篇文章主要介绍了Java反射机制中动态代理的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. 代理模式代理模式就是为其他对象提供一种代理来控制对这个对象的访问。其
2023-06-17

Android 媒体开发之MediaPlayer状态机接口方法的示例分析

这篇文章主要为大家展示了“Android 媒体开发之MediaPlayer状态机接口方法的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Android 媒体开发之MediaPlayer状
2023-05-30

Java中反射机制和动态代理的示例分析

这篇文章主要介绍了Java中反射机制和动态代理的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、反射概述反射机制指的是Java在运行时候有一种自观的能力,能够了解自
2023-06-15

如何进行HashMap扩容机制源码分析

这期内容当中小编将会给大家带来有关如何进行HashMap扩容机制源码分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。具体看源码之前,我们先简单的说一下HashMap的底层数据结构  1、HashMap底
2023-06-02

如何分析python流程的控制

本篇文章给大家分享的是有关如何分析python流程的控制,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。前言:经过简单的了解python基本语法和使用后,发现其都是一些顺序执行语
2023-06-22

如何深度剖析Java反射机制中的动态代理原理

本篇文章给大家分享的是有关如何深度剖析Java反射机制中的动态代理原理,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。动态代理类原理 示例代码参见《Java反射机制剖析:简单谈谈
2023-06-17

如何用循环机制分析MySQL日志数据

要用循环机制分析MySQL日志数据,首先需要将日志数据导入到程序中,然后通过循环遍历每条日志数据进行分析。具体步骤如下:读取MySQL日志数据:首先需要将MySQL日志数据从文件中读取到程序中。可以使用文件读取函数,逐行读取日志数据并存储到
如何用循环机制分析MySQL日志数据
2024-04-30

如何分析Java性能优化中的垃圾回收机制

这篇文章将为大家详细讲解有关如何分析Java性能优化中的垃圾回收机制,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。★JVM 的内存空间  在 Java 虚拟机规范中,提及了如下几种类型的内存
2023-06-02

IDEA中的静态分析工具如何使用

IDEA中的静态分析工具可以帮助开发人员发现代码中的潜在问题,提高代码质量。以下是在IDEA中使用静态分析工具的一般步骤:打开IDEA并加载项目。在IDEA的菜单栏中选择“Code” -> “Inspect Code”。在弹出的窗口中,可以
IDEA中的静态分析工具如何使用
2024-04-03

如何分析网站开发中关键字排名处于瓶颈状态时的解决办法

这篇文章将为大家详细讲解有关如何分析网站开发中关键字排名处于瓶颈状态时的解决办法,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。  首先先来分析下这些网站的共同特点。这些网站的拥有很多共同的特
2023-06-12

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录