一. RETURN目标是用来做什么的?
我们都知道,数据包在iptables规则中匹配的方式是,一条链的所有规则会从头到尾,一条一条的与数据包去匹配,直到某条规则匹配到了数据包,或者,链中的所有规则都不与数据包匹配,则将会返回该链的上一级链继续匹配,或者如果该链是主链,则数据包才会被采用默认策略。
假设一个场景,一个数据包进入INPUT链,然后,遇到了一个匹配的规则,规则的目标是 -j X_CHAIN,然后,数据包进入X_CHAIN,突然,它匹配到了一个规则,规则的目标是 -j RETURN,则数据包将跳回INPUT链。
假设另一个场景,一个数据包进入INPUT链,然后,遇到了一个匹配的规则,规则的目标是-j RETURN,则数据包将会被INPUT链的默认策略处理。
所以,RETURN目标的作用是告诉系统,该类型的包不必继续和该链后面的规则继续匹配了,这样可以起到提高效率的作用。
举例:
Linux的系统运行了一个web服务器,监听80端口,另一台电脑访问它的80端口,Linux系统访问80的数据包打上mark标签2和3(只是做实验,没有实际用途)。
不使用RETURN目标的情况:
[root@localhost ~]# iptables -A INPUT -p tcp --dport 80 -j MARK --set-mark 2
[root@localhost ~]# iptables -A INPUT -p tcp --dport 80 -j MARK --set-mark 3
[root@localhost ~]# iptables -nvL
Chain INPUT (policy ACCEPT 34 packets, 2116 bytes)
pkts bytes target prot opt in out source destination
15 780 MARK tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 MARK set 0x2
15 780 MARK tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 MARK set 0x3
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 26 packets, 2588 bytes)
pkts bytes target prot opt in out source destination
可以看出打mark标签2和3匹配的数据包都是15个。
使用RETURN目标的情况:
[root@localhost ~]# iptables -A INPUT -p tcp --dport 80 -j MARK --set-mark 2
[root@localhost ~]# iptables -A INPUT -p tcp --dport 80 -j RETURN
[root@localhost ~]# iptables -A INPUT -p tcp --dport 80 -j MARK --set-mark 3
[root@localhost ~]# iptables -nvL
Chain INPUT (policy ACCEPT 36 packets, 2140 bytes)
pkts bytes target prot opt in out source destination
15 780 MARK tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 MARK set 0x2
15 780 RETURN tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
0 0 MARK tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 MARK set 0x3
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 28 packets, 2788 bytes)
pkts bytes target prot opt in out source destination
可以看出打mark标签2和3的中间插入了一条目标是RETURN动作的规则,结果打mark标签2的规则匹配完后,遇到RETURN目标就返回了,所以第一条和第二条规则匹配的包是15个,第三条规则匹配的个数是0,打mark标签3的规则没有匹配到。
二. RETURN目标如何使用?
RETURN目标使用比较简单,规则的目标设置为-j RETURN即可。
举例:
iptables -A INPUT -m mark --mark 0 -p tcp --dport 80 -j RETURN
三. 总结
RETRUN目标有不让指定的数据包在当前链继续往下匹配的能力,可以提高防火墙规则的匹配效率。