6.4.4. 针对非正常包的匹配
这个匹配没有任何参数,也无需显式地装载。注意这应该被看作是个实验性的匹配,他不总是能正常工作的,对有些不正常的包(unclean package,就是所谓的脏包)或问题,他是视而不见的。这个match 试图匹配那些好象畸形或不正常的包,比如包头错或校验和错,等等。他可能常用来DROP错误的连接、检查有错的流,但要知道这样做也可能会中断合法的连接。
这个匹配没有任何参数,也无需显式地装载。注意这应该被看作是个实验性的匹配,他不总是能正常工作的,对有些不正常的包(unclean package,就是所谓的脏包)或问题,他是视而不见的。这个match 试图匹配那些好象畸形或不正常的包,比如包头错或校验和错,等等。他可能常用来DROP错误的连接、检查有错的流,但要知道这样做也可能会中断合法的连接。
target/jump决定符合条件的包到何处去,语法是--jump target或-j target。(译者注:本文中,原作者把target细分为两类,即Target和Jump。他们唯一的区别是jump的目标是个在同一个表内的链,而target的目标是具体的操作。)我们会先接触到两个基本的target,就是ACCEPT和DROP。
前面提到过用户自定义链要用到-N命令。下面我们在filter表中建一个名为tcp_packets的链:
iptables -N tcp_packets
然后再把他作为jump的目标:
iptables -A INPUT -p tcp -j tcp_packets
这样我们就会从INPUT链跳入tcp_packets链,开始在tcp_packets中的旅行。假如到达了tcp_packets链的结尾(也就是未被链中的任何规则匹配),则会退到INPUT链的下一条规则继续他的旅行。假如在子链中被ACCEPT了,也就相当于在父链中被ACCEPT了,那么他不会再经过父链中的其他规则。但要注意这个包能被其他表的链匹配,过程可查看章节 表和链。
target指定我们要对包做的操作,比如DROP和ACCEPT,更有很多,我们后面会介绍。不同的target有不同的结果。一些target会使包停止前景,也就是不再继续比较当前链中的其他规则或父链中的其他规则,最好的例子就是DROP和ACCEPT。而另外一些target在对包做完操作之后,包还会继续和其他的规则比较,如LOG,ULOG和TOS。他们会对包进行记录、mangle,然后让包通过,以便匹配这条链中的其他规则。有了这样的target,我们就能够对同一个包既改变他的TTL又改变他的TOS。有些target必须要有准确的参数(如TOS需要确定的数值),有些就不是必须的,但假如我们想指定也能够(如日志的前缀,伪装使用的端口,等等)。本节我们会尽可能全面地介绍每一个target。现在我们就来看看有哪几种target。
这个target没有任何选项和参数,使用也很简单,指定-j ACCEPT即可。一旦包满足了指定的匹配条件,就会被ACCEPT,并且不会再去匹配当前链中的其他规则或同一个表内的其他规则,但他还要通过其他表中的链,而且在那儿可能会百DROP也说不准哦。
这个target是用来做目的网络地址转换的,就是重写包的目的IP地址。假如一个包被匹配了,那么和他属于同一个流的任何的包都会被自动转换,然后就能够被路由到正确的主机或网络。DNAT target是很有用的。比如,您的Web服务器在LAN内部,而且没有可在Internet上使用的真实IP地址,那就能够使用这个 target让防火墙把任何到他自己HTTP端口的包转发给LAN内部真正的Web服务器。目的地址也能够是个范围,这样的话,DNAT会为每一个流随机分配一个地址。因此,我们能够用这个target做某种类型地负载平衡。
注意,DANT target只能用在nat表的PREROUTING和OUTPUT链中,或是被这两条链调用的链里。但还要注意的是,包含DANT target的链不能被除此之外的其他链调用,如POSTROUTING。
Table 6-16. DNAT target