iptables的动作和跳转

      动作target/跳转jump告诉一条规则当报文完全匹配该条规则的时候,应该怎么处理此报文。系统里面有很多基本的target,例如ACCEPT和DROP等等。但是在我们介绍这些target之前,我们一起简要的看一下jump是如何工作的。

      Jump其实和target工作方式完全一样,只是jump需要在同一表内指定一条链。我们之前已经解释过,用户自定义的链通过-N命令创建,例如我们首先创建一个tcp_packets链,用如下命令:  

iptables -N tcp_packets

     接着我们在增加一个到这条链的跳转

iptables -A INPUT -p tcp -j tcp_packets

    接着我们从INPUT链跳转到tcp_packets链,并且开始tcp_packets链的遍历。假如报文到达链的尾部(即未匹配上任何工作),就返回到父链的下一条规则继续执行。假如一个报文在子链里面被一条规则匹配上,那就相当于在父链里面匹配,它不会在返回父链继续遍历规则。请注意这个报文会和其他正常流程一样在所有其他的链里面遍历。

    target指定我们要对包做的操作,比如DROP和ACCEPT,还有很多,我们后面会介绍。不同的target有不同的结果。

ACCEPT target

    ACCEPT target不需要任何才是,一旦一个报文满足了匹配规则,它就会被ACCEPT。这样本条规则被匹配上之后,它就不会继续在本链或者本表的其他链中遍历。但是请注意,系统中可能还有其他的表,报文也有可能在那儿被丢弃。

DROP target

    顾名思义,如果包符合条件,这个target就会把它丢掉,也就是说包的生命到此结束,不会再向前走一步,效果就是包被阻塞了。在某些情况下,这个target会引起意外的结果,因为它不会向发送者返回任何信息,也不会向路由器返回信息,这就可能会使连接的另一方的sockets因苦等回音而亡,解决这个问题的较好的办法是使用REJECT target,因为它在丢弃包的同时还会向发送者返回一个错误信息,这样另一方就能正常结束。

REJECT target

    REJECT和DROP基本一样,区别在于它除了阻塞包之外,还向发送者返回错误信息。现在,此target还只能用在INPUT、FORWARD、OUTPUT和它们的子链里,而且包含 REJECT的链也只能被它们调用,否则不能发挥作用。它只有一个选项,是用来控制返回的错误信息的种类的。

REJECT target options

Option

–reject-with

Example

iptables -A FORWARD -p TCP –dport 22 -j REJECT –reject-with tcp-reset

Explanation

告诉REJECT target应向发送者返回什么样的信息。一旦包满足了设定的条件,就要发送相应的信息,然后再象DROP一样无情地抛弃那些包。可用的信息类型有:

1、icmp-net-unreachable 2、icmp-host-unreachable 3、 icmp-port-unreachable 4、icmp-proto-unreachable 5、icmp-net-prohibited 6、icmp-host-prohibited 。其中缺省的是port-unreachable。你可以在附录ICMP类型中看到更多的信息。还有一个类型——echo-reply,它只能和匹配 ICMP ping包的规则联用。最后一个类型是tcp-reset,(显然,只能用于TCP协议)它的作用是告诉REJECT返回一个TCP RST包(这个包以文雅的方式关闭TCP连接,有关它的详细信息在RFC 793 – Transmission Control Protocol里)给发送者。正如iptables的 man page中说的,tcp-reset主要用来阻塞身份识别探针(即113/tcp,当向被破坏的邮件主机发送邮件时,探针常被用到,否则它不会接受你的信)。


 

RETURN target

    顾名思义,它使包返回上一层,顺序是:子链——>父链——>缺省的策略。具体地说,就是若包在子链中遇到了RETURN,则返回父链的下一条规则继续进行条件的比较,若是在父链(或称主链,比如INPUT)中遇到了RETURN,就要被缺省的策略(一般是ACCEPT或DROP)操作了。

SNAT target

    这个target是用来做源网络地址转换的,就是重写包的源IP地址。当我们有几个机子共享一个Internet 连接时,就能用到它了。先在内核里打开ip转发功能,然后再写一个SNAT规则,就可以把所有从本地网络出去的包的源地址改为Internet连接的地址了。如果我们不这样做而是直接转发本地网的包的话,Internet上的机子就不知道往哪儿发送应答了。

    SNAT只能用在nat表的POSTROUTING链里。只要连接的第一个符合条件的包被SNAT了,那么这个连接的其他所有的包都会自动地被SNAT,而且这个规则还会应用于这个连接所在流的所有数据包。

