본문 바로가기
서버구축 (WEB,DB)

CoreDNS 플러그인을 활용한 DNS 서비스 확장 및 최적화

by 날으는물고기 2024. 12. 3.

CoreDNS 플러그인을 활용한 DNS 서비스 확장 및 최적화

CoreDNS rewrite 플러그인 사용

rewrite 플러그인은 CoreDNS에서 DNS 요청 및 응답을 재작성하는 강력한 도구입니다. 이를 사용하면 특정 도메인 이름, 레코드 타입, 클래스 등을 변경하여 원하는 방식으로 DNS 쿼리를 처리할 수 있습니다.

1. 기본 개념

rewrite 플러그인은 DNS 요청의 특정 필드를 재작성하거나, 요청에 따라 응답을 변경하는 데 사용됩니다. 재작성은 클라이언트에게 투명하게 적용되며, 클라이언트는 변경된 결과만을 확인합니다. 이 플러그인은 매우 다양한 방식으로 쿼리를 재작성할 수 있으며, 간단한 이름 변경부터 정규 표현식(regex)을 활용한 복잡한 재작성까지 지원합니다.

2. rewrite 플러그인의 구문

기본 구문

rewrite [continue|stop] FIELD [TYPE] [(FROM TO)|TTL] [OPTIONS]
  • FIELD: 재작성할 DNS 메시지의 필드 (name, type, class, cname 등)
  • TYPE: 선택 사항이며, name이나 ttl 필드를 사용할 때 명시합니다. (exact, regex, prefix, suffix 등)
  • FROM TO: FROM은 재작성할 문자열이고, TO는 새로 변경될 값입니다.
  • TTL: TTL 값을 재작성할 때 사용합니다.
  • OPTIONS: 재작성 시 추가적인 옵션을 지정할 수 있습니다.

주요 필드 설명

  • name: 쿼리 이름을 재작성합니다. 예: rewrite name exact old.com new.com
  • type: 쿼리의 레코드 타입을 재작성합니다. 예: rewrite type ANY HINFO
  • class: DNS 클래스(IN, CH, HS)를 재작성합니다. 예: rewrite class CH IN
  • cname: 응답의 CNAME을 재작성합니다.
  • ttl: 응답의 TTL 값을 재작성합니다.

3. rewrite 플러그인 활용 예시

3.1 이름 재작성 (Name Rewriting)

이름을 재작성하는 방식으로, DNS 쿼리의 특정 도메인을 다른 도메인으로 변경할 수 있습니다. 여기서 suffix, prefix, exact, regex 같은 옵션을 사용하여 다양한 매칭 방식을 구현할 수 있습니다.

 

예시 1: 특정 도메인 접미사 재작성 (Suffix Rewrite)

rewrite name suffix .example.com .google.com
  • 동작: www.example.com 같은 요청을 www.google.com으로 변경합니다.

 

예시 2: 정규 표현식 (Regex) 사용

rewrite name regex (.*)-(us-west-1)\.example\.com {1}.service.{2}.consul
  • 동작: ftp-us-west-1.example.com 요청을 ftp.service.us-west-1.consul로 변경합니다.

 

3.2 레코드 타입 재작성 (Type Rewriting)

레코드 타입을 재작성하여 특정 쿼리를 다른 레코드 타입으로 변환할 수 있습니다. 예를 들어 ANY 쿼리를 HINFO로 변경하여 보안을 강화할 수 있습니다.

 

예시 3: ANY 쿼리를 HINFO로 변경

rewrite type ANY HINFO
  • 동작: 클라이언트가 ANY 타입 쿼리를 보낼 때 HINFO 타입으로 변환합니다.

 

3.3 TTL 재작성 (TTL Rewriting)

응답의 TTL 값을 재작성하여 DNS 캐싱을 제어할 수 있습니다. TTL 값이 너무 짧을 때 캐싱 성능을 개선하기 위해 TTL 값을 조정하거나, 특정 상황에서 캐싱을 제한할 수 있습니다.

 

예시 4: TTL 값 재작성

rewrite ttl exact example.com 30-300
  • 동작: example.com에 대한 TTL 값이 30초에서 300초 사이로 설정됩니다. 30초 미만이면 30초로, 300초 이상이면 300초로 설정됩니다.

 

3.4 CNAME 응답 재작성 (CNAME Rewriting)

CNAME 레코드를 반환할 때, 특정 CNAME 레코드의 값을 변경할 수 있습니다. 이를 통해 응답의 CNAME을 다른 도메인으로 재작성하여 클라이언트가 새로운 위치로 연결되도록 할 수 있습니다.

 

