앞서 다룬 Fast-Flux 도메인을 탐지하기 위해서는 여러가지 방법이 있지만, 네임서버에서 DNS 쿼리 로그를 수집하여 분석하는 것이 가장 간단한 방법 중 하나일 것입니다. 

가장 대중적으로 사용하는 네임서버인 BIND의 경우, 기본적으로 DNS 쿼리를 로그로 남기지 않습니다. 그렇기 때문에 별도의 설정을 해야합니다. 일단 간단하게 쿼리를 로그로 남기게 설정해둔 named.conf 파일을 살펴보겠습니다.

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
        channel default_dnshit {
                file "data/dnshit.log";
                print-time yes;
        };
        category queries {
                default_dnshit;
        };
};

어떤 것인지 대충 감이 오나요? 

서버에 쿼리(category queries)가 오면, default_dnshit; 설정에 따라 로그를 남기라고 하는 것입니다.

channel default_dnshit은 dnshit.log라는 파일에 로그를 남기고(file "data/dnshit.log";), 시간을 남기도록(print-time yes;) 설정되어 있습니다.

이 설정에 따라 dnshit.log 에 남겨진 로그를 살펴보면 다음과 같습니다.

[root@******* data]# tail -f dnshit.log
19-Jan-2012 17:00:27.772 client 121.167.11.1#25401: query: nchovy.kr IN A -E
19-Jan-2012 17:00:36.320 client 121.138.224.7#15593: query: nchovy.kr IN A -E
19-Jan-2012 17:00:38.275 client 210.94.11.122#13063: query: xeraph.com IN A -E
19-Jan-2012 17:00:48.782 client 210.94.11.106#15154: query: ns2.nchovy.com IN A -E
19-Jan-2012 17:00:48.782 client 210.94.11.106#50051: query: ns3.nchovy.com IN A -E
19-Jan-2012 17:01:08.538 client 207.46.200.37#49745: query: ns1.nchovy.com IN A -

이런식으로 파일에 쿼리 로그를 남긴 후, 파싱하여 분석할 수 있습니다. 그러나 이렇게 한다면 매번 로그를 보기 위해 DNS 서버에 접속해서 별도의 파일을 살펴봐야 합니다.

그러나 bind 의 설정과 syslog 의 설정을 이용해 syslog로 남기거나, 외부의 syslog 서버로 보낼 수도 있습니다.

named.conf 에 아래와 같이 설정을 추가하였습니다. 굵게 표시된 부분이 추가된 부분입니다.

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
        channel default_dnshit {
                file "data/dnshit.log";
                print-time yes;
        };
        channel syslog {
                syslog local7;
        };

        category queries {
                default_dnshit;
                syslog;
        };
};

syslog에 로그 분류(facility) local7 으로 보내도록 설정이 추가되었습니다. 기본적으로 syslog 설정에는 local7 설정이 없기 때문에 아래에 나와있는 설정을 syslog.conf 에 추가합니다. syslog에서 시간을 기록하기 때문에 시간을 기록하는 옵션("print-time yes;")은 설정하지 않습니다.

local7.*                        /var/log/local7

이렇게 설정을 추가한 뒤 named 와 syslog를 재시작하고, /var/log/local7 파일을 보면 아래와 같이 로그가 기록됩니다.

[root@******* log]# tail -f local7
Jan 19 16:58:29 ******* named[12230]: client 202.188.1.27#36711: query: krakenapps.org IN A -
Jan 19 16:58:33 ******* named[12230]: client 208.78.69.150#58826: query: ns2.nchovy.com IN A -E
Jan 19 16:58:33 ******* named[12230]: client 208.78.69.150#18435: query: krakenapps.org IN A -E
Jan 19 16:58:33 ******* named[12230]: client 208.78.69.150#13351: query: ns3.nchovy.com IN A -E
Jan 19 16:58:37 ******* named[12230]: client 193.254.230.2#59556: query: ns2.nchovy.com IN A -E
Jan 19 16:58:37 ******* named[12230]: client 193.254.230.2#24909: query: ns4.nchovy.com IN A -E
Jan 19 16:58:37 ******* named[12230]: client 193.254.230.2#18610: query: ns3.nchovy.com IN A -E
Jan 19 16:58:37 ******* named[12230]: client 193.254.230.2#3692: query: ns1.nchovy.com IN A -E

이 로그를 원격으로 보내기 위해선 아래처럼 syslog.conf 를 수정하면 됩니다.

local7.*                        @100.100.100.100

그리고 해당 syslog 서버가 로그를 받도록 설정합니다.

레퍼런스