Итак, я пытаюсь сделать примерно это
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. Чем широкий диапазон вы создадите, тем ближе будет разделение.