一. 前言
MARK是iptables的一个目标,用于给数据包打上指定mark,当我们使用MARK目标的时候,通常是我们在配置策略路由(网上有很多文章介绍怎么配置策略路由的,这里不在赘述)的时候,需要给一个包加上某个mark,然后ip rule某条规则中的fwmark匹配到该mark,数据包就会根据该规则的lookup参数指定的路由表中的规则转发,举例如下:
# 匹配到fwmark 0x190(400)的包,会查找路由表3,根据路由表3的默认路由转发。
~ # ip rule show
0: from all lookup local
400: from all fwmark 0x190 lookup 3
32766: from all lookup main
32767: from all lookup default~ # ip route show table 3
default via 192.168.2.5 dev eth2.2
CONNMARK也是iptables的一个目标,用于给一个网络连接标记一个连接mark,也就是网络连接的整个过程的交互包都被该连接mark标记。连接mark一般用于设备有多个WAN口的场景,假设当设备的默认路由是WAN1的时候,外面的设备访问到WAN2时,WAN2的回包正常会走WAN1出去(WAN1是默认路由接口),但是这时不对的。这时就需要给WAN2进来的数据包打上连接mark,并且配合策略路由,让包从WAN2返回,下一篇文章会介绍一个案例。
二. MARK目标
选项:
1. --set-mark
为匹配的数据包加上mark,如下:
iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2
访问TCP的22端口的数据包打上2的mark。
三. CONNMARK目标
选项:
1. --set-mark
为匹配的数据包加上连接mark,该数据包所在的这条连接都由该连接mark标识。举例如下:
iptables -t mangle -A PREROUTING -p tcp --dport 80 -j CONNMARK --set-mark 4
访问TCP的80端口的该条连接打上4的连接mark。也就是该数据包所在的连接被加上了4的连接mark。
2. --save-mark
保存一个数据包的mark到该包所在的连接的连接mark,通俗的说就是一个数据包被标识了一个mark数值,--save-mark可以将该数值设置为该包所在连接的连接mark。举例如下:
iptables -t mangle -A PREROUTING -i eth2.2 -j MARK --set-mark 400
iptables -t mangle -A PREROUTING -j CONNMARK --save-mark
上面第一行表示,从eth2.2来的数据包都加上400的mark,第二行表示将数据包的mark设置为通过eth2.2的连接mark。
3. --restore-mark
作用和--save-mark相反,将连接mark设置到某个数据包中,成为该数据包的mark。通俗解释就是,我们通过--set-mark为一个数据包设置mark,通过--save-mark将整个连接设置了连接mark,但是除了第一个被--set-mark有mark标识除外,该连接其他的数据包是没有mark的,所以,我们需要--restore-mark,将连接mark重新设置回该连接的每个数据包中。数据包中有了mark,才能匹配到ip rule的fwmark,才能使用策略路由。举例如下:
iptables -t mangle -A OUTPUT -j CONNMARK --restore-mark
上面规则表示,通过OUTPUT出去包的数据包,都会将该数据包所在的连接的连接mark设置到该数据包中。我们知道,只有通过-j CONNMARK --setmark或者-j MARK --set-mark和--save-mark的配合使用才能给一个连接加上连接mark,所以,经过该规则的包,如果有连接mark,则连接mark会被设置到该包中,如果没有连接mark,但是包自身有mark,则自身的mark会被清除,如果没有连接mark,包自身也没有mark,则无影响。
四. 总结
MARK目标是为数据包加mark,CONNMARK是为某一条连接加连接mark,mark和连接mark可以通过--save-mark和--restore-mark的处理,将一个连接的连接mark设置为连接中的数据包mark,也可以将一个数据包的mark设置为所在的连接的连接mark。下一篇通过一个案例具体解析一下MARK和CONNMARK的作用。