• iptables mark 相关用法及使用举例


    iptables配置mangle规则:

    • 小写字母是匹配模块,大写字母是标记模块。
    • 带CONN的是标记链接,不带的是标记数据包。

    参数含义

    • -t mangle                     代表表 table,就是mangle表
    • -A POSTROUTING     代表链chain,分别可以PREROUTING POSTROUTING FORWARD
    • -m                                代表匹配mark模块,m 即match匹配的意思
    • --mark value[/mask]    如果指定了 mask掩码,就先把mark值和掩码取逻辑与,然后再和skb的mark值比较
    • -j   标记
      • -j MARK     标记数据包 linux系统是skb->mark
      • --set-mark  标记数据包
    • -j CNNMARK      标记链接 nf_contract->mark
      • --set-mark           标记链接
      • --save-mark        保存数据包skb中的mark到链接nf_contract中mark上
      • --restore-mark     将链接中的MARK设置到同一链接的其它数据包中

    1)skb打标记mark

    • iptables -t mangle -A POSTROUTING -m mark --mark 0/0x000000FF -j MARK --set-mark 0x00000010/0x00000000FF

    在POSTROUTING链上mangle表中,所有报文低字节打上0x00000010mark。

    2)contract打标记mark

    • iptables -t mangle -A PREROUTING -p tcp -j CONNMARK --set-mark 0x00000010

    在PREROUTING链上mangle表中,所有tcp链接低字节打上0x00000010 mark。

    3)判断skb标记mark

    • iptables -t mangle -A POSTROUTING ! -m mark --mark 0x00000010/0x000000FF -j DROP

    在POSTROUTING链上mangle表中,最低位字节如果不满足mark值,则drop掉

    4)将skb的mark 复制到contract上的mark

    • iptables -t mangle -A POSTROUTING ! -m mark --mark 0/0x000000FF -j CONNMARK --save-mark

    在POSTROUTING链上mangle表中,将skb的mark 复制到contract上的mark

    • iptables -t mangle -A PREROUTING -p tcp -m mark --mark 1 -j CONNMARK --save-mark

    在PREROUTING链上mangle表中,所有tcp报文,报文mark为1的报文,保存到contract的mark上。

    5)将contract上的mark 复制到skb的mark

    • iptables -t mangle -A POSTROUTING -m mark --mark 0/0x000000FF -j CONNMARK --restore-mark --ctmask 0x000000FF -nfmask 0x000000FF

    6) 判断skb mark

    • iptables -t mangle -A POSTROUTING ! -m mark --mark 0/0xff000000 -j RETURN

    数据包已经被mark上,直接返回

    具体举例


    # 数据包标记为0x60

    • iptables -t mangle -A PREROUTING -j MARK --set-mark 0x60


    # 匹配标记为0x60的数据包,并保存数据包中的标记设置到链接中

    • iptables -t mangle -A PREROUTING -m mark --mark 0x60 -j CONNMARK --save-mark

    # 链接标记为0x60

    • iptables -t mangle -A PREROUTING -j CONNMARK --set-mark 0x60


    # 匹配链接标记为0x60数据包,并将链接中的标记设置到数据包中

    • iptables -t mangle -A PREROUTING -m connmark --mark 0x60 -j CONNMARK --restore-mark


    一个现实应用
    –restore-mark 与 --set-mark 和 --save-mark 进行配合,完成给链接打标记,进而为链接上的所有数据包打标记。

    1. iptables -A POSTROUTING -t mangle -j CONNMARK --restore-mark
    2. iptables -A POSTROUTING -t mangle -m mark ! --mark 0 -j ACCEPT
    3. iptables -A POSTROUTING -t mangle -m mark --mark 0 -p tcp --dport 21 -j MARK --set-mark 1
    4. iptables -A POSTROUTING -t mangle -m mark --mark 0 -p tcp --dport 80 -j MARK --set-mark 2
    5. iptables -A POSTROUTING -t mangle -m mark --mark 0 -p tcp -j MARK --set-mark 3 
    6. iptables -A POSTROUTING -t mangle -j CONNMARK --save-mark


    规则1,完成了将链接跟踪上的标记记录到该连接上的每一个数据包中。
    规则2,匹配数据包标记不为0的数据包,直接ACCEPT。如果为0,则交由后面的规则进行匹配并打标记。
    如果一条链接的第1个数据包经过规则1后,由于ct->mark为0,所以其数据包标记skb->nfmark也为0,就需要进行后面规则的匹配。
    规则3~5,按照匹配选项对符合规则的数据包打上不同的标记。--mark 0 表示数据包的mark此时是0,才做后续动作
    规则6,将数据包上的标记记录到链接跟踪上。
    当属于该链接的下一个数据包走到规则1后,就会被打上标记,命中第2条规则,直接ACCEPT。
     

  • 相关阅读:
    动态代理记录
    广播机制之动态注册和静态注册
    sed编辑器
    内存利用:迟来的blindless与逃不掉的exit漏洞
    宣布 .NET MAUI 支持 .NET 7 Release Candidate 2
    什么是葡萄酒酿造工艺中的“冷浸渍”?
    java计算机毕业设计vue架构云餐厅美食订餐系统MyBatis+系统+LW文档+源码+调试部署
    2022年数字藏品术语(数字艺术品术语)
    C++I/O流
    DRF分页器(Django Restful Framework)
  • 原文地址:https://blog.csdn.net/mudawei1/article/details/126304533