DNS 포워딩

DNS 포워딩 (DNS Forwarding)

Consul 서버로 DNS 포워딩을 활성화하기 위해 서로 다른 DNS 서버를 구성하는 과정을 설명하는 문서예요.

출처: 문서

본문

이 페이지는 Consul 서버로 DNS 포워딩을 활성화하기 위해 서로 다른 DNS 서버를 구성하는 과정을 설명해요.

Consul 에이전트가 실행되는 모든 노드에 이 작업을 적용할 수 있어요. VM과 Kubernetes에서 Consul은 IPv4 및 IPv6 네트워킹 주소를 모두 지원하지만, Consul 데이터센터당 한 가지 주소 유형을 사용할 것을 권장해요.

소개 (Introduction)

Consul 데이터센터를 배포했고 이름 해석을 위해 Consul DNS 인터페이스를 사용하려고 해요.

기본값으로 구성하면 Consul은 포트 8600에서 DNS 인터페이스를 노출해요. 그리고 기본적으로 Consul은 포트 53에서 DNS를 서빙해요. 대부분의 운영체제에서 이는 상승된 권한이 필요해요. 또한 대부분의 운영체제에서 포트 53에서 이미 로컬 DNS 서버가 실행 중인 것이 일반적이에요.

관리자 또는 루트 계정으로 Consul을 실행하는 대신, 다른 DNS 서버에서 또는 포트 리다이렉트를 사용해 권한이 없는 포트에서 실행되는 Consul로 적절한 쿼리를 전달할 수 있어요.

노드의 DNS 포워딩 동작에는 두 가지 구성이 있어요:

  • 조건부 DNS 포워딩 (Conditional DNS forwarding): 로컬 DNS 서버가 .consul 존과 관련된 쿼리만 Consul로 전달하도록 구성돼요. 다른 모든 쿼리는 여전히 노드의 기본 DNS 서버가 처리해요.
  • 전체 DNS 포워딩 (Full DNS forwarding): Consul이 모든 DNS 쿼리를 처리하고 .consul 도메인 밖의 쿼리는 원격 DNS 서버로 전달해요.

조건부 DNS 포워딩 (Conditional DNS forwarding)

조건부 DNS 포워딩 방식을 권장해요. 이 구성은 처리하는 DNS 요청 수를 제한해 Consul 에이전트의 리소스 소비를 줄여줘요.

이 구성에서 Consul은 .consul 도메인과 관련된 쿼리만 처리해요. 다른 도메인의 쿼리를 처리하도록 Consul 서버에 불필요한 부하가 발생하지 않아요.

이 동작은 기본적으로 활성화되지 않아요.

전체 DNS 포워딩 (Full DNS forwarding)

이 방식은 Consul 에이전트의 노드에 제한된 리소스가 할당되어 있고 로컬 DNS 서버를 실행하는 오버헤드를 피하고 싶은 시나리오에서 유용할 수 있어요. 이 구성에서 Consul은 모든 도메인의 모든 DNS 쿼리를 처리하고 .consul 도메인 밖의 쿼리를 하나 이상의 구성된 포워더(forwarder) 서버로 전달해요.

이 동작은 기본적으로 활성화되지 않아요. Consul 표준 구성은 .consul 존 안의 DNS 레코드만 해석해요. DNS 포워딩을 활성화하려면 Consul 구성에 recursors 옵션을 설정해야 해요.

이 시나리오에서 Consul DNS 응답에 .consul 최상위 도메인 밖을 가리키는 CNAME 레코드가 포함되면, DNS 응답은 기본적으로 CNAME 레코드만 포함해요.

recursors가 설정되고 업스트림 리졸버가 올바르게 작동하면 Consul은 CNAME을 해석하려 시도하고 DNS 응답에 그에 대한 레코드(예: A, AAAA, PTR)를 포함해요. 이러한 시나리오에서 Consul은 전체 DNS 포워딩에 사용되며 모든 도메인에 대한 쿼리를 처리할 수 있어요.

워크플로 (Workflow)

Consul 배포에서 DNS 포워딩을 사용하려면 다음 단계를 완료해요:

  1. Consul로의 DNS 포워딩을 활성화하도록 로컬 DNS 서비스를 구성해요. 다음 서비스 중 하나에 대한 지침을 따르세요:
  2. Consul DNS를 쿼리해 DNS 포워딩이 올바르게 작동하는지 확인해요.
$ dig consul.service.consul A

; <<>> DiG 9.16.48-Debian <<>> consul.service.consul A
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51736
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;consul.service.consul.     IN  A

;; ANSWER SECTION:
consul.service.consul.  0   IN  A   10.0.4.140
consul.service.consul.  0   IN  A   10.0.4.121
consul.service.consul.  0   IN  A   10.0.4.9

;; Query time: 4 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Wed Jun 26 20:47:05 UTC 2024
;; MSG SIZE  rcvd: 98
  1. 선택적으로 역방향 DNS를 확인해요.
$ dig 140.4.0.10.in-addr.arpa. PTR

; <<>> DiG 9.16.48-Debian <<>> 140.4.0.10.in-addr.arpa. PTR
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 35085
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;140.4.0.10.in-addr.arpa.   IN  PTR

;; ANSWER SECTION:
140.4.0.10.in-addr.arpa. 0  IN  PTR consul-server-0.node.dc1.consul.

;; Query time: 0 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Wed Jun 26 20:47:57 UTC 2024
;; MSG SIZE  rcvd: 97

전체 출력 대신 노드 이름만 얻으려면 dig에 short 옵션을 사용해요.

$ dig +short -x 10.0.4.140
consul-server-0.node.dc1.consul.

문제 해결 (Troubleshooting)

DNS 서버가 응답하지 않지만 Consul에서 답변은 받는다면 DNS 서버의 쿼리 로그를 켜서 오류를 확인해요.

systemd-resolved

systemd-resolved의 쿼리 로깅을 활성화해요:

# resolvectl log-level debug

쿼리 로그를 확인해요:

# journalctl -r -u systemd-resolved

쿼리 로깅을 비활성화해요:

# resolvectl log-level info

기본 systemd-resolved 구성으로 0.0.0.0에 바인딩하려 하면 DNS 포워딩이 실패할 수 있어요. 기본 구성은 127.0.0.53에서 UDP 및 TCP 요청을 수신하는 DNS 스텁을 사용해요. 결과적으로 127.0.0.53에 바인딩하려는 시도는 실행 중인 스텁과 충돌해요. systemd와 함께 임의의 로컬 리졸버 사용 섹션에 설명된 대로 스텁을 비활성화해 이 문제를 해결할 수 있어요.

Dnsmasq

쿼리 로그를 활성화하려면 Dnsmasq 문서를 참고하세요.

특히 log-queries와 log-facility 구성 옵션을 찾아보세요.

쿼리 로그가 활성화되면 SIGUSR1 신호를 사용해 Dnsmasq가 전체 캐시 덤프를 출력하도록 강제할 수 있어요.

BIND

쿼리 로그를 활성화해요:

$ rndc querylog

로그를 확인해요:

$ tail -f /var/log/messages

로그에 다음과 같은 오류가 표시될 수 있어요:

error (no valid RRSIG) resolving
error (no valid DS) resolving

이 오류는 DNSSEC가 제대로 비활성화되지 않았음을 나타내요.

네트워크 연결에 대한 오류를 받는다면 BIND와 Consul을 실행하는 서버 사이에 방화벽이나 라우팅 문제가 없는지 확인해요.

더 알아보기 (Learn more)