예시 5: CNAME 응답 재작성

rewrite cname regex (.*)\.cdn.example.net {1}.other.cdn.com
  • 동작: my-app.cdn.example.net 요청에 대한 응답에서 my-app.other.cdn.com으로 CNAME이 변경됩니다.

4. 재작성 후 응답 변경 (Response Rewrites)

DNS 요청을 재작성한 후, 응답에서도 재작성된 이름을 적용해야 할 경우가 있습니다. 일부 클라이언트는 요청한 이름과 응답받은 이름이 다를 때 이를 MITM(Man-in-the-middle) 공격으로 간주할 수 있기 때문에, 요청과 응답을 일관되게 재작성해야 할 수 있습니다.

 

예시 6: 요청 및 응답 재작성

rewrite stop {
    name regex (.*)-(us-west-1)\.example\.com {1}.service.{2}.consul
    answer name (.*)\.service\.(us-west-1)\.consul {1}-{2}.example.com
}
  • 동작: 요청된 이름을 service로 변경한 후 응답에서는 원래의 이름으로 다시 변환합니다. 예를 들어, 요청은 ftp-us-west-1.example.com이었으나 응답은 동일하게 유지됩니다.

5. 다양한 옵션을 통한 재작성

5.1 continue와 stop 옵션

  • continue: 현재 규칙을 적용한 후, 다음 규칙도 계속 적용합니다.
  • stop: 현재 규칙이 적용되면 이후 규칙을 무시하고 멈춥니다. 기본값은 stop입니다.

 

예시 7: 여러 규칙 적용

rewrite continue {
    name suffix .example.com .google.com
}
rewrite stop {
    name suffix .google.com .bing.com
}
  • 동작: .example.com을 먼저 .google.com으로 재작성한 후, .google.com.bing.com으로 재작성합니다.

6. 활용 팁

6.1 서브도메인 처리

도메인 내 서브도메인을 재작성하고 싶을 때는 suffix 또는 regex를 사용하여 유연하게 처리할 수 있습니다. 예를 들어, www.example.com 같은 서브도메인도 함께 처리하려면 suffix .example.com처럼 설정합니다.

 

6.2 복잡한 요청 처리

정규 표현식(regex)을 사용하면 복잡한 쿼리 재작성도 가능합니다. 그룹 캡처를 통해 쿼리의 특정 부분만 변경할 수도 있습니다. 이를 통해 도메인 이름의 일부만 수정하거나 특정 패턴에 맞는 도메인만 재작성할 수 있습니다.

7. 한계와 주의 사항

  • 동적 변수 처리 불가: CoreDNS의 기본 플러그인은 시간, 날짜와 같은 동적 변수를 직접 처리할 수 없습니다. 환경 변수나 스크립트를 사용하여 Corefile을 변경하는 방식으로 이를 우회할 수 있습니다.
  • 블록 내 도메인 그룹: example.com {}과 같이 특정 도메인에 대한 블록을 사용할 때, 해당 도메인에 대한 재작성 규칙은 그 도메인에만 적용됩니다. 이를 넘어 서브도메인까지 적용하려면 전역(.:53) 블록에서 설정하는 것이 좋습니다.

 

CoreDNS의 rewrite 플러그인은 다양한 DNS 요청 및 응답을 재작성할 수 있는 강력한 도구입니다. 이를 통해 이름, 타입, TTL 등을 변경할 수 있으며, 특히 정규 표현식을 사용하면 복잡한 규칙도 쉽게 구현할 수 있습니다.

 

CoreDNS를 활용한 다양한 DNS 설정 및 예시들을 통해 CoreDNS의 다양한 기능과 설정 방법을 이해하고 다양한 환경에 맞게 구성할 수 있습니다.

1. 기본 CoreDNS 서버 시작

기본적으로 CoreDNS는 설정 파일이 없을 경우에도 whoami 플러그인과 log 플러그인을 자동으로 로드하고, 포트 53에서 DNS 요청을 처리합니다.

.:53 {
    whoami
    log
}

이 구성에서 CoreDNS는 포트 53에서 요청을 받아 whoami 플러그인을 통해 요청을 보낸 클라이언트의 IP, 포트, 프로토콜 등의 정보를 반환합니다. dig 명령어로 테스트할 수 있습니다.

dig @127.0.0.1 -p 53 www.example.com

이 명령어는 127.0.0.1의 포트 53에 DNS 요청을 보내고, 결과는 표준 출력에 로그로 남습니다.

