Iptables e instruções condicionais. É possível?

4

Eu tentei uma pesquisa, mas não tive sucesso, no caso, sinto muito e vou apreciar o redirecionamento.

Eu tive este problema em mente: um computador com endereço mac M está enviando pacotes através de um roteador openwrt (ou um sistema baseado em linux) e eu gostaria, apenas para testar a possibilidade, deixar passar por um pacote de M , mas o pacote imediatamente depois deve ser descartado, aceito novamente, depois descartado e assim por diante.

Portanto, se o computador com o mac M enviar 20 pacotes, apenas 10 passarão e os outros 10 serão descartados. De forma detalhada, o resultado desejado é: aceitar, descartar, aceitar, descartar, aceitar, descartar, aceitar, descartar etc.

Uma explicação sobre pseudocódigo

condition=ACCEPT
for each packet {
  if ( packet_is_sent_from_adapter_with_mac_M ) {
    if (condition == ACCEPT) {
      accept_packet
      condition=DROP
    }
    else {
      drop_packet
      condition=ACCEPT
    }
  }
}

É possível? Depois de googlar um pouco, parece que o iptables não suporta nenhuma instrução ou script condicional.

E se for possível, o que dizer de uma condição geral "descartar X pacotes consecutivos após Y aceitar consecutivamente"?

addition1 : A questão em geral é "controle de fluxo" não é permitido em iptables? ou melhor, já que decisões condicionais são baseadas em um estado ( condição no pseudocódigo), como podemos salvar o estado relacionado a uma determinada condição no iptables e fazer alguma coisa verificando esse estado?

addition2 : Nos comentários são sugeridas ferramentas adicionais (tc) para obter controle de fluxo (quero dizer, se declarações, loops, etc.), sinta-se à vontade para sugerir combinação (talvez com um pouco de explicação ). Obrigado!

    
por Pierfrancesco PierQR Aiello 26.08.2014 / 14:52

1 resposta

4

Para as suas necessidades, a extensão iptables statistic pode funcionar. Defina o modo como nth , every para 2 e anexe à sua regra DROP . Então talvez algo como

iptables -A INPUT -m statistic --mode nth --every 2 -m mac --mac-source xx:xx:xx:xx:xx -j DROP

deve funcionar.

A página man do iptables-extensions diz sobre o módulo estatístico:

statistic
This module matches packets based on some statistic condition. It supports two distinct modes settable with the --mode option.

Supported options:

--mode mode
    Set the matching mode of the matching rule, supported modes are random and nth. 
[!] --probability p
    Set the probability for a packet to be randomly matched. It only works with the random mode. p must be within 0.0 and 1.0. The supported granularity is in 1/2147483648th increments. 
[!] --every n
    Match one packet every nth packet. It works only with the nth mode (see also the --packet option). 
--packet p
    Set the initial counter value (0 <= p <= n-1, default 0) for the nth mode. 
    
por 26.08.2014 / 15:02

Tags