Regra Iptables para bloquear todas as solicitações da web para domain.com

2

Sei que esta não é a melhor solução e não é um servidor de produção, no entanto, ainda estou tentando descartar solicitações para um domínio se ele não corresponder à sequência de domínio.

Até agora, funciona se eu aplicar a regra por si só, mas não funcionará em conjunto com as outras regras. Eu estou supondo que o Iptables seja sensível ao pedido.

   iptables -P INPUT DROP
   iptables -P OUTPUT DROP
   iptables -P FORWARD DROP

   # Allow unlimited traffic on loopback
   iptables -A INPUT -i lo -j ACCEPT
   iptables -A OUTPUT -o lo -j ACCEPT

   # Allow full outgoing connection but no incomming stuff
   iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
   iptables -A OUTPUT -o eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

   # Block sites
   iptables -I INPUT -p tcp --dport 80 -j ACCEPT 
   iptables -I INPUT 1 -p tcp --dport 80 -m string --string ! "sub.domain.com" --algo kmp -j DROP

   iptables -A INPUT -i eth0 -j DROP
   iptables -A OUTPUT -j DROP
    
por Blake S. 14.06.2012 / 02:50

3 respostas

1

O Iptables é definitivamente sensível à ordenação de regras. O primeiro jogo decide o destino do pacote.

O que pode estar acontecendo é que você tem uma regra correspondente e aceita pacotes ESTABLISHED antes da regra DROP da string. É muito comum que a regra ESTABLISHED seja uma das primeiras regras em uma configuração do iptables.

Uma conexão ganha o estado ESTABLISHED logo após o primeiro pacote SYN, se não me engano. E o pacote SYN não contém o host-header-name com "sub.domain.com". Somente o pacote com a solicitação GET conterá isso e já corresponderá à regra ESTABLISHED.

A solução seria colocar a cadeia DROP antes da ESTABLISHED.

Tendo dito isto, sua solução é bastante incomum, e pode até colocar o servidor em algum problema, se por acaso o volume dessas requisições bloqueadas for alto. A conexão é estabelecida, mas o cliente se acalma. O servidor estará esperando, até que algum timeout termine a coisa. Eu não sei exatamente o que vai acontecer, mas cuidado.

Eu supus que você por algum motivo não pode alterar a configuração do servidor para bloquear essas conexões específicas lá. No apache é um pedaço de bolo definindo esse tipo de controle.

    
por 05.10.2012 / 05:43
0

Isso não fará o que você quer. Você pode efetivamente limitar o acesso a um host com o iptables. No seu caso, limite o acesso ao endereço IP do servidor que hospeda o site. Isso ainda permitirá o acesso a outros domínios hospedados por esse servidor.

Você pode usar um proxy como squid no modo de proxy transparente e usar uma ACL para limitar o acesso ao site permitido. Use uma regra DNAT para redirecionar todos os acessos HTTP ao seu proxy. Uma regra como essa deve redirecionar o tráfego da web para o proxy na porta 3129:

iptables -t nat -A PREROUTING -p tcp --dport 80 ! -d 127.0.0.1 -j DNAT --to-destination $SQUID:3129
    
por 14.06.2012 / 05:42
0

Use o squid para limitar todo o domínio desejado no protocolo http, fácil de configurar

e para protocolos https use: iptables -A FORWARD -m string --string "facebook.com" --algo bm --from 1 --to 600 -j REJECT

    
por 14.11.2014 / 11:18