Назад | Перейти на главную страницу

IPTables Match для хеширования 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 ^ n сетей, просто сопоставив последние n бит исходного IP-адреса). Но некоторая случайность тоже была бы замечательной, и разделение сети на что-то вроде точных третей невозможно с этим сделать. Более того, микротики по сути основаны на Linux, поэтому имеет чтобы быть способ сделать это: D

Кто-нибудь здесь знает о хорошем методе или, по крайней мере, о хорошей документации по u32, которая сделала бы это возможным?

заранее спасибо

-мк

В качестве альтернативы использованию модуля u32 netfilter, который, как вы обнаружили, практически не документирован, вы можете использовать nfnetlink_queue подсистема netfilter. Идея состоит в том, что вы отправляете пакеты через процесс пользовательского пространства (скорее всего, демон), который проверяет пакеты, маркирует их по своему усмотрению, а затем возвращает их в netfilter для дальнейшей обработки.

Механика этого относительно проста. В iptables QUEUE и NFQUEUE цели помещают выбранные пакеты в очередь, и процесс пользовательского пространства принимает пакеты оттуда через nfnetlink_queue API (документация здесь). Когда каждый пакет возвращается в netfilter из пользовательского пространства, МАРКА, установленная процессом, может использоваться для направления пакетов через дальнейшую обработку (например, iptables или tc).

Предостережение: я никогда не реализовывал решение, использующее модуль очереди netlink, поэтому у меня нет личного опыта относительно его потенциальной надежности, безопасности или производительности. Очевидно, что демон пользовательского пространства, через который проходят потоки сетевых пакетов, должен быть разработан с должной осторожностью.

Более того, микротики по сути основаны на Linux, поэтому должен быть способ сделать это: D

Что ж, тогда Mikrotik ™ должен перейти на GPL или быть привлечен к суду за то, что продажа продукт, основанный на программном обеспечении под лицензией GPL. Если они уже под GPL, вы можете изучить исходный код. Если нет - помогите им. ;-)


Я сомневаюсь, что для Netfilter доступен такой модуль, но я думаю, что было бы не так уж сложно написать его, используя какой-либо аналогичный в качестве примера.

разделение сети на что-то вроде точных третей невозможно с этим сделать.

Почему заставляет так думать? Предположим, вы маскируете с помощью 0xF [0..15]; что тогда мешает вам разбить его на диапазоны [0..5], [6..11], [12..15]? Да, не совсем точно, но довольно близко к 1/3. Чем широкий диапазон вы создадите, тем ближе будет разделение.