2012-12-31 2 views
11

현재 iptables가 모든 UDP 트래픽을 차단하고 있지만 특정 DNS 쿼리 만 통과하도록 허용하려고합니다.iptables는 특정 도메인 이름에 대해서만 DNS 쿼리를 허용 할 수 있습니까?

예를 들어 google.com을 사용해 보겠습니다.

문자열 일치를 사용하여 요청에서 도메인 이름을 찾고 허용하려고합니다. 이것이 내가 생각해내는 것입니다.

iptables -A OUTPUT -o eth0 -p udp --sport 53 -m string --string "google.com" --algo bm -j ACCEP T

는 또한 --dport 53 대신 --sport을 시도했습니다. 주사위가 없다.

내가 어떻게 잘못했는지 알 수있는 사람이 있으면 도와주세요.

덕분에, · 병

답변

19

을 나는이 조금 늦게 알아,하지만 당신은 DNS 요청 패킷의 내용을 보면 당신은 질문 ...

을 폐쇄하지 않았기 때문에 wireshark 또는 유사점에서 점 문자는 사용되지 않음을 알 수 있습니다. 도메인 이름의 각각의 부분은 계산 문자열이므로 google.com 요청의 실제 바이트됩니다

06 67 6f 6f 67 6c 65 03 63 6f 6d 

첫번째 바이트 (06)를 6 개 ASCII 문자 뒤에 google의 길이가 다음 인 com의 길이에 대한 카운트 바이트 (03) ... 다음에 아이디어가 나온다.

다음과 같은 사용의 iptables이 일치하려면

iptables -A OUTPUT -o eth0 -p udp --port 53 -m string --hex-string "|06|google|03|com" -algo bm -j ACCEPT 

--hex-string 매개 변수는 수직 막대의 쌍으로 구분 된 16 진수 값을 찾고 제공된 문자열을 구문 분석합니다. 수직 막대 바깥의 내용은 모두 ASCII 텍스트로 해석됩니다.

ACCEPT  udp -- anywhere    anywhere    udp dpt:domain STRING match "|06676f6f676c6503636f6d|" ALGO name bm TO 65535 

당신은 조정할 수 있습니다 규칙 약간 - 그것을 속도 - 사용하여 검색 범위를 제한함으로써 : 당신이 항목을 추가 한 후 출력 테이블을 나열하는 경우

당신의 라인을 따라 뭔가를 찾을 수 있습니다 --from--to 매개 변수

+0

굉장한 사람, 당신은 많은 시간을 절약했습니다. 이것을 확인하는 데 시간이 걸렸지 만. –

+0

나는 ipv6 네트워크에서도 똑같이 작동하기를 바랍니다. –

+0

왜 algo 유형이 bm (Boyer-Moore)입니까? –

3

나는 그 점 문자열 신뢰할 수 없습니다 발견했다.

이 작동합니다 :

iptables -A OUTPUT -o eth0 -p udp --port 53 -m string --string google --algo bm -j ACCEPT 
관련 문제