IPTables Corresponder por hashing de endereços IP

3

Então, estou tentando fazer mais ou menos isso

link

no Linux.

Para explicar um pouco mais: PCC apenas pega, digamos, o endereço de origem do pacote, o hashes, divide o hash por algum número e, se o resto for igual a outro número, faz uma correspondência de regra.

Na verdade, estou usando isso para dividir minha rede aleatoriamente em vários grupos quase igualmente grandes. Mais especificamente, seis desses grupos ficariam assim:

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

Os grupos recebem então algum tipo de recurso comum para compartilhar (digamos, largura de banda ou endereço IP público) que eles não gostam de alterar com muita frequência (especialmente com o endereço IP público).

Minha pergunta é que, se houver algum método bom para dividir a rede em qualquer número de sub-redes estocasticamente iguais usando algumas regras de iptables similares, de preferência fáceis.

Consegui dividir a rede em potências de dois usando o u32 (2 ^ n redes apenas combinando os últimos n bits do endereço IP de origem). Mas alguma aleatoriedade seria ótima também, e ter uma rede dividida em algo como terços exatos é impossível de fazer com isso. Além disso, os mikrotiks são essencialmente baseados em linux, então tem para ser uma maneira de fazer isso: D

Alguém aqui está ciente de um bom método, ou pelo menos de alguma boa documentação do u32 que tornaria isso possível?

Obrigado antecipadamente

-mk

    
por exa 20.02.2011 / 16:52

2 respostas

0

Moreover, mikrotiks are essentially linux-based, so there has to be a way to do that :D

Bem, então o Mikrotik ™ precisa usar a GPL ou ser processado por não vender um produto baseado em software GPL. Caso já estejam GPL, você pode pesquisar o código-fonte. Caso não estejam - ajude-os. ; -)

Eu duvido que exista um módulo como este disponível para o Netfilter, mas eu acho que não seria muito difícil escrevê-lo usando qualquer similar como um exemplo.

having a network split into anything like exact thirds is impossible to do with this.

Por que você pensa assim? Suponha que você esteja mascarando com 0xF [0..15]; o que então faz com que você não consiga dividi-lo em intervalos [0..5], [6..11], [12..15]? Sim, não exatamente, mas muito perto de 1/3. A ampla gama que você usaria, a divisão mais próxima que você teria.

    
por 20.02.2011 / 20:57
0

Como uma alternativa ao uso do módulo u32 do netfilter, que, como você descobriu, é praticamente não documentado, você pode usar o subsistema nfnetlink_queue do netfilter. A idéia é que você envie pacotes através de um processo de espaço de usuário (provavelmente um daemon) que examina os pacotes, MARCA-os como achar melhor e, em seguida, os retorna ao netfilter para processamento adicional.

A mecânica disso é relativamente direta. As metas iptables QUEUE e NFQUEUE colocam pacotes selecionados em uma fila e um processo de espaço do usuário leva os pacotes de lá por meio da nfnetlink_queue API ( documentação aqui ). Como cada pacote retorna ao netfilter a partir do userspace, a MARK definida pelo processo pode ser usada para direcionar pacotes através de processamento adicional (por exemplo, iptables ou tc ).

Advertência: Eu nunca realmente implementei uma solução usando o módulo de fila do netlink, então eu não tenho experiência em primeira mão com relação à sua potencial robustez, segurança ou desempenho. Obviamente, um daemon userspace através do qual os fluxos de pacotes de rede precisariam ser desenvolvidos com uma boa dose de cuidado.

    
por 20.02.2011 / 21:29