title: Ubuntu Server 24.04 LTS: systemd-resolved로 DNS 하드닝하기(DNSSEC/DoT, 신뢰할 리졸버 고정, Split DNS, 로그·장애 대응)
body:
대상 OS: Ubuntu Server 24.04 LTS

`systemd-resolved`는 시스템의 DNS 확인 기능을 관리하는 서비스로, DNSSEC, DNS over TLS(DoT) 같은 고급 기능을 지원하여 DNS 쿼리의 보안성과 신뢰성을 높일 수 있습니다. 특히, 중앙에서 관리되는 DNS 인프라가 없거나, 클라이언트 단에서 DNS 트래픽을 보호하고 싶은 경우 유용합니다. 본문에서는 `systemd-resolved`를 활용하여 Ubuntu Server 24.04 LTS 환경에서 DNS 하드닝을 구성하는 방법을 단계별로 소개합니다.

# 1. systemd-resolved 상태 확인 및 기본 설정

가장 먼저 `systemd-resolved` 서비스가 활성화되어 있고 정상적으로 동작하는지 확인합니다.

# systemd-resolved 서비스 상태 확인
systemctl status systemd-resolved

# 현재 DNS 설정 확인 (systemd-resolved가 /etc/resolv.conf를 관리하도록 심볼릭 링크 설정 필요)
cat /etc/resolv.conf

만약 `/etc/resolv.conf`가 `systemd-resolved`를 가리키지 않고 직접 IP 주소를 가지고 있다면, 다음과 같이 심볼릭 링크를 변경합니다.

# 기존 resolv.conf 백업
sudo mv /etc/resolv.conf /etc/resolv.conf.backup

# systemd-resolved stub resolver로 심볼릭 링크 생성
sudo ln -s /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf

# 2. DNS over TLS (DoT) 설정

DNS over TLS는 DNS 쿼리를 TLS로 암호화하여 전송함으로써 중간자 공격으로부터 DNS 쿼리를 보호합니다. `systemd-resolved`는 DoT를 설정 파일에서 직접 지원하지 않지만, `resolvectl` 명령어를 통해 동적으로 설정하거나, `/etc/systemd/resolved.conf` 파일을 수정하여 적용할 수 있습니다.

`resolvectl`을 사용하여 TLS를 지원하는 DNS 서버(예: Cloudflare, Google)를 직접 설정할 수 있습니다.

# Cloudflare DNS (1.1.1.1, 1.0.0.1)를 DoT로 설정
sudo resolvectl dns <interface_name> 1.1.1.1 1.0.0.1
sudo resolvectl set-dns-secure <interface_name> yes

# 또는 systemd-resolved.conf 파일 수정 (설정 후 service 재시작)
# /etc/systemd/resolved.conf 파일에 아래 내용 추가 또는 수정
# [Resolve]
# DNS=1.1.1.1 1.0.0.1 2606:4700:4700::1111 2606:4700:4700::1001
# DNSOverTLS=yes
# fallback-dns-srv=yes

`DNSOverTLS=yes` 옵션을 사용하면 `systemd-resolved`가 지정된 DNS 서버에 대해 DNS over TLS를 시도합니다. `fallback-dns-srv=yes`는 DNS 서버가 응답하지 않을 경우 DNS-over-SRV 레코드를 사용하는 대안 DNS 서버를 사용하도록 합니다.

# 3. 신뢰할 DNS 리졸버 고정 (DNSSEC 검증)

DNSSEC는 DNS 데이터의 무결성과 인증을 보장하는 기술입니다. `systemd-resolved`는 DNSSEC 검증을 지원하며, 신뢰할 수 있는 DNS 서버를 지정하여 DNSSEC 검증이 올바르게 이루어지도록 설정할 수 있습니다.

`/etc/systemd/resolved.conf` 파일에 `DNSSEC=` 옵션을 사용하여 DNSSEC 검증 방식을 설정할 수 있습니다.

- `no`: DNSSEC 검증 비활성화
- `allow-downgrade`: DNSSEC 인증서가 없어도 DNS 쿼리를 허용 (권장하지 않음)
- `yes`: DNSSEC 인증서가 없을 경우 DNS 쿼리 거부 (가장 안전)

ini
[Resolve]
DNS=1.1.1.1 1.0.0.1
# DNSSEC=yes # 기본값은 allow-downgrade 이므로 yes로 명시하는 것이 좋음.
UseDNS=yes # /etc/resolv.conf의 DNS 설정 사용
# DHCPv6-OnlyForDHCP=yes # IPv6 DHCPv6에서 DNS정보를 받지 않도록 설정 (필요시)

설정 변경 후에는 `systemd-resolved` 서비스를 재시작해야 합니다.

sudo systemctl restart systemd-resolved

# 4. Split DNS 구성 (선택 사항)

Split DNS는 특정 도메인에 대해 내부 DNS 서버를 사용하고, 나머지 도메인에 대해서는 외부 DNS 서버를 사용하는 구성입니다. 이는 기업 환경 등에서 내부망의 서비스 이름을 외부 DNS를 통해 노출하지 않으면서 외부 서비스는 정상적으로 이용하고자 할 때 유용합니다.

`/etc/systemd/resolved.conf`에 `Domains=` 옵션을 사용하여 설정합니다.

ini
[Resolve]
# ... 기타 설정 ...

# 내부 도메인에 대해 내부 DNS 서버 사용
Domains=~internal.local
DNS=192.168.1.10 # internal.local 도메인용 내부 DNS 서버
              # 이 설정은 DNS= 설정 라인 위쪽에 있어야 합니다.

# 외부 도메인에 대해 외부 DNS 서버 사용 (기존 설정 유지)
# Domains=~. # 모든 도메인에 대해 기본 DNS 사용
# DNS=1.1.1.1 1.0.0.1

위 설정의 `~internal.local`은 `internal.local` 도메인 및 하위 도메인에 대해 `$DNS`에 지정된 내부 DNS 서버를 사용하도록 합니다. `~.`는 나머지 모든 도메인에 대해 기본 DNS 서버를 사용하도록 합니다. `systemd-resolved`는 설정된 `Domains` 규칙에 따라 적절한 DNS 서버를 선택하게 됩니다.

# 5. 장애 대응 및 로그 확인

DNS 설정에 문제가 발생했을 때 문제를 진단하기 위해 `systemd-resolved`의 로그를 확인하는 것이 중요합니다. `journalctl` 명령어를 사용하면 `systemd-resolved` 서비스의 로그를 실시간으로 볼 수 있습니다.

# systemd-resolved 서비스 로그 실시간 확인
journalctl -u systemd-resolved -f

또한, `resolvectl status` 명령어로 현재 DNS 설정, 사용 중인 DNS 서버, DNSSEC 상태 등을 자세히 확인할 수 있습니다.

# 현재 DNS 설정 및 상태 확인
resolvectl status

# 결론

`systemd-resolved`를 활용하여 DNSSEC 및 DoT를 설정하고 Split DNS를 구성함으로써 24.04 LTS 환경에서 DNS 쿼리의 보안성과 신뢰성을 크게 향상시킬 수 있습니다. 위 설정은 네트워크 보안 강화의 기본적인 단계이며, 운영 환경에 맞춰 적절히 커스터마이징하여 적용하는 것이 좋습니다.