Eu tenho esta regra no meu iptables para bloquear domínios que terminam com .watch
:
sudo iptables -A OUTPUT -j DROP -m string --string ".watch" --algo kmp
Mas o problema é que .
não pode ser igualado. Portanto, a linha acima não corresponde a nada. Mas se eu remover o ponto, .watch
tudo watch
funcionará bem.
Como posso bloquear os pontos "." nas regras do iptables?
Responder1
Sintaticamente, isso parece correto, mas sua abordagem não é adequada para esse propósito. Opatch de cordacorresponde a uma string em qualquer lugar do pacote:
- Você está descartando qualquer pacote que tenha
watch
ou.watch
em qualquer lugar. É provável que isso cause falsos positivos e até introduza um novo vetor para ataques de negação de serviço. - Ele não consegue lidar com tráfego criptografado. Não é possível bloqueara maior parte do tráfego da web.
- Embora você tenha opções relativamente boas para o algoritmo de correspondência (
bm
Boyer–Moore &kmp
Knuth–Pratt–Morris), o uso do filtro de string ainda pode exigir muita computação.
A documentação também alerta explicitamente contra isso:
Por favor, use esta partida com cautela. Muita gente quer usar essa combinação para parar worms, junto com o alvo DROP. Este é um grande erro. Seria derrotado por qualquer método de evasão de IDS.
De maneira semelhante, muitas pessoas têm usado essa correspondência como um meio de interromper funções específicas em HTTP, como POST ou GET, descartando qualquer pacote HTTP contendo a string POST. Por favor, entenda que este trabalho é melhor executado por um proxy de filtragem. Além disso, qualquer conteúdo HTML com a palavra POST seria eliminado com o método anterior. Esta correspondência foi projetada para ser capaz de enfileirar pacotes interessantes para o usuário para melhor análise, só isso. A eliminação de pacotes com base nisso seria anulada por qualquer método de evasão de IDS.
Existem alternativas melhores para o que você está tentando alcançar:
- Filtragem baseada em DNS. Qualquer servidor DNS pode fazer isso. Por exemplo,Dnsmasqé um encaminhador DNS leve e comum: você pode simplesmente adicionar
address=/watch/0.0.0.0
à sua configuração. - Filtragem baseada em proxy da Web.
Responder2
Os nomes DNS são codificados como rótulos com prefixo de comprimento (consulteRFC 1035para obter detalhes), então você precisa usar --hex-string "|05|watch|00|"
para corresponder nomes que terminam em .watch
(observe que o comprimento é escrito como 2 dígitos hexadecimais, por exemplo, serverfault.com
seria codificado como "|0b|serverfault|03|com|00|"
). Observe que isso deve ser combinado com -p udp
e --destination-port 53
(ou 5353 se corresponder .local
aos endereços), caso contrário, é provável que corresponda a muitos outros pacotes não relacionados.
Consultas de DNS também podem ser feitas por TCP, mas a filtragem de TCP é mais complexa e os comentários existentes sobre solicitações criptografadas e sugestões sobre o uso de filtragem em nível de aplicativo com um DNS e/ou proxy da web ainda se aplicam.