6.5.11. RETURN target
顾名思义,他使包返回上一层,顺序是:子链——>父链——>缺省的策略。具体地说,就是若包在子链中碰到了RETURN,则返回父链的下一条规则继续进行条件的比较,若是在父链(或称主链,比如INPUT)中碰到了RETURN,就要被缺省的策略(一般是ACCEPT或DROP)操作了。(译者注:这很象C语言中函数返回值的情况)
我们来举个例子说明一下,假设一个包进入了INPUT链,匹配了某条target为--jump EXAMPLE_CHAIN规则,然后进入了子链EXAMPLE_CHAIN。在子链中又匹配了某条规则,恰巧target是--jump RETURN,那包就返回INPUT链了。假如在INPUT链里又碰到了--jump RETURN,那这个包就要交由缺省的策略来处理了。
6.5.12. SNAT target
这个target是用来做源网络地址转换的,就是重写包的源IP地址。当我们有几个机子共享一个Internet 连接时,就能用到他了。先在内核里打开ip转发功能,然后再写一个SNAT规则,就能够把任何从本地网络出去的包的源地址改为Internet连接的地址了。假如我们不这样做而是直接转发本地网的包的话,Internet上的机子就不知道往哪儿发送应答了,因为在本地网里我们一般使用的是IANA组织专门指定的一段地址,他们是不能在Internet上使用的。SNAT target的作用就是让任何从本地网出发的包看起来都是从一台机子发出的,这台机子一般就是防火墙。
SNAT只能用在nat表的POSTROUTING链里。只要连接的第一个符合条件的包被SNAT了,那么这个连接的其他任何的包都会自动地被SNAT,而且这个规则还会应用于这个连接所在流的任何数据包。
Table 6-22. SNAT target
| 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以内的另一个端口,512和1023之间的将会被映射到 1024内,其他的将会被映射到大于或对于1024的端口,也就是说是同范围映射。还要注意,这种映射和目的端口无关。因此,假如客户想和防火墙外的HTTP服务器联系,他是不会被映射到FTP control所用的端口的。 |
6.5.13. TOS target
TOS是用来配置IP头中的Type of Service字段的。这个字段长一个字节,能够控制包的路由情况。他也是iproute2及其子系统能够直接使用的字段之一。值得注意的是,假如您有几个单独的防火墙和路由器,而且还想在他们之间利用包的头部来传递路由信息,TOS是唯一的办法。前面说过,MARK是不能用来传递这种信息的。假如您需要为某个包或流传递路由信息,就要使用TOS字段,他也正是为这个而被研发的。
Internet上有很多路由器在这一方面并没有做好工作,因此,在发送包之前改变其TOS没有什么大用处。最好的情况是路由器根本不理他,最坏的情况是路由器会根据TOS处理,但都是错误的。然而,假如您是在一个很大的WAN或LAN里,而且有很多路由器,TOS还是能有很好的作为的。总的来说,基于TOS的值给包以不同的路由和参数还是可能的,即使在网络里是受限制的(译者注:大不了不起作用就是了)。
![]() | TOS只能用来配置具体的或说是特定的值(这些预定义的值在内核源码的include文档——Linux/ip.h中),原因是很多的,但不管怎么说,您不要使用其他的值就是了。当然,我们也有办法突破这个限制,就是使用一个名为FTOS的patch,您可在由Matthew G. Marsh维护的站点 Paksecured Linux Kernel patches得到他,但要小心使用哦。除了很特别、极端的情况,我们是不应该使用预定义以外的值的。 |
![]() | 注意,这个target只能在mangle表内使用。 |






