Como combinar o intervalo de portas usando o filtro u32

2

com "u32 match ip sport 80" no Linux tc Eu posso igualar a porta 80, mas como posso combinar um intervalo de portas 10000 - 20000?

    
por Supratik 06.02.2011 / 18:03

4 respostas

4

Você pode usar a máscara, mas é difícil:

 u32 match ip sport 4096 0xf000 = sport 4096-8191
 u32 match ip sport 8192 0xe000 = sport 8192-16383

0xf000 / 0xe000 é a máscara. A palavra extraída do pacote é bit-wise com essa máscara antes da comparação.

value = 0001000000000000
mask  = 1111000000000000

start = 0001000000000000
end   = 0001111111111111

Além disso, você pode criar muitos filtros para um classid:

tc filter add dev eth0 parent 1:0 prio 3 protocol ip u32 match ip protocol 6 0xff match ip sport 10000 0xffff classid 1:13
tc filter add dev eth0 parent 1:0 prio 3 protocol ip u32 match ip protocol 6 0xff match ip sport 10001 0xffff classid 1:13
tc filter add dev eth0 parent 1:0 prio 3 protocol ip u32 match ip protocol 6 0xff match ip sport 10002 0xffff classid 1:13

Para o seu exemplo, você precisa criar vários filtros 'tc':

first: sport 10000 0xfff0 (10000-10015)
second: sport 10016 0xffe0 (10016-10047)
.............

etc.

10000=10011100010000

0010011100010000
           |
     first not zero
1111111111111111
mask
1111111111110000=0xfff0

[Basicamente, pegue o primeiro número no intervalo (neste exemplo, 10.000) e convertê-lo em binário (0010011100010000); em seguida, digitalize este número binário da direita para a esquerda até encontrar o primeiro não 0 bit; então faça os bits da esquerda daquele bit todos em 1 inclusive, e todos os bits à direita dele em zeros. É assim que você sai para 0xfff0 como a máscara.]

    
por 06.02.2011 / 19:03
4

Você pode usar o ematch - extended match - em vez do filtro u32, que suporta comparações "menor que" e "maior que". Dê uma olhada na página do manual .

O seguinte combina pacotes com porta de origem no intervalo 70 - 90 (excluindo)

tc filter add dev eth0 parent 1: protocol ip prio 1 basic match "cmp(u16 at 0 layer transport gt 70) and cmp(u16 at 0 layer transport lt 90)" flowid 1:3

    
por 09.10.2013 / 09:26
2

Eu fiz um script para fazer o que @alvosu descreveu para qualquer pessoa interessada.

link

Atualmente, incluirá mais portas à direita do intervalo.

O violino está no link

Uma implementação do Python confusa também:

    import logging
    logging.getLogger().setLevel(logging.DEBUG)


    fp = 20001 # From port
    tp = 25000 # to port
    dev = 'ifb0' # dev to add filter rule to
    flow = '1:10' # flow id to set

    def find_lsm(p,o=1):
        m = o
        i = 1
        while(True):
            if(p & m > 0):
                return m,i
            m = m << 1
            i += 1


    l = 0xffff

    ms = 2
    me = None

    cp = fp
    i = 0
    t = ''
    while(True):
        cm,s = find_lsm(cp)

        if cm >= tp:
            break

        e = cp | cm - 1
        m =  l & (l << s -1)
        logging.info('Range %i - %i, mask %08x', cp, e, m )
        i += 1
        t += "tc filter add dev {} parent 1: prio {} protocol ip u32 match ip protocol 17 0xff match ip dport {} 0x{:0>8x} flowid {}\n".format(dev,i,cp,m,flow)
        cp += cm

    print t
    
por 17.01.2017 / 23:47
0

Eu criei este script simples no meu blog para criar as máscaras para qualquer intervalo de porta ...

Eu me cansei de pesquisá-lo apenas para encontrar as formas erradas de fazer isso ... Divirta-se!

link site está em baixo: (

    
por 14.06.2011 / 21:22

Tags