IPTables 匹配哈希 IP 地址

IPTables 匹配哈希 IP 地址

所以我试着这样做

http://wiki.mikrotik.com/wiki/PCC

在 Linux 上。

进一步解释一下:PCC 只是获取数据包的源地址,对其进行哈希处理,将哈希值除以某个数字,如果余数等于其他数字,则规则匹配。

我实际上用这种方法将我的网络随机划分为几个几乎同样大的组。更具体地说,六个这样的组如下所示:

Group 1: pcc_hash(source IP) % 6 = 0
Group 2: pcc_hash(source IP) % 6 = 1
... etc

然后给这些群体提供某种可以共享的公共资源(比如,带宽或公共 IP 地址),他们不喜欢经常更改这些资源(尤其是公共 IP 地址)。

我的问题是,是否有一些好的方法可以使用一些类似的、最好是简单的 iptables 规则将网络划分为任意数量的随机相等的子网。

我已成功使用 u32 将网络拆分为 2 的幂(只需匹配源 IP 地址的最后 n 位即可实现 2^n 个网络)。但一些随机性也很好,而将网络拆分为精确的三分之一是不可能做到这一点的。此外,mikrotiks 本质上是基于 linux 的,因此可以这样做:D

这里有人知道一个好的方法,或者至少有一些好的 u32 文档可以实现这一点吗?

提前致谢

-mk

答案1

此外,Mikrotiks 本质上是基于 Linux 的,所以一定有办法做到这一点:D

那么 Mikrotik™ 必须采用 GPL,否则会因不采用而被起诉。出售基于 GPL 软件的产品。如果它们已经是 GPL 软件,您可以查看源代码。如果它们不是 — 那就帮帮他们吧。;-)


我怀疑 Netfilter 是否有这样的模块,但我认为使用任何类似的模块作为示例来编写它并不太难。

将网络分成精确的三分之一是不可能的。

为什么你会这么想?假设你用 0xF [0..15] 进行掩码;那么是什么让你无法将其拆分为 [0..5]、[6..11]、[12..15] 范围?是的,不精确,但非常接近 1/3。你使用的范围越宽,划分就越接近。

答案2

作为使用 netfilter 的 u32 模块的替代方法(正如您所发现的,该模块几乎没有文档记录),您可以使用nfnetlink_queuenetfilter 的子系统。其思想是,您通过用户空间进程(很可能是守护进程)发送数据包,该进程检查数据包,根据需要对其进行标记,然后将其返回给 netfilter 进行进一步处理。

其机制相对简单。iptables QUEUENFQUEUE目标将选定的数据包放在队列中,然后用户空间进程通过 API nfnetlink_queue文档在这里)。当每个数据包从用户空间返回到 netfilter 时,该进程设置的 MARK 可用于引导数据包进行进一步处理(例如,通过iptablestc)。

警告:我从未真正使用 netlink 的队列模块实现过解决方案,因此我对其潜在的稳健性、安全性或性能没有第一手经验。显然,开发网络数据包流经的用户空间守护进程需要非常小心。

相关内容