2. 포트 변경

간혹 포트 53이 다른 프로세스에 의해 사용 중일 경우, CoreDNS를 다른 포트에서 실행할 수 있습니다. 예를 들어, 포트 1053에서 실행하려면 다음과 같이 Corefile을 수정합니다.

.:1053 {
    whoami
    log
}

또는 실행 시 명령어로 직접 포트를 지정할 수도 있습니다.

coredns -dns.port 1053

이렇게 하면 CoreDNS는 포트 1053에서 DNS 요청을 처리합니다.

3. 외부 DNS 서버로 포워딩

DNS 요청을 외부 DNS 서버로 포워딩하는 기능도 매우 유용합니다. 예를 들어, 모든 DNS 요청을 구글의 공용 DNS 서버(8.8.8.8)로 포워딩하려면 다음과 같이 설정합니다.

.:53 {
    forward . 8.8.8.8:53
    log
    errors
}

이 구성에서는 모든 요청이 8.8.8.8로 전달되며, 결과는 CoreDNS 서버를 통해 클라이언트에 반환됩니다. 또한 로그가 표준 출력에 기록됩니다.

4. DNSSEC 설정

DNS 보안을 위해 DNSSEC(NSEC)을 지원할 수도 있습니다. 예를 들어, example.org 도메인에 대해 DNSSEC을 활성화하고, 특정 IP(2001:500:8f::53)에 대해 zone transfer를 허용하는 설정은 다음과 같습니다.

example.org:1053 {
    file /var/lib/coredns/example.org.signed
    transfer {
        to * 2001:500:8f::53
    }
    errors
    log
}

이 구성에서는 DNSSEC이 적용된 example.org 도메인을 제공하며, 모든 IP에 대해 zone transfer가 가능하지만, 2001:500:8f::53 IP는 별도로 명시하여 notify를 전송할 수 있습니다.

5. ANY 요청 변환 및 포워딩

특정 도메인은 내부적으로 처리하고, 나머지 도메인은 외부 DNS 서버로 포워딩하는 것도 가능합니다. ANY 타입의 요청은 HINFO로 변환하여 처리하는 예시는 다음과 같습니다.

example.org:1053 {
    file /var/lib/coredns/example.org.signed
    transfer {
        to * 2001:500:8f::53
    }
    errors
    log
}

. {
    any
    forward . 8.8.8.8:53
    errors
    log
}

이 설정에서는 example.org 도메인에 대해 자체 처리하며, 그 외의 모든 요청은 구글 DNS로 포워딩됩니다.

6. IP 주소를 역방향 DNS로 변환

CoreDNS는 IP 주소를 역방향 DNS(reverse DNS)로 자동 변환하여 처리할 수 있습니다. 예를 들어, 10.0.0.0/24 네트워크를 처리하려면 다음과 같이 설정합니다.

10.0.0.0/24 {
    whoami
}

이 구성을 통해 0.0.10.in-addr.arpa 영역에 대한 권한을 가집니다. 이를 통해 해당 네트워크에 속한 IP 주소에 대한 역방향 DNS 조회가 가능합니다.

7. DNS over TLS(DoT), gRPC, QUIC, DoH 설정

DNS over TLS(DoT), gRPC, QUIC, DoH 등의 최신 프로토콜을 사용하여 DNS 서버를 구성할 수도 있습니다. 각각의 설정은 다음과 같습니다.

 

DNS over TLS(DoT)

tls://example.org {
    whoami
}

gRPC

grpc://example.org {
    whoami
}

QUIC

quic://example.org {
    whoami
    tls mycert mykey
}

DNS over HTTP/2(DoH)

https://example.org {
    whoami
    tls mycert mykey
}

DoH는 HTTPS 기반으로 DNS 요청을 처리하며, tls 옵션으로 TLS 인증서를 설정할 수 있습니다.

8. 환경 변수 사용 및 파일 임포트

Corefile에서 환경 변수를 사용할 수 있으며, 임포트 지시어를 사용하여 외부 설정 파일을 가져올 수 있습니다.

 

환경 변수 사용

.:53 {
    {$ENV_VAR}
}

파일 임포트

.:53 {
    import example1.txt
}
import example2.txt

위의 예시는 Corefile에서 다른 설정 파일을 불러와 사용할 수 있는 방법을 보여줍니다. 이와 같이 CoreDNS는 매우 유연한 설정을 제공하며, 다양한 플러그인을 통해 환경에 맞는 DNS 서비스를 구성할 수 있습니다.

728x90

댓글