Today Key : systemd-networkd, systemd-resolved, resolv.conf, dns, ubuntu, netplan, query, 질의, linux
리눅스에서 DNS가 어떤 흐름으로 동작하는지 이해하는 것은 서버와 네트워크를 관리할 때 반드시 알고 있어야 할 기본기 중 하나입니다.
특히 systemd가 도입된 이후에는 전통적인 resolv.conf 외에도 systemd-networkd, systemd-resolved 같은 새로운 구성 요소가 등장하면서 동작 방식이 조금 더 복잡해졌습니다.
이번 포스팅에서는 리눅스에서 DNS가 어떻게 동작하는지를 세 가지 구성 요소를 중심으로 설명합니다.
또한 Netplan을 이용하여 DNS를 설정할 경우 내부적으로 어떻게 흐름이 구성되는지와 실제 DNS 쿼리가 어떤 절차로 수행되는지도 함께 다룹니다.
DNS 이해를 위한 구성 요소
systemd-networkd
systemd-networkd는 리눅스에서 네트워크 인터페이스의 설정을 담당하는 데몬입니다.
이 데몬은 DHCP나 정적 IP 설정, 게이트웨이, 그리고 DNS 서버 주소까지 관리합니다.
networkd 자체가 DNS 요청을 처리하지는 않지만, 설정된 DNS 서버 정보를 systemd-resolved에 전달합니다.
따라서 systemd-networkd는 인터페이스의 네트워크 구성과 관련된 모든 설정의 출발점이라고 할 수 있습니다.
systemd-resolved
systemd-resolved는 systemd 기반 시스템에서 DNS 요청을 처리하는 데몬입니다.
이 데몬은 127.0.0.53 포트에서 동작하는 로컬 DNS 스터브로 동작하며, 응용 프로그램이 DNS 요청을 하면 이를 받아 실제 DNS 서버로 질의하고 응답을 반환합니다. DNS 캐시 기능도 내장되어 있어 자주 조회되는 도메인의 응답을 빠르게 처리할 수 있습니다. DNSSEC, LLMNR, mDNS 등도 지원합니다.
systemd-resolved는 여러 인터페이스에 설정된 DNS 정보를 분리해서 관리할 수 있으며, 실제로 어떤 DNS가 사용되는지는 resolvectl status 명령어로 확인할 수 있습니다.
resolv.conf
resolv.conf는 오래전부터 사용되던 전통적인 DNS 클라이언트 설정 파일입니다.
보통 이 파일에 nameserver 항목을 직접 입력해서 DNS 서버를 지정했습니다.
하지만 systemd-resolved가 도입된 이후에는 이 파일이 직접 사용되지 않고,
/run/systemd/resolve/stub-resolv.conf 를 가리키는 심볼릭 링크로 대체되었습니다.
이 stub 파일에는 127.0.0.53이라는 로컬 스터브 DNS 주소만 지정되어 있으며,
진짜 DNS 서버 정보는 systemd-resolved가 따로 관리합니다.
심볼릭 링크 여부는 다음과 확인이 가능합니다.
Netplan을 통한 DNS 설정 흐름
Netplan은 Ubuntu에서 도입된 네트워크 설정 관리 도구로,
YAML 형식의 설정 파일을 사용해 손쉽게 네트워크를 구성할 수 있습니다.
/etc/netplan/*.yaml 파일에 설정만 하면, Netplan이 backend인
networkd나 NetworkManager에 해당 설정을 일괄 적용합니다.
서버에서는 주로 renderer: networkd (systemd-networkd)로 동작하며,
이 경우 DNS 설정 흐름은 다음과 같습니다
Step 1. Netplan 설정 작성
/etc/netplan/01-netcfg.yaml에 다음과 같이 DNS 서버 설정합니다.
Step 2. Netplan 적용
netplan apply 명령을 실행하면, Netplan이 설정을 해석하여 systemd-networkd에 전달합니다.
구체적으로, 해당 YAML을 기반으로 networkd의 설정 파일을 생성하거나 DBus를 통해 networkd에 설정을 투입합니다.
Step 3. systemd-networkd가 인터페이스 구성
networkd는 eth0에 지정된 IP와 게이트웨이를 설정합니다.
그리고 nameservers 항목에 DNS 서버(8.8.8.8, 1.1.1.1)가 있으므로,
이 정보를 systemd-resolved에 등록합니다.
이는 내부적으로 systemd-networkd가 systemd-resolved의 DBus 인터페이스를 호출하여,
“eth0 링크에 DNS로 8.8.8.8/1.1.1.1를 사용한다”라고 알려주는 것입니다.
이 시점에 systemd-resolved는 eth0 인터페이스의 DNS 설정을 인지하게 됩니다
Step 4. systemd-resolved의 설정 반영
systemd-resolved는 새로운 DNS 정보에 따라 업스트림 DNS 목록을 갱신합니다.
이를 확인하기 위해 resolvectl status를 다시 실행해보면,
eth0에 8.8.8.8과 1.1.1.1 DNS 서버가 설정된 것을 볼 수 있습니다.
systemd-resolved는 이 정보를 기반으로 /run/systemd/resolve/resolv.conf 파일을 업데이트해 두었습니다
하지만 /etc/resolv.conf는 여전히 stub를 가리키므로,
이 파일을 응용 프로그램이 직접 참조하지는 않습니다 (systemd-resolved만 내부적으로 보관).
Step 5. 도메인 질의 시, stub 참조
최종적으로, 실제 도메인 질의 시에는
/etc/resolv.conf(심볼릭 링크된 stub 파일)를 통해 127.0.0.53을 DNS 서버로 인식합니다.
로컬 stub인 127.0.0.53 질의를 하면,
systemd-resolved가 앞서 설정된 8.8.8.8, 1.1.1.1로 질의를 하게 됩니다.
요약하면, Netplan은 설정을 모아서 systemd-networkd에 적용하고, networkd는 systemd-resolved에게 해당 DNS 정보를 넘겨주어 /etc/resolv.conf (stub)를 통해 동작하도록 하는 구조입니다.
(Netplan → systemd-networkd → systemd-resolved)
따라서, 관리자는 Netplan 설정만 하면 되고,
내부적으로 systemd들이 연계되어 DNS를 처리하므로 일일이 /etc/resolv.conf를 수정할 필요가 없습니다.