network / knowledge

Technitium DNS를 docker로 올리기

paul 2026.01.16 255words (1m)

내부망 DNS를 Technitium으로 세웠다. 공식 compose를 그대로 쓰면 되는데 두 가지가 걸렸다.

yaml
services:
  dns-server:
    container_name: dns-server
    hostname: dns-server
    image: technitium/dns-server:latest
    network_mode: "host"
    environment:
      - DNS_SERVER_DOMAIN=dns01
      - DNS_SERVER_WEB_SERVICE_ENABLE_HTTPS=true
      - DNS_SERVER_WEB_SERVICE_USE_SELF_SIGNED_CERT=true
      - DNS_SERVER_WEB_SERVICE_HTTP_TO_TLS_REDIRECT=true
      - DNS_SERVER_RECURSION=AllowOnlyForPrivateNetworks
      - DNS_SERVER_FORWARDERS=1.1.1.1, 1.0.0.1
    volumes:
      - ./config:/etc/dns
    restart: unless-stopped

DHCP를 쓰려면 host 네트워크여야 한다

network_mode: "host" 로 두고 포트 매핑을 전부 지웠다. DHCP는 브로드캐스트로 오가는데, 브릿지 네트워크 안에 있으면 그 브로드캐스트가 컨테이너까지 닿지 않는다. 포트를 매핑해도 안 된다.

DNS만 쓸 거라면 브릿지에 두고 53번만 매핑해도 된다.

env로 되는 것과 안 되는 것

환경변수로 잡을 수 있는 건 초기 설정 일부뿐이다. zone이나 DNS record는 web GUI에서 만들어야 한다. env에 있는 것만 먼저 넣고 나머지는 GUI에서 하는 순서가 된다.

DNS_SERVER_RECURSION=AllowOnlyForPrivateNetworks 는 중요하다. 내부망에서 온 질의만 재귀 조회를 해준다. 열어두면 open resolver가 되어 DNS 증폭 공격에 쓰인다.

DNS_SERVER_FORWARDERS 는 직접 루트부터 훑지 않고 넘길 상위 서버다.

인증서는 self-signed로 뒀다. 내부에서만 접근하는 관리 화면이라 그걸로 충분하다.

cluster 이름이 서버 이름을 바꾼다

cluster를 만들 때 주의할 점이 하나 있다. cluster를 초기화하면 기존 DNS 서버의 도메인 이름이 cluster 도메인의 하위로 바뀐다.

예를 들어 현재 DNS Server Domain Name이 ns1.mydomain.tld 이거나 그냥 ns1 이면, 새 이름은 ns1.mycluster.tld 가 된다.

이름이 바뀌면 그 이름을 참조하던 설정도 같이 손봐야 하므로, cluster 도메인 이름을 처음부터 정해두고 만드는 편이 낫다.

참고