--set-mark 选项如何在 Netfilter (IPTABLES) 上工作?

iva*_*ncz 6 iptables netfilter

在 Netfilter 上,您可以选择--set-mark通过mangle表的数据包。

互联网上的大多数教程和示例都说这只是在数据包上添加了一个标记,就像这样,但是没有关于设置了什么标记以及它驻留在数据包上的位置的其他详细信息:

iptables -A PREROUTING -t mangle -i eth0 -p tcp --dport 80 -j MARK --set-mark 1

我的问题是:

  • 设置了什么样的标记以及该标记在数据包中的确切位置?

A.B*_*A.B 10

标记是附加到网络数据包的 32 位整数值。一些与之交互的网络部分(见下文)可以对这个值进行按位运算,然后可以在单个 32 位值到 32 个标志的集合之间进行解释,或者标志和较小值的混合,具体取决于一个选择组织它的使用(tc不能这样做)。当然,这个标记只有在 Linux 内核处理时才存在。它只是纯粹的虚拟和内部的,因为它可以不存在于网络上。根据它的使用位置,它可能被称为防火墙标记、fwmark 或简单地标记。

内核处理的每个网络数据包都由称为 的结构处理sk_buff,在linux/include/linux/skbuff.h. 该结构包括与数据包相关的各种元数据(如适用),如 IPsec 信息(如果有的话)、相关的 conntrack 条目,以及它的标记

网络堆栈的各个部分可以读取此标记,根据其值更改行为或(重新)写入它,例如:

  • tc,
  • 路由堆栈可以设置特殊规则ip rule(例如ip rule add fwmark 1 lookup 42),以使用此 fwmark 更改其路由决策(例如,使用路由表将这些数据包发送到默认接口之外的其他接口),
  • 当然iptables
  • 它的候选继任者nftables

还有其他几个地方...

该标记的主要目标是通过将其用作一种消息来使所有这些网络部件相互交互。Netfilter 和 General Networking 中数据包流可以帮助查看这些元素将按什么顺序接收数据包的处理以及其标记。

fwmark 旁边还有其他相关的标记: