• 기본 Bind DNS는 localhost에서만 query가 가능
  • 외부에서 query를 할 수 있도록 하려면 설정을 변경 필요 → 외부에서의 query하기 위해서는 recursion 대한 이해가 필요
  • DNS는 자신에게 설정 되어 있는 도메인 외의 질의 요청이 오면, 해당 도메인이 설정 되어 있는 name server에게 요청을 보내여, 응답 받은 내용으로 응답
  • name server에 등록이 되어 있지 않은 도메인에 대한 질의가 들어오더라도 찾아서 응답을 해 주는 것으로 caching name server 역할을 함
  • recursion 정책 설정이 완료가 되면, Bind DNS는 기본적으로 정책에 따라 응답 가능

KLDP.org의 name server에 google.com의 A record를 질의 하는 경우

  • KLDP.org의 NS에 google의 A record를 질의

    $ dig @ns.kldp.org google.com
    
    ; <<>> DiG 9.9.4-geoip-1.4-RedHat-9.9.4-38.an3.1 <<>> google.com @ns.kldp.org
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53082
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 5
    
    ;; OPT PSEUDOSECTION:
    ; EDNS: version: 0, flags:; udp: 4096
    ;; QUESTION SECTION:
    ;google.com.                    IN      A
    
    ;; ANSWER SECTION:
    google.com.             300     IN      A       172.217.24.142
    
    ;; AUTHORITY SECTION:
    google.com.             80178   IN      NS      ns2.google.com.
    google.com.             80178   IN      NS      ns1.google.com.
    google.com.             80178   IN      NS      ns4.google.com.
    google.com.             80178   IN      NS      ns3.google.com.
    
    ;; ADDITIONAL SECTION:
    ns2.google.com.         80178   IN      A       216.239.34.10
    ns1.google.com.         80178   IN      A       216.239.32.10
    ns3.google.com.         80178   IN      A       216.239.36.10
    ns4.google.com.         80178   IN      A       216.239.38.10
    
    ;; Query time: 144 msec
    ;; SERVER: 14.0.82.80#53(14.0.82.80)
    ;; WHEN: 토  2월 11 03:30:45 KST 2017
    ;; MSG SIZE  rcvd: 191

recursion은 caching name server 역할을 제한 하는 기능

  • recursion 옵션이 no로 설정이 되어 있다면 설정이 되어 있는 도메인 외의 요청에 대해서는 권한이 없다는 응답함

  • 설정이 되어 있는 도메인에 대해서만 응답만함

    $ dig google.com @ns.kldp.org
    
    ; <<>> DiG 9.10.3-P4-Ubuntu <<>> google.com @ns.kldp.org
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: REFUSED, id: 38503
    ;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
    ;; WARNING: recursion requested but not available
    
    ;; OPT PSEUDOSECTION:
    ; EDNS: version: 0, flags:; udp: 4096
    ;; QUESTION SECTION:
    ;google.com.                    IN      A
    
    ;; Query time: 7 msec
    ;; SERVER: 14.0.82.80#53(14.0.82.80)
    ;; WHEN: Sat Feb 11 03:29:33 KST 2017
    ;; MSG SIZE  rcvd: 39
  • recursion 기능이 public하게 설정이 되어 있을 경우, DNS cache poisoning 공격을 발생시킬 수 있음 → 근래의 DNS 설정시에는 recursion 기능을 off 시키는 것을 권장

  • 무조건 recursion을 off 시킬 수 없는 환경에 있는 경우를 대비하여, recursion 설정 정책에 학습 필요

recursion 설정 정책

1. 내 도메인 설정을 위한 DNS와 내부에서 사용할 caching name server가 따로 존재할 경우

  • 외부에서의 query를 허가하고, recursion을 off 를 시킴
  • /etc/named.conf의 options block에서 아래의 설정을 변경 또는 추가 필요
    options {
      ...
      recursion no;
      allow-query { any; };
      ...
    };

2. caching name server가 따로 존재하지 않을 경우

  • 외부에서의 query를 허가하고, recursion을 할 수 있는 대역을 allow-recursion 옵션을 이용하여 설정

  • allow-recursion에 사용할 RecursionAllow ACL group을 /etc/named.acl.conf에 생성

    acl LocalAllow {
      127.0.0.1;
      localhost;
    };
    
    acl RecursionAllow {
      192.168.0.0/16;
      111.112.113.128/25;
    };
  • named.conf의 options block에서 다음의 설정을 변경 또는 추가
    options {
      ...
      recursion yes;
      allow-query { any; };
      allow-recursion { LocalAllow; RecursionAllow; };
      ...
    };

3. 내부 전용 caching name server로 사용할 경우

  • 내부에서의 query만 허가하고, recursion을 public 하게 설정
  • 먼저 /etc/named.acl.conf의 LocalAllow acl group에 query를 할 내부 대역을 추가
    acl LocalAllow {
      127.0.0.1;
      localhost;
      192.168.0.0/16;
    };
  • named.conf의 options block에서 다음의 설정을 변경 또는 추가
    options {
      ...
      recursion yes;
      allow-query { LocalAllow; };
      ...
    };

4. public caching name server로 사용할 경우

  • 외부에서의 query와 recursion을 모두 허가
  • 이DNS 공격을 위하여 RPZ(Response Policy Zone)과 같이 공격을 방어하기 위한 기법들이 필요
  • named.conf의 options block에서 다음의 설정을 변경 또는 추가
    options {
      ...
      recursion yes;
      allow-query { any; };
      ...
    };

참고 자료

'GTM과 DNS' 카테고리의 다른 글

HTTPS 암호화된 DNS 기능 지원 → TYPE65  (0) 2023.09.16
cloudflare DNS와 google DNS의 cache flush  (0) 2023.09.16
Extension DNS(EDNS0)란  (0) 2023.09.16
DNS의 TTL(Time To Live)  (0) 2023.09.16
DNS 응답 코드와 의미  (0) 2023.09.16

+ Recent posts