SNAT target options

Option

–to-source

Example

iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT –to-source 194.236.50.155-194.236.50.160:1024-32000

Explanation

指定源地址和端口,有以下几种方式:

1、单独的地址。

2、一段连续的地址,用连字符分隔,如194.236.50.155-194.236.50.160,这样可以实现负载平衡。每个流会被随机分配一个IP,但对于同一个流使用的是同一个IP

3、在指定-p tcp 或 -p udp的前提下,可以指定源端口的范围,如194.236.50.155:1024-32000,这样包的源端口就被限制在1024-32000了。

注意,如果可能,iptables总是想避免任何的端口变更,换句话说,它总是尽力使用建立连接时所用的端口。但是如果两台机子使用相同的源端口,iptables 将会把他们的其中之一映射到另外的一个端口。如果没有指定端口范围, 所有的在512以内的源端口会被映射到512以内的另一个端口,5121023之间的将会被映射到 1024内,其他的将会被映射到大于或等于1024的端口,也就是说是同范围映射。还要注意,这种映射和目的端口无关。因此,如果客户想和防火墙外的HTTP服务器联系,它是不会被映射到FTP control所用的端口的。

 

DNAT target

    DNAT target用来做目的地址转换,换句话讲就是重写报文的目的地址。假如一个报文匹配了这个规则,而且这条规则的target是DANT,那么这个报文以及这条连接上的所有后续报文都会被转换地址。这个功能相当有用,例如你有一个主机在LAN内运行web服务,但是没有可以在internet上路由的IP,这个时候你可以告诉防火墙把所有访问HTTP端口的报文转发到这台主机。目的地址还可以是一个地址段,这样做就起到了负载分担的效果。
    注意DNAT只在NAT表里面的PREROUTING和OUTPUT链上有效,或者是被这两条链调用的链里。但还要注意的是,包含DANT target的链不能被除此之外的其他链调用,如POSTROUTING。

DNAT target options

Option

–to-destination

Example

iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 –dport 80 -j DNAT –to-destination 192.168.1.1-192.168.1.10

Explanation

指定要写入IP头的地址,这也是包要被转发到的地方。上面的例

子就是把所有发往地址15.45.23.67的包都转发到一段LAN使用的私有地址中,即192.168.1.1到192.168.1.10。如前所述,在这种情况下,每个流都会被随机分配一个要转发到的地址,但同一个流总是使用同一个地址。我们也可以只指定一个IP地址作为参数,这样所有的包都被转发到同一台机子。我们还可以在地址后指定一个或一个范围的端口。比如:–to-destination 192.168.1.1:80或 –to-destination 192.168.1.1:80-100。SNAT的语法和这个target的一样,只是目的不同罢了。要注意,只有先用–protocol指定了TCP或 UDP协议,才能使用端口。


 

REDIRECT target

    在防火墙所在的机子内部转发包或流到另一个端口。比如,我们可以把所有去往端口HTTP的包REDIRECT到HTTP proxy(例如squid),当然这都发生在我们自己的主机内部。本地生成的包都会被映射到127.0.0.1。换句话说,这个target把要转发的包的目的地址改写为我们自己机子的IP。我们在做透明代理(LAN内的机子根本不需要知道代理的存在就可以正常上网)时,这个target可是起了很大作用的。

    注意,它只能用在nat表的PREROUTING、OUTPUT链和被它们调用的自定义链里。 REDIRECT只有一个选项:

Option

–to-ports

Example

iptables -t nat -A PREROUTING -p tcp
–dport 80 -j REDIRECT –to-ports 8080

Explanation

在指定TCPUDP协议的前提下,定义目的端口,方式如下:

1、不使用这个选项,目的端口不会被改变。

2、指定一个端口,如–to-ports 8080

3、指定端口范围,如–to-ports 8080-8090

 

TOS target

    TOS是用来设置IP头中的Type of Service字段的。这个字段长一个字节,可以控制包的路由情况。它也是iproute2及其子系统可以直接使用的字段之一。值得注意的是,如果你有几个独立的防火墙和路由器,而且还想在他们之间利用包的头部来传递路由信息,TOS是唯一的办法。前面说过,MARK是不能用来传递这种信息的,它只能在本机内核内使用。如果你需要为某个包或流传递路由信息,就要使用TOS字段,它也正是为这个而被开发的。

    TOS target只能设置为指定数值或者命名数值。

