![tshark에서 dns.qry.name으로 DNS 쿼리를 필터링하는 방법은 무엇입니까?](https://linux55.com/image/118244/tshark%EC%97%90%EC%84%9C%20dns.qry.name%EC%9C%BC%EB%A1%9C%20DNS%20%EC%BF%BC%EB%A6%AC%EB%A5%BC%20%ED%95%84%ED%84%B0%EB%A7%81%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
그러면 DNS 쿼리에 대한 호스트 이름이 인쇄됩니다.
tshark -n -T fields -e dns.qry.name src port 53
dns.qry.name
값으로 필터링 하거나 합리적인 프록시를 얻으려면 어떻게 해야 합니까 ? 다양한 변형을 시도했지만 tshark -n -T fields -e dns.qry.name src port 53 and dns query name contains '"foo"'
모두 작동하지 않습니다.
답변1
를 사용하면 더 쉽습니다.표시(wireshark) 필터비교캡처(pcap) 필터.
tshark -n -T fields -e dns.qry.name -f 'src port 53' -Y 'dns.qry.name contains "foo"'
pcap-filter
캡처 필터의 기능에 대해서는 매뉴얼 페이지를 참조하십시오. 이는 매우 제한적이며 프로토콜을 수동으로 분석해야 합니다. 여기서는 대략적으로 udp 패킷의 쿼리 이름이 항상 0x20바이트(DNS over UDP의 경우)이고 쿼리 이름이 253바이트보다 커서는 안 된다고 가정합니다.
$ printf foo | xxd -p
666f6f
$ tshark -n -T fields -e dns.qry.name -f "src port 53 and $(awk '
BEGIN{
for(i=0;i<250;i++) {
printf sep "(udp[%d]!=0&&((udp[%d:4]&0xffffff00)==0x666f6f00", i+20, i+20
c = c "))"; sep = "||"
}
print c
}')"