iptables的基础知识-iptables中的状态检测

运维 系统运维
iptables的基础知识-iptables中的状态检测:iptabels被认为是Linux中实现包过滤功能的第四代应用程序。iptables包含在Linux2.4以后的内核中。本文介绍的是iptables的基础知识-iptables中的状态检测。

iptables状态

  问题:什么是iptable状态

  首先让我们看一下服务器/客户机的交互原理。服务器提供某特定功能的服务总是由特定的后台程序提供的。在TCP/IP网络中,常常把这个特定的服务绑定到特定的TCP或UDP端口。之后,该后台程序就不断地监听(listen)该端口,一旦接收到符合条件的客户端请求,该服务进行TCP握手后就同客户端建立一个连接,响应客户请求。与此同时,再产生一个该绑定的拷贝,继续监听客户端的请求。

  举一个例子:假设网络中有一台服务器A(IP地址为1.1.1.1)提供WWW服务,另有客户机B(2.2.2.2)、C(3.3.3.3)。首先,服务器A运行提供WWW服务的后台程序(比如Apache)并且把该服务绑定到端口80,也就是说,在端口80进行监听。当B发起一个连接请求时,B将打开一个大于1024的连接端口(1024内为已定义端口),假设为1037。A在接收到请求后,用80端口与B建立连接以响应B的请求,同时产生一个80端口绑定的拷贝,继续监听客户端的请求。假如A又接收到C的连接请求(设连接请求端口为1071),则A在与C建立连接的同时又产生一个80端口绑定的拷贝继续监听客户端的请求。如下所示,因为系统是以源地址、源端口、目的地址、目的端口来标识一个连接的,所以在这里每个连接都是唯一的。

  服务器 客户端

  连接1:1.1.1.1:80 <=> 2.2.2.2:1037

  连接2:1.1.1.1:80 <=> 3.3.3.3:1071

  从上边我们可以看出,每个网络连接包括以下信息:源地址、目的地址、源端口和目的端口,叫作套接字对(socket pairs);协议类型、连接状态(TCP协议)和超时时间等。iptable防火墙把这些信息叫作状态(stateful),能够检测每个连接状态的防火墙叫作状态包过滤防火墙。它除了能够完成简单包过滤防火墙的包过滤工作外,还在自己的内存中维护一个跟踪连接状态的表,比简单包过滤防火墙具有更大的安全性。这连接跟踪的表是/proc/net/ip_conntrack(conntrack就是connection tracking 的首字母缩写),能容纳多少记录是被一个变量控制的。默认值取决于你的内存大小,128MB可以包含8192条目录,256MB是16376条。你也可以在/proc/sys/net/ipv4/ip_conntrack_max里查看、设置。

  注意:必须要加载ip_conntrack模块后才可以看到/proc/net/ip_conntrack表。可以用modprobe ip_conntrack来加载。

  每一种特定的服务都有自己特定的端口,一般说来小于1024的端口多为服务器保留端口,这些端口分配给众所周知的服务(如WWW、FTP等等),从512到1024的端口通常保留给特殊的UNIX TCP/IP应用程序,具体情况请参考/etc/services文件或RFC1700。

  iptables中的状态检测功能是由state选项来实现iptable的。对这个选项,在iptables的手册页中有以下描述:

  state

  这个模块能够跟踪分组的连接状态(即状态检测)。

  格式:--state XXXXX

  这里,state是一个用逗号分割的列表,表示要匹配的连接状态。

  在iptables中有四种状态:NEW,ESTABLISHED,RELATED,INVALID。

  NEW,表示这个分组需要发起一个连接,或者说,分组对应的连接在两个方向上都没有进行过分组传输。NEW说明这个包是我们看到的第一个包。意思就是,这是conntrack模块看到的某个连接第一个包,它即将被匹配了。比如,我们看到一个SYN包,是我们所留意的连接的第一个包,就要匹配它。第一个包也可能不是SYN包,但它仍会被认为是NEW状态。比如一个特意发出的探测包,可能只有RST位,但仍然是NEW。

  ESTABLISHED,表示分组对应的连接已经进行了双向的分组传输,也就是说连接已经建立,而且会继续匹配这个连接的包。处于ESTABLISHED状态的连接是非常容易理解的。只要发送并接到应答,连接就是ESTABLISHED的了。一个连接要从NEW变为ESTABLISHED,只需要接到应答包即可,不管这个包是发往防火墙的,还是要由防火墙转发的。ICMP的错误和重定向等信息包也被看作是ESTABLISHED,只要它们是我们所发出的信息的应答。

  RELATED,表示分组要发起一个新的连接,但是这个连接和一个现有的连接有关,例如:FTP的数据传输连接和控制连接之间就是RELATED关系。RELATED是个比较麻烦的状态。当一个连接和某个已处于ESTABLISHED状态的连接有关系时,就被认为是RELATED的了。换句话说,一个连接要想是RELATED的,首先要有一个ESTABLISHED的连接。这个ESTABLISHED连接再产生一个主连接之外的连接,这个新的连接就是RELATED的了,当然前提是conntrack模块要能理解RELATED。ftp是个很好的例子,FTP-data连接就是和FTP-control有RELATED的。还有其他的例子,

  INVAILD,表示分组对应的连接是未知的,说明数据包不能被识别属于哪个连接或没有任何状态。有几个原因可以产生这种情况,比如,内存溢出,收到不知属于哪个连接的ICMP错误信息。一般地,我们DROP这个状态的任何东西。

  这些状态可以一起使用,以便匹配数据包。这可以使我们的防火墙非常强壮和有效。以前,我们经常打开1024以上的所有端口来放行应答的数据。现在,有了状态机制,就不需再这样了。因为我们可以只开放那些有应答数据的端口,其他的都可以关闭。这样就安全多了。

  上一节:iptables的基础知识-防火墙的介绍。下一节:iptables中TCP的三次握手

【编辑推荐】

IPtables防火墙使用技巧(超实用)

Linux下Iptables端口转发功能的解决

四种NAT的iptables实现

责任编辑:zhaolei 来源: netren
相关推荐

2011-03-16 11:17:56

IptablesICMP

2011-03-18 09:26:13

Iptables规则

2011-03-16 11:15:12

2011-03-18 08:52:23

Iptables

2011-03-18 09:26:14

iptableslimit

2011-03-16 11:06:55

Iptables防火墙

2011-03-18 09:26:13

IptablesTOS

2011-08-22 10:52:30

iptables状态

2023-07-14 15:10:17

PythonAsyncIO库

2011-03-14 14:40:11

iptables编译

2013-10-22 15:48:35

2011-03-16 09:05:34

iptablesnat

2023-07-04 07:31:06

MapReduce数据处理编程模型

2011-03-16 14:38:55

iptables命令

2011-03-16 14:55:36

关闭iptables

2011-03-15 09:59:54

2011-03-16 09:30:47

iptables过滤

2011-03-14 15:17:40

iptables设定

2011-03-15 09:59:54

2021-11-05 15:31:01

UbuntuLinux
点赞
收藏

51CTO技术栈公众号