Option

–set-tos

Example

iptables -t mangle -A PREROUTING -p TCP
–dport 22 -j TOS –set-tos 0x10

Explanation

设置TOS的值,值的形式可以是名字或者使相应的数值(十进制或16进制的)。一般情况下,建议你使用名字而不使用数值形式,因为以后这些数值可能会有所改变,而名字一般是固定的。TOS字段有8个二进制位,所以可能的值是0-255(十进制)或0x00-0xFF16进制)。如前所述,你最好使用预定义的值,它们是:

1Minimize-Delay
16 (0x10)
,要求找一条路径使延时最小,一些标准服务如telnetSSHFTP- control 就需要这个选项。

2Maximize-Throughput
8 (0x08)
,要求找一条路径能使吞吐量最大,标准服务FTP-data能用到这个。

3Maximize-Reliability
4 (0x04)
,要求找一条路径能使可靠性最高,使用它的有BOOTPTFTP

4Minimize-Cost
2 (0x02)
,要求找一条路径能使费用最低,一般情况下使用这个选项的是一些视频音频流协议,如RTSPReal Time Stream Control Protocol)。

5Normal-Service
0 (0x00)
,一般服务,没有什么特殊要求。这个值也是大部分包的缺省值。

完整的列表可以通过命令iptables -j
TOS -h

得到。在1.2.5版时,这个列表就已经是完整的了,而且会保持很长一段时间。

 

TTL target

    TTL可以修改IP头中Time To Live字段的值。它有很大的作用,我们可以把所有外出包的Time To Live值都改为一样的,比如64,这是Linux的默认值。有些ISP不允许我们共享连接(他们可以通过TTL的值来区分是不是有多个机子使用同一个连接),如果我们把TTL都改为一样的值,他们就不能再根据TTL来判断了。

    TTL只能在mangle表内使用,它有3个选项:

Option

–ttl-set

Example

iptables -t mangle -A PREROUTING -i eth0
-j TTL –ttl-set 64

Explanation

设置TTL的值。这个值不要太大,也不要太小,大约64就很好。值太大会影响网络,而且有点不道德,为什么这样说呢?如果有些路由器的配置不太正确,包的TTL又非常大,那它们就会在这些路由器之间往返很多次,值越大,占用的带宽越多。这个target就可以被用来限制包能走多远,一个比较恰当的距离是刚好能到达DNS服务器。

Option

–ttl-dec

Example

iptables -t mangle -A PREROUTING -i eth0
-j TTL –ttl-dec 1

Explanation

设定TTL要被减掉的值,比如–ttl-dec 3。假设一个进来的包的TTL53,那么当它离开我们这台机子时,TTL就变为49了。为什么不是50呢?因为经过我们这台机子,TTL本身就要减1,还要被TTL
target
再减3,当然总共就是减去4了。使用这个 target可以限制
使用我们的服务的用户离我们有多远。比如,用户总是使用比较近的DNS,那我们就可以对我们的DNS服务器发出的包进行几个–ttl-dec。(译者注:意思是,我们只想让距离DNS服务器近一些的用户访问我们的服务)当然,用–set-ttl控制更方便些。

Option

–ttl-inc

Example

iptables -t mangle -A PREROUTING -i eth0
-j TTL –ttl-inc 1

Explanation

设定TTL要被增加的值,比如–ttl-inc 4。假设一个进来的包的

TTL53,那么当它离开我们这台机子时,TTL应是多少呢?答案是56,原因同–ttl-dec。使用这个选项可以使我们的防火墙更加隐蔽,而不被trace-routes发现,方法就是设置–ttl-inc 1。原因应该很简单了,包每经过一个设备,TTL就要自动减1,但在我们的防火墙里这个1又被补上了,也就是说,TTL的值没变,那么trace-routes就会认为我们的防火墙是不存在的。Trace-rout让人又爱又恨,爱它是因为在连接出问题时,它可以给我们提供极有用的信息,告诉我们哪里有毛病;恨它是由于它也可以被黑客或骇客用来收集目标机器的资料

 

Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
永久连接: http://www.nfvschool.cn/?p=300
标签:

发表评论