설정
다음 컨테이너 파일을 통해 자체 IP를 얻는 컨테이너화된 이름 지정 서비스가 있습니다.
FROM alpine:latest
RUN apk --no-cache add bind bind-tools bind-dnssec-tools bind-dnssec-root
COPY --chmod=500 --chown=root:root init.sh /usr/sbin/init
COPY --chmod=444 --chown=root:root bindetc/named.conf /etc/bind/named.conf
RUN chmod 770 /var/bind
RUN chown root:named /var/bind
COPY --chmod=440 --chown=root:named bindetc/direct.db /var/bind/direct.db
COPY --chmod=440 --chown=root:named bindetc/reverse.db /var/bind/reverse.db
VOLUME "/var/bind"
EXPOSE 53/tcp 53/udp
CMD /usr/sbin/named -f -g -u named
다음과 같이 구성된 신뢰할 수 있는 서버와 재귀 서버가 혼합되어 있습니다.
bindetec/named.conf
acl LAN {
192.168.0.0/24;
}
options {
directory "/var/bind";
allow-recursion {
192.168.0.0/24;
127.0.0.1/32; // localhost
};
forwarders {
1.1.1.1; // Cloudflare
208.67.222.222; // OpenDNS
};
listen-on { 192.168.0.136; 127.0.0.1; };
listen-on-v6 { none; };
allow-transfer port 53 { 192.168.0.136; 0.0.0.0; };
allow-query { localhost; LAN; };
recursion yes;
pid-file "/var/run/named/named.pid";
dump-file "/var/bind/data/cache_dump.db";
statistics-file "/var/bind/data/named_stats.txt";
memstatistics-file "/var/bind/data/named_mem_stats.txt";
};
zone "." IN {
type master;
file "/var/bind/direct.db";
allow-update { none; };
};
zone "in-addr.arpa" IN {
type master;
file "/var/bind/reverse.db";
allow-update { none; };
};
다음과 같은 내용이 있습니다 bindetc/direct.db
.
$TTL 3600
$ORIGIN intranet.domain.
@ IN SOA ns1.intranet.domain. postmaster.intranet.domain. (909090 9000 900 604800 1800)
@ IN NS ns1.intranet.domain.
ns1 IN A 192.168.0.136
그리고 다음 bindetc/reverse.db
:
$TTL 604800
@ IN SOA ns1.intranet.domain. postmaster.intranet.domain. (909090 9000 900 604800 1800)
@ IN NS ns1.intranet.domain.
136.0.168.192 IN PTR ns1.intranet.domain.
컨테이너의 IP는 입니다 192.168.0.136
.
질문
예를 들어, 공개 DNS 레코드를 확인하려고 하면 google.com
Cloudflare 또는 OpenDNS에 해당 DNS 레코드의 IP가 무엇인지 묻는 대신 아래와 같이 기본적으로 빈 응답이 제공됩니다.
; <<>> DiG 9.16.44 <<>> google.com @192.168.0.136
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 27326
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: 1f5514b62f24a19b0100000065ed3501a3ae047abe73afef (good)
;; QUESTION SECTION:
;google.com. IN A
;; Query time: 48 msec
;; SERVER: 192.168.0.136#53(192.168.0.136)
;; WHEN: Sat Mar 09 22:20:17 CST 2024
;; MSG SIZE rcvd: 67
답변1
이 dig
명령은 BIND가 SERVFAIL
오류 코드로 응답하고 있으므로 구성에 치명적인 오류가 있다고 생각할 수 있음을 나타냅니다. BIND에 의해 생성된 로그 메시지를 실제로 살펴봐야 합니다.
영역 선언에서는 zone "." IN
BIND가 type master
DNS 루트 영역용임을 지정하므로 기본적으로 BIND에 기존의 모든 최상위 도메인에 대해 이미 알고 있음을 알리는 것입니다. 그렇다면 최상위 도메인 이름인 ".com"이 존재하지 않는다는 것을 이미 알고 있는데 왜 다른 사람에게 "google.com"을 요청합니까?
실제로 별도의 DNS 세계를 요구하거나 실제로 루트 이름 서버를 유지 관리하는 경우가 아니라면 이름 서버 master
를 zone "."
.
루트 영역에 대한 보다 일반적인 선언은 다음과 같습니다.
// prime the server with knowledge of the root servers
zone "." {
type hint;
file "/usr/share/dns/root.hints";
};
/usr/share/dns/root.hints
루트 DNS 서버의 표준 목록은 어디에 있습니까?https://www.internic.net/domain/named.cache. 시작 시 BIND는 이 목록을 사용하여 루트 이름 서버 중 하나에 연결하여 동일한 목록의 최신 버전을 얻습니다.
전달자를 사용할 계획이므로 완전히 생략할 수도 있습니다. 전달자를 지정하지 않으면 BIND는 내장된 루트 DNS 서버 목록을 사용합니다. of는 내장 목록이 더 이상 사용되지 않을 때 교체하는 방법일 뿐입니다 zone "."
.type hint
BIND는 권한이 없는 영역에 대해 전달자에게 쿼리를 보내야 하므로 BIND에 루트 이름 서버의 최신 목록이 있는지 신경 쓸 필요가 없습니다.
전달자가 응답하지 않는 경우 BIND가 다른 이름 서버에 자체적으로 연결을 시도하는 것을 원하지 않는 경우 구성 섹션에 이 행을 추가할 수 있습니다 forward only;
.options{ ... };
전면 영역을 다음과 같이 선언해야 합니다 intranet.domain
.
zone "intranet.domain" IN {
type master;
file "/var/bind/direct.db";
allow-update { none; };
};
이제 가 있으므로 allow-query { localhost; LAN; };
아마도 acl LAN { ... };
어딘가에 블록도 있어야 합니다.