iptables - 深入解析MARK和CONNMARK目标

一. 前言

        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的作用。

这三条iptables规则实现了以下功能: 1. 第一条规则: - 匹配状态为NEW的数据包(即新建连接的数据包)。 - 对匹配的数据包应用HMARK(哈希标记)动作。 - 使用源IP地址、源端口、目标IP地址目标端口作为哈希元组。 - 应用哈希算法mod 7。 - 设置随机种子为0xcafeface。 - 设置哈希偏移量为0x65。 这条规则的作用是对新建连接的数据包进行哈希标记,使用特定的哈希算法参数来生成标记。 2. 第二条规则: - 匹配状态为NEW的数据包。 - 对匹配的数据包应用CONNMARK(连接标记)动作。 - 保存当前连接标记到数据包的元数据中。 - 设置netfilter掩码为0xffffffff。 - 设置连接跟踪掩码为0xffffffff。 这条规则的作用是保存当前连接的标记到数据包的元数据中,以便后续的处理可以使用该标记。 3. 第三条规则: - 匹配状态为RELATED或ESTABLISHED的数据包(即相关或已建立连接的数据包)。 - 对匹配的数据包应用CONNMARK动作。 - 从数据包的元数据中恢复连接标记。 - 设置netfilter掩码为0xffffffff。 - 设置连接跟踪掩码为0xffffffff。 这条规则的作用是从相关或已建立连接的数据包的元数据中恢复连接标记,以便后续的处理可以使用该标记。 总体上,这三条规则用于在mangle表的OUTPUT链中对输出数据包进行处理标记,以便后续的处理或路由决策能够根据这些标记来进行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值