A diretiva de negação de IPv4 do Apache bloqueia endereços IPv6

4

Editar Eu pensei que o número excessivo de linhas "negativas" confundem o apache no bloqueio de endereços IPv4 não listados. Mas o comentário de @Ladadadada me fez identificar o problema exato. Você pode ler minha velha pergunta abaixo. O problema é, a seguinte linha:

deny from 42.1.0.0/19

bloqueia os endereços IPv6

2a01:4f8:120:8201::2
2a01:1e8:e100:ce::2

Como isso é possível?

Eu tenho uma longa lista de endereços IP bloqueados, ativada por uma diretiva Include dentro do bloco Directory .

Esse arquivo contém apenas endereços IPv4, mas meu servidor também está bloqueando um número limitado de endereços IPv6. Não está bloqueando todo o tráfego IPv6. Se eu remover os blocos, esses endereços IPv6 podem acessar o servidor muito bem.

Originalmente, o arquivo de bloco tinha cada bloco de IPs em uma linha "negar de" separada. Eu tentei combinar cada 40 deles para reduzir a contagem de regras e o tamanho do arquivo. Ainda não ajudou. Mas quando trunquei as regras para 4-5 negar linhas, funcionava como esperado e não bloqueava os endereços IPv6.

Estes são os logs de amostra do log de acesso.

2a01:4f8:120:8201::2 - - [03/Mar/2013:15:01:07 +0200] "GET /tdf/ HTTP/1.1" 403 387 "-" "MirrorBrain Probe (see http://mirrorbrain.org/probe_info)"

e do log de erros

[Sun Mar 03 15:01:07 2013] [error] [client 2a01:4f8:120:8201::2] client denied by server configuration: /mirror/pub/tdf/

Como posso listar um grande número de diretivas "negar"? Não consigo controlar o firewall da máquina, por isso está fora de questão.

    
por hayalci 03.03.2013 / 14:05

1 resposta

7

Dirigindo diretamente para os detalhes, vamos converter 42.1.0.0 e 2a01:1e8 em binário (você verá por que eu escolhi apenas a parte inicial em um momento).

0010 1010 . 0000 0001 . 000 |
   42     .     1     . 0   |

0010 1010   0000 0001 : 000 | 0 0001 1110 1000
         2a01         :     |  1e8
                            |
                            ^ cut here

A maneira como a notação do CIDR funciona, é que ela corresponderá aos primeiros /X bits. No seu caso, ele corresponderá ao primeiro 19 , que 2a01:1e8:... também corresponde.

Isso me leva a acreditar que é um bug, já que esse é exatamente o uso demonstrado em sua documentação .

    
por 03.03.2013 / 15:23