본문 바로가기

Linux/systemd

systemd-resolved 사용하기

앞으로 티스토리 대신 blog.stackframe.dev에서 블로깅을 합니다. 이 블로그는 남겨 둘 예정입니다.

전통적으로 리눅스에서 도메인을 IP 주소로 변환 할 때는 먼저 /etc/hosts에 등록되어 있는지 확인하고 만약 없다면 /etc/resolv.conf 에 등록되어 있는 네임서버에 DNS Query를 합니다. 하지만 세월이 지나면서 중간에 다른 방법으로도 변환하는 것이 필요해지면서 NSS(Name Service Switch)가 도입되었습니다. 이것을 사용하면 도메인 뿐만 아니라 사용자 계정, 그룹 등 다양한 정보에 대해 가져오는 위치와 순서를 제어할 수 있습니다. 다만 이것까지 설명하기에는 너무 난잡해질 것 같아서 여기서는 무시하도록 하겠습니다. (nss가 도입되어도 hosts 파일 검사 -> resolv.conf로 DNS에 쿼리한다는 순서는 바뀌지 않았기 때문입니다.)


우선 systemd-resolved에 대해서 설명하자면 이 프로그램은 최근의 리눅스 시스템의 init을 대체한 systemd의 도메인 해석 모듈 정도로 생각하시면 됩니다. 장점으로는 systemd가 적용된 배포판에서 거의 기본적으로 (활성화가 되어있지 않을 수 있지만) 탑재되어있으므로 따로 설치할 필요가 없습니다. 또한 설정과 관리가 쉽다는 systemd의 장점과, (저는 사용하지 않지만) LLMNR과 DNSoverTLS, 캐싱까지 지원하고 있으니 상당히 매력적입니다.

단점으로는 프록시나 VPN을 사용하는 환경에서 DNS 쿼리를 적절하게 라우팅하지 않는다는 것과 특정 DNS만 사용하도록 설정하는데에 어렵다는 겁니다.


아래의 설정을 진행하기 전에 openresolv같이 resolv.conf 파일을 수정하는 프로그램을 종료하고 삭제해야 정상적으로 작동합니다.


systemd-resolved를 설정하기에 앞서 systemd-resolved가 설치되어 있는지 확인합니다.

$ systemctl status systemd-resolved

이 명령을 실행했을 때 Unit sytemd-resolved.service could not be found. 같이 뜬다면 설치되어있지 않은 겁니다.


systemd-resolved의 설정파일은 /etc/systemd/resolved.conf 에 존재합니다.

[Resolve]
DNS=8.8.8.8
#FallbackDNS=8.8.8.8 8.8.4.4 2001:4860:4860::8888 2001:4860:4860::8844
#Domains=
#LLMNR=yes
#MulticastDNS=yes
#DNSSEC=no
#DNSOverTLS=no
#Cache=yes
#DNSStubListener=udp

파일 헤더부분 주석을 제외하면 위와 비슷한 모습입니다. DNS=8.8.8.8은 제가 직접 설정해둔 Google Public DNS 서버입니다.


DNS 옵션에는 기본적으로 사용할 DNS 서버 주소를 입력합니다.


systemd-resolved 는 한번에 여러 DNS에 쿼리를 날립니다. 이 옵션에 설정된 DNS 서버와 DHCP로부터 얻은 DNS 서버에 동시에 요청을 보내고 가장 빠른 응답을 결과로 가져옵니다. 그래서 한국과 같이 DNS 조작을 하는 경우 여기서 8.8.8.8로 설정하여도 통신사 DNS가 더 빠르게 조작된 정보를 보내면 warning.or.kr로 가버립니다. 이를 방지하기 위해서는 추가적으로 systemd-networkd의 설정을 만져주거나 공유기의 DNS 설정을 변경해야 합니다.


밑의 다양한 옵션들도 원하시는대로 변경하시면 됩니다.


이제 systemd-resolved를 실행하고 시작 프로그램으로 등록합니다.

$ sudo systemctl start systemd-resolved
$ sudo systemctl enable systemd-resolved

이것만으로 설정이 끝난다면 좋겠지만 아직 /etc/resolv.conf가 여전히 systemd-resolved를 사용하지 않습니다. systemd-resolved는 127.0.0.53 주소에 내부 DNS 서버를 열어두고 이를 통해 도메인 주소 해석과 캐싱을 수행합니다. 이 주소를 /etc/resolv.conf에 사용하기 위해서는 직접 /etc/resolv.conf에 nameserver 127.0.0.53을 추가해도 되지만 친절하게도 /run/systemd/resolve/stub-resolv.conf 에 설정파일을 만들어뒀습니다. 이것을 심볼릭 링크로 /etc/resolv.conf를 만들면 됩니다.

$ sudo rm /etc/resolv.conf
$ sudo ln -s /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf

이제 systemd-resolved의 설정이 끝났습니다. nslookup를 통해 시스템이 기본적으로 내부 DNS 서버에 쿼리하는 것을 볼 수 있습니다.

$ nslookup google.com
Server:         127.0.0.53
Address:        127.0.0.53#53

Non-authoritative answer:
Name:   google.com
Address: 172.217.25.110
Name:   google.com
Address: 2404:6800:4004:80b::200e


'Linux > systemd' 카테고리의 다른 글

systemd 사용자 유닛 만들기  (0) 2019.01.09
리눅스 시스템 시간 동기화하기  (0) 2018.12.30
systemd timer로 cron 대체하기  (4) 2018.12.30
systemd로 서비스 관리하기  (0) 2018.12.27
systemd란 무엇인가  (0) 2018.12.27