Iptables u32 combinando nat

3

Atualmente, estou configurando o IPtables para redirecionar certas cargas UDP para o meu aplicativo.

Aqui está um exemplo do que tenho trabalhado até agora:

iptables -t nat -I PREROUTING -p udp -d {IPDST} --dport 27055 -m u32 --u32  '0>>22&0x3C@8=0xFFFFFFFF && 0>>22&0x3C@12=0x54536F75 && 0>>22&0x3C@16=0x72636520 && 0>>22&0x3C@20=0x456E6769 && 0>>22&0x3C@24=0x6E652051 && 0>>22&0x3C@28=0x75657279' -j REDIRECT --to-port 21015

Isso está funcionando, ele redirecionará pacotes contendo a carga útil:

FFFFFFFF54536F7572636520456E67696E6520517565727900

de uma porta para minha aplicação em outra.

O problema é que tenho outro dado que desejo redirecionar, mas não é o mesmo o tempo todo. O pacote é assim:

ffffffff55ffffffff

No entanto, o pacote também pode ser assim:

ffffffff55fa0cf40f

Eu tentei algo assim:

iptables -t nat -I PREROUTING -p udp -d {IPDST} --dport 27055 -m u32 --u32  '0>>22&0x3C@8=0xFFFFFFFF && 0>>22&0x3C@12=0x55' -j REDIRECT --to-port 21015

Eu estou supondo que o problema é algo a fazer comigo tentando combinar 2 bytes em vez dos 4 como normal? O acima não causa erro, mas também não redireciona os pacotes.

    
por Xulu 19.06.2016 / 20:08

1 resposta

0

Isso seria a sua conveniência (em uma linha, mas eu tive que mostrar isso para ter um trabalho arrojado):

iptables -t nat -I PREROUTING -p udp -d {IPDST} --dport 27055 -m u32 --u32 '0>>22&0x3C@8=0xFFFFFFFF && 0>>22&0x3C@12 >>24 =0x55' -j REDIRECT --to-port 21015

ou

iptables -t nat -I PREROUTING -p udp -d {IPDST} --dport 27055 -m u32 --u32 '0>>22&0x3C@8=0xFFFFFFFF && 0>>22&0x3C@12 &0xFF000000=0x55000000 ' -j REDIRECT --to-port 21015

Em ambos os casos, você remove da equação a parte que não deseja comparar, seja deslocando 3 bytes para a direita e mantendo apenas a 1ª, ou usando uma máscara que manterá na equação apenas a 1ª. byte. O segundo é mais flexível.

Há um exemplo em man iptables-extensions semelhante à primeira opção:

... 0 >> 22 & 0x3C @ 0 >> 24 = 0"

[...]

This is the first 4 bytes of the ICMP payload, of which byte 0 is the ICMP type. Therefore, we simply shift the value 24 to the right to throw out all but the first byte and compare the result with 0.

Observe também que, como é a tabela nat, se a porta de origem não for alterada, apenas o primeiro pacote UDP será considerado. Depois disso, o conntrack cuidará do fluxo e sua regra não verá os outros pacotes. Portanto, se cada pacote for independente, verifique se a porta de origem é alterada e talvez seja necessário usar a ferramenta nfct juntamente com a regra -j CT --timeout para reduzir a "memória" do conntrack e evitar o preenchimento de suas tabelas.

    
por 28.11.2016 / 00:30