ivanleoncz Asked: 2018-09-06 08:33:39 +0800 CST2018-09-06 08:33:39 +0800 CST 2018-09-06 08:33:39 +0800 CST --set-mark 选项如何在 Netfilter (IPTABLES) 上工作? 772 在 Netfilter 上,您可以选择--set-mark通过mangle表的数据包。 互联网上的大多数教程和示例都说这只是在数据包上添加了一个标记,就像这样,但是没有关于设置什么标记以及它在数据包上的位置的其他详细信息: iptables -A PREROUTING -t mangle -i eth0 -p tcp --dport 80 -j MARK --set-mark 1 我的问题是: 设置了什么样的标记以及该标记在数据包中的确切位置? iptables netfilter 1 个回答 Voted Best Answer A.B 2018-09-06T14:46:45+08:002018-09-06T14:46:45+08:00 该标记是附加到网络数据包的 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 旁边还有其他相关标记: connmark,它不与数据包的 sk_buff 一起存储,而是存储在跟踪数据包流的 conntrack 条目中。它的 connmark 当然可以被 iptables 与它的connmark匹配和CONNMARK目标一起使用,这里有一个使用示例:Netfilter Connmark To Linux and beyond !. 它允许记住基于单个数据包做出的决定,然后将其应用于同一连接的所有数据包。 secmark同样,其相关联connsecmark的旨在与 Linux 安全模块(例如SELinux )进行交互。
该标记是附加到网络数据包的 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
,和其他几个地方...
该标记的主要目标是让所有这些网络部分通过将其用作一种消息来相互交互。Netfilter 和 General Networking中的数据包流可以帮助查看这些元素以什么顺序接收数据包的处理以及它的标记。
fwmark 旁边还有其他相关标记:
connmark
,它不与数据包的 sk_buff 一起存储,而是存储在跟踪数据包流的 conntrack 条目中。它的 connmark 当然可以被 iptables 与它的connmark
匹配和CONNMARK
目标一起使用,这里有一个使用示例:Netfilter Connmark To Linux and beyond !. 它允许记住基于单个数据包做出的决定,然后将其应用于同一连接的所有数据包。secmark
同样,其相关联connsecmark
的旨在与 Linux 安全模块(例如SELinux )进行交互。