欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

构筑Linux防火墙之IPtables的概念与用法(2)

程序员文章站 2022-06-19 18:23:01
目标(target) 我们已经知道,目标是由规则指定的操作,那些与规则匹配的信息包执行这些操作。除了允许用户定义的目标之外,还有许多可用的目标选项。用于建立高级规则的目标,如LOG... 09-03-10...
目标(target)
我们已经知道,目标是由规则指定的操作,那些与规则匹配的信息包执行这些操作。除了允许用户定义的目标之外,还有许多可用的目标选项。用于建立高级规则的目标,如log、redirect、mark、mirror 和masquerade等。
状态机制
状态机制是iptables中特殊的一部分,其实它不应该叫状态机制,因为它只是一种连接跟踪机制。但是,很多人都认可状态机制这个名字。连接跟踪可以让netfilter知道某个特定连接淖刺t诵辛痈俚姆阑鹎匠谱鞔凶刺频姆阑鹎剑韵录虺莆刺阑鹎健w刺阑鹎奖确亲刺阑鹎揭踩蛭市砦颐潜嘈锤厦艿墓嬖颉?br>
在iptables里,包是和被跟踪连接的四种不同状态有关的。它们是new、established、related和invalid。使用--state匹配操作,我们能很容易地控制“谁或什么能发起新的会话”。
所有在内核中由netfilter的特定框架做的连接跟踪称作conntrack(就是connection tracking的首字母缩写)。conntrack可以作为模块安装,也可以作为内核的一部分。大部分情况下,我们需要更详细的连接跟踪。因此,conntrack中有许多用来处理tcp、udp或icmp协议的部件。这些模块从数据包中提取详细的、唯一的信息,因此能保持对每一个数据流的跟踪。这些信息也告知conntrack流当前的状态。例如,udp流一般由他们的目的地址、源地址、目的端口和源端口唯一确定。
在以前的内核里,我们可以打开或关闭重组功能。然而,自从iptables和netfilter,尤其是连接跟踪被引入内核,这个选项就被取消了。因为没有包的重组,连接跟踪就不能正常工作。现在重组已经整合入conntrack,并且在conntrack启动时自动启动。不要关闭重组功能,除非你要关闭连接跟踪。
除了本地产生的包由output链处理外,所有连接跟踪都是在prerouting链里进行处理的,意思就是说iptables会在prerouting链里重新计算所有的状态。如果我们发送一个流的初始化包,状态就会在output链里被设置为new,当我们收到回应的包时,状态就会在prerouting链里被设置为established。如果第一个包不是本地产生的,那就会在prerouting链里被设置为new状态。综上所述,所有状态的改变和计算都是在nat表中的prerouting链和output链里完成的。
正如前面说的,包的状态依据ip所包含的协议不同而不同,但在内核外部,也就是用户空间里,只有4种状态:new、established、related和invalid。它们主要是和状态匹配一起使用。
new
new说明这个包是我们看到的第一个包。意思就是,这是conntrack模块看到的某个连接第一个包,它即将被匹配了。比如,我们看到一个syn包,是我们所留意的连接的第一个包,就要匹配它。第一个包也可能不是syn包,但它仍会被认为是new状态。
established
established已经注意到两个方向上的数据传输,而且会继续匹配这个连接的包。处于established状态的连接是非常容易理解的。只要发送并接到应答,连接就是established的了。一个连接要从new变为established,只需要接到应答包即可,不管这个包是发往防火墙的,还是要由防火墙转发的。icmp的错误和重定向等信息包也被看作是established,只要它们是我们所发出的信息的应答。
related
related是个比较麻烦的状态。当一个连接和某个已处于established状态的连接有关系时,就被认为是related的了。换句话说,一个连接要想是related的,首先要有一个established的连接。这个established连接再产生一个主连接之外的连接,这个新的连接就是related的了,当然前提是conntrack模块要能理解related。ftp是个很好的例子,ftp-data 连接就是和ftp-control有related的。
invalid
invalid说明数据包不能被识别属于哪个连接或没有任何状态。有几个原因可以产生这种情况,比如,内存溢出,收到不知属于哪个连接的icmp错误信息。一般地,我们drop这个状态的任何东西。
这些状态可以一起使用,以便匹配数据包。这可以使我们的防火墙非常强壮和有效。以前,我们经常打开1024以上的所有端口来放行应答的数据。现在,有了状态机制,就不需再这样了。因为我们可以只开放那些有应答数据的端口,其他的都可以关闭。这样就安全多了。