내 iptables에는 다음으로 끝나는 도메인을 차단하는 규칙이 있습니다 .watch
.
sudo iptables -A OUTPUT -j DROP -m string --string ".watch" --algo kmp
하지만 문제는 .
일치할 수 없다는 것입니다. 따라서 위의 줄은 아무것도 일치하지 않습니다. 하지만 점을 제거하면 .watch
제대로 watch
작동합니다.
점 "."을 어떻게 차단할 수 있습니까? iptables 규칙에서?
답변1
구문론적으로 이는 올바른 것처럼 보이지만 귀하의 접근 방식은 이 목적에 적합하지 않습니다. 그만큼문자열 패치패킷의 어느 위치에서든 문자열과 일치합니다.
watch
패킷이 있거나 있는 패킷을 삭제하고 있습니다.watch
. 이는 오탐(false positive)을 유발할 가능성이 높으며 서비스 거부 공격을 위한 새로운 벡터를 도입할 수도 있습니다.- 암호화된 트래픽을 처리할 수 없습니다. 차단할 수 없습니다.웹 트래픽의 대부분.
bm
일치 알고리즘( Boyer–Moore 및 Knuth–Pratt–Morris) 에 대해 상대적으로 좋은 옵션이 있지만kmp
문자열 필터를 사용하면 여전히 계산 집약적일 수 있습니다.
문서에서는 이에 대해 명시적으로 경고합니다.
이 성냥을 주의해서 사용하십시오. 많은 사람들이 DROP 타겟과 함께 웜을 막기 위해 이 매치를 사용하기를 원합니다. 이것은 큰 실수입니다. 어떠한 IDS 회피 방법으로도 패배할 수 있습니다.
비슷한 방식으로 많은 사람들이 POST 문자열이 포함된 HTTP 패킷을 삭제하여 POST 또는 GET과 같은 HTTP의 특정 기능을 중지하는 수단으로 이 일치를 사용해 왔습니다. 이 작업은 필터링 프록시를 통해 더 잘 수행된다는 점을 이해하시기 바랍니다. 또한 POST라는 단어가 포함된 HTML 콘텐츠는 이전 방법을 사용하면 삭제됩니다. 이 매치는 더 나은 분석을 위해 사용자 영역의 흥미로운 패킷을 대기열에 넣을 수 있도록 설계되었습니다. 그게 전부입니다. 이를 기반으로 한 패킷 삭제는 모든 IDS 회피 방법에 의해 패배됩니다.
달성하려는 목표에 대한 더 나은 대안이 있습니다.
- DNS 기반 필터링. 모든 DNS 서버가 이를 수행할 수 있습니다. 예:Dnsmasq일반적인 경량 DNS 전달자입니다.
address=/watch/0.0.0.0
구성에 추가하기만 하면 됩니다. - 웹 프록시 기반 필터링.
답변2
DNS 이름은 길이 접두사가 붙은 레이블로 인코딩됩니다(참조:RFC 1035--hex-string "|05|watch|00|"
자세한 내용은)을 사용 하여 끝나는 이름을 일치 시켜야 합니다 .watch
(길이는 2개의 16진수 숫자로 기록됩니다. 예를 들어 serverfault.com
로 인코딩됩니다 "|0b|serverfault|03|com|00|"
). 이는 -p udp
and --destination-port 53
(또는 주소가 일치하는 경우 5353 ) 와 결합되어야 합니다 .local
. 그렇지 않으면 관련되지 않은 다른 많은 패킷과 일치할 가능성이 높습니다.
DNS 쿼리는 TCP를 통해서도 이루어질 수 있지만 TCP 필터링은 더 복잡하며 암호화된 요청에 대한 기존 설명과 DNS 및/또는 웹 프록시를 통한 애플리케이션 수준 필터링 사용에 대한 제안이 여전히 적용됩니다.