当前位置: 首页 > 图文教程 > 操作系统 > Unix/Linux > iptables的状态检测机制

Unix/Linux
Linux系统如何让双网卡合“一”而用
Linux操作系统静态路由设置技巧介绍
Linux环境下如何去远程登录Windows
实战Linux拨号上网 KPPP常见疑问解答
介绍几个与Linux网络设置有关的文件
Linux下三种网络管理工具功能及使用
Squid实现反向代理并且具备内网代理
传统网络配置命令与IP高级路由命令
审计并跟踪Linux系统的异常活动详解
如何使用Linux系统脚本简化无线网络
linux下adsl拔号与共享上网
Linux代理服务器和防火墙配置详细解析
用VNC客户端图形界面管理远程Linux系统
透视你的网络 利用vnStat监测宽带流量
Linux下使用Iptraf进行网络流量的分析
Linux服务器启动过程详解
基于Linux操作系统实现的传真系统
在Linux下建立VPN服务器来做加密代理
有备无患 Linux服务器备份和恢复技巧
如何测试和调试Apache服务器

Unix/Linux 中的 iptables的状态检测机制


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-01   浏览: 211 ::
收藏到网摘: n/a

1.什么是状态检测
每个网络连接包括以下信息:源地址、目的地址、源端口和目的端口,叫作套接字对(socket pairs);协议类型、连接状态(TCP协议)和超时时间等。防火墙把这些信息叫作状态(stateful),能够检测每个连接状态的防火墙叫作状态包过滤防火墙。它除了能够完成简单包过滤防火墙的包过滤工作外,还在自己的内存中维护一个跟踪连接状态的表,比简单包过滤防火墙具有更大的安全性。
1.什么是状态检测2.iptables的状态检测是如何工作的?2.1.iptables概述2.2.UDP连接2.3.TCP连接2.3.1.连接建立过程中状态表的变化2.3.2.透视状态表2.3.3.超时2.3.4.连接的中断2.4.ICMP3.FTP协议的状态检测每个网络连接包括以下信息:源地址、目的地址、源端口和目的端口,叫作套接字对(socket pairs);协议类型、连接状态(TCP协议)和超时时间等。防火墙把这些信息叫作状态(stateful),能够检测每个连接状态的防火墙叫作状态包过滤防火墙。它除了能够完成简单包过滤防火墙的包过滤工作外,还在自己的内存中维护一个跟踪连接状态的表,比简单包过滤防火墙具有更大的安全性。iptables中的状态检测功能是由state选项来实现的。对这个选项,在iptables的手册页中有以下描述:state这个模块能够跟踪分组的连接状态(即状态检测)。--state state这里,state是一个用逗号分割的列表,表示要匹配的连接状态。有效的状态选项包括:INVAILD,表示分组对应的连接是未知的;ESTABLISHED,表示分组对应的连接已经进行了双向的分组传输,也就是说连接已经建立;NEW,表示这个分组需要发起一个连接,或者说,分组对应的连接在两个方向上都没有进行过分组传输;RELATED,表示分组要发起一个新的连接,但是这个连接和一个现有的连接有关,例如:FTP的数据传输连接和控制连接之间就是RELATED关系。对于本地产生分组,在PREROUTING或者OUTPUT链中都可以对连接的状态进行跟踪。在进行状态检测之前,需要重组分组的分片。这就是为什么在iptables中不再使用ipchains的ip_always_defrag开关。UDP和TCP连接的状态表由/proc/net/ip_conntrack进行维护。稍后我们再介绍它的内容。状态表能够保存的最大连接数保存在/proc/sys/net/ipv4/ip_conntrack_max中。它取决于硬件的物理内存。2.iptables的状态检测是如何工作的?2.1.iptables概述在讨论iptables状态检测之前,我们先大体看一下整个netfilter框架。如果要在两个网络接口之间转发一个分组,这个分组将以以下的顺序接收规则链的检查:PREROUTING链如果必要对这个分组进行目的网络地址转换(DNAT)和mangle处理。同时,iptables的状态检测机制将重组分组,并且以以下某种方式跟踪其状态:分组是否匹配状态表中的一个已经实现(ESTABLISHED)的连接。它是否是和状态表中某个UDP/TCP连接相关(RELATED)的一个ICMP分组。这个分组是否要发起一个新(NEW)的连接。如果分组和任何连接无关,就被认为是无效(INVALID)的。FORWARD链把分组的状态和过滤表中的规则进行匹配,如果分组与所有的规则都无法匹配,就使用默认的策略进行处理。POSTROUTING链如果有必要,就对分组进行源网络地址转换(SNAT),注意:所有的分组都必须和过滤表的规则进行比较。如果你修改了规则,要拒绝所有的网络流量,那么即使分组的状态匹配状态表中的一个ESTABLISHED条目,也将被拒绝。下面,我们对UDP、TCP和ICMP三个协议分别进行分析。2.2.UDP连接UDP(用户数据包协议)是一种无状态协议,以为这个协议没有序列号。不过,这并不意味着我们不能跟踪UDP连接。虽然没有序列号,但是我们还可以使用其它的一些信息跟踪UDP连接的状态。下面是状态表中关于UDP连接的条目:udp 17 19 src=/DownloadFiles\2005september\2005-09-13\/DownloadFiles\2005september\2005-09-13\/DownloadFiles\2005september\2005-09-13\192.168.1.2 dst=/DownloadFiles\2005september\2005-09-13\/DownloadFiles\2005september\2005-09-13\/DownloadFiles\2005september\2005-09-13\192.168.1.50 sport=1032 dport=53 [UNREPLIED] src=/DownloadFiles\2005september\2005-09-13\/DownloadFiles\2005september\2005-09-13\/DownloadFiles\2005september\2005-09-13\192.168.1.50 dst=/DownloadFiles\2005september\2005-09-13\/DownloadFiles\2005september\2005-09-13\/DownloadFiles\2005september\2005-09-13\192.168.1.2 sport=53 dport=1032 use=1 这个状态表项只有在iptables过滤规则允许建立新的连接时,才能建立。以下的规则可以产生这类状态表项,这两条规则只允许向外的UDP连接:iptables -A INPUT -p udp -m state --state ESTABLISHED -j ACCEPTiptables -A OUTPUT -P udp -m state --state NEW,ESTABLISHED -j ACCEPT上面的状态表项包含如下信息:连接的协议是UDP(IP协议号17)。这个状态表项还有19秒中就超时。发起连接方向上的源、目的地址和源、目的端口。应答方向上的源、目的地址和源、目的端口。这个连接使用UNREPLIED标记,表示还没有收到应答。UDP连接的超时时间在/usr/src/linux/net/ipv4/netfilter/ip_conntrack_proto_udp.c文件中设