Como bloquear endereços IP no HAProxy?

8

Existe algo como o Apache "negar do ip" no haproxy?

Marcin
fonte

Respostas:

21

Você pode descartar um IP no nível tcp criando uma ACL e, em seguida, usando a rejeição de conexão se a ACL corresponder:

    acl bad_ip src 10.10.10.0
    tcp-request connection reject if bad_ip

Você também pode configurar um back-end 403 e enviá-lo para isso, se desejar fazê-lo no nível HTTP:

frontend foo
        ...
        acl bad_ip src 10.10.10.0
        use_backend bad_guy if bad_ip
...

backend bad_guy
        mode http
        errorfile 403 /etc/haproxy/errors/403.http

Essas ACLs podem ser bastante flexíveis e você pode fazer com que várias condições dentro de uma ACL ou várias ACLs dentro da ação sejam atendidas. Mais em http://haproxy.1wt.eu/download/1.5/doc/configuration.txt .

Kyle Brandt
fonte
4
Você só precisa de um back-end separado se quiser usar uma página de erro 403 personalizada. Caso contrário, você pode se safar com "http-request negar se bad_ip"
sh-beta
1
Você sabe como ler os ips de uma loja mais flexível, como db ou arquivo simples separado?
UpTheCreek
1
Esse back-end bad_guy não funciona como esperado, uma vez que não possui servidores definidos, é considerado "inativo" e sempre retornará 503 - serviço não disponível. Eu apenas queria que você pudesse escrever "block if bad_ip" na configuração do front-end e ele lançará a página 403 corretamente. EDIT: http-request negar se bad_ip funcionar como anunciado por @ sh-beta - essencialmente faz a mesma coisa, mas talvez apenas para solicitações HTTP?
Dalibor Filus
Há outra pequena diferença entre a negação de solicitação de bloco e http e é a seguinte: "uma regra de 'bloqueio' colocada após uma regra de 'use_backend' ainda será processada antes."
Dalibor Filus
2
Se você atribuir 403 a um "bandido", ele saberá que está bloqueado e procurará outro vetor. Se você der 503 a um "bandido" ... quando ele achar que causou um DOS com sucesso e interromper o ataque, é claro que ele pode descobrir, mas isso levará muito mais tempo.