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
,还有其他几个地方...
该标记的主要目标是通过将其用作一种消息来使所有这些网络部件相互交互。Netfilter 和 General Networking 中的数据包流可以帮助查看这些元素将按什么顺序接收数据包的处理以及其标记。
fwmark 旁边还有其他相关的标记:
connmark
,它不与数据包的 sk_buff 一起存储,而是在跟踪数据包流的 conntrack 条目中。它的 connmark 当然可以被 iptables 使用它的connmark
匹配和CONNMARK
目标,在那里有一个使用示例:Netfilter Connmark To Linux 及更高版本!. 它允许记住基于单个数据包做出的决定,然后将其应用于同一连接的所有数据包。secmark
以及其关联connsecmark
的旨在与 Linux 安全模块(例如SELinux )交互的相关联。