iptables excede a cota quando uma nova regra é adicionada

3

Eu tenho o iptables trabalhando no Centos 7, usando a versão v1.4.21, mas também testado no v1.6.0 (lembre-se de que eu não reconstruí o kernel, já que ele diz que não preciso mais das extensões).

Eu configurei uma cota e ela é usada:

# iptables -nvx -L 192.168.2.5
Chain 192.168.2.5 (2 references)
    pkts      bytes target     prot opt in     out     source               destination
    3639  3999378 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            quota: 4000000 bytes
     142   175468 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0
#

Então, à medida que adiciono qualquer outra regra a essa cadeia, a regra existente "redefine" o uso de bytes e usa a cota novamente:

# iptables -I 192.168.2.5 -m quota --quota 1000 -j ACCEPT
# iptables -nvx -L 192.168.2.5
Chain 192.168.2.5 (2 references)
    pkts      bytes target     prot opt in     out     source               destination
       2      168 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            quota: 1000 bytes
    7239  7998334 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            quota: 4000000 bytes
     890   387931 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0

Mesmo quando não excedido, esse comportamento sempre adiciona o valor da cota à regra, embora eu esteja afetando uma regra diferente:

# iptables -nvx -L 192.168.2.5
Chain 192.168.2.5 (2 references)
    pkts      bytes target     prot opt in     out     source               destination
     379    67755 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            quota: 4000000 bytes
       0        0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0
# iptables -I 192.168.2.5 -m quota --quota 1000 -j ACCEPT
# iptables -nvx -L 192.168.2.5
Chain 192.168.2.5 (2 references)
    pkts      bytes target     prot opt in     out     source               destination
       2      168 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            quota: 1000 bytes
     379    67755 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            quota: 4000000 bytes
       0        0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0
# iptables -nvx -L 192.168.2.5
Chain 192.168.2.5 (2 references)
    pkts      bytes target     prot opt in     out     source               destination
      11      924 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            quota: 1000 bytes
    4159  4066453 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            quota: 4000000 bytes
     315   190056 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0

Isso parece ser um bug, e talvez relacionado a este .

Alguma ideia? Minha única solução é capturar os bytes e adicioná-los à cota da nova regra. Isso funciona bem quando já é excedido, mas se não, eu poderia perder bytes devido à lacuna entre ler, calcular, excluir e adicionar.

    
por ericosg 31.08.2016 / 20:23

1 resposta

2

Lendo a outra pergunta que você vinculou e testou, só posso concluir que o módulo de cotas não é muito útil: redefine sempre que algo muda.

É certamente por isso que existe um outro módulo chamado quota2! Não faz parte do iptables, mas de xtables-addons. No Debian está disponível e compilado na instalação com o xtables-addons-dkms. Eu acho que você terá que compilá-lo no CentOS7.

Três trechos da página man (podem ser encontrados aqui: xtables-addons.8 )

The value of the counter can be read and reset through procfs, thereby making this match a minimalist accounting tool.

.

--name name
Assign the counter a specific name. This option must be present,

A cota aparece em / proc / net / xt_quota / nome e é leitura / gravação

--quota iq
Specify the initial quota for this counter. If the counter already exists, it is not reset.

Isso significa que alguma lógica fora do iptables deve ser usada (por exemplo, salvar as cotas restantes e restaurar no boot se você tivesse que reinicializar o servidor), mas isso certamente resolveria seus problemas.

    
por 11.09.2016 / 16:35