본문 바로가기

카테고리 없음

Linux에서 DNS 질의(Query) 동작 이해 (Ubuntu 기준) - Part 2

 Today Key : systemd-networkd, systemd-resolved, resolv.conf, dns, ubuntu, netplan, query, 질의, linux


지난 포스팅에서는 리눅스에서 DNS 질의에 대한 이해를 위한 구성요소인, 

systemd-networkd, system-resolved, resolv.conf과 함께

Netplan을 통한 DNS 설정 흐름을 알아보았습니다.

https://zigispace.net/1303

 

Linux에서 DNS 질의(Query) 동작 이해 (Ubuntu 기준) - Part 1

Today Key : systemd-networkd, systemd-resolved, resolv.conf, dns, ubuntu, netplan, query, 질의, linux리눅스에서 DNS가 어떤 흐름으로 동작하는지 이해하는 것은 서버와 네트워크를 관리할 때 반드시 알고 있어야 할 기

zigispace.net

 

이번 포스팅에서는 실제 DNS 질의(Query)가 어떻게 처리 되는지에 대한 예시 Flow를 알아보려고 합니다.


Linux(Ubuntu)에서 DNS 질의에 대한 처리 절차

 

예시 상황 : ping google.com 을 수행

 

Step 1. ping에서 도메인 질의 요청

 ping에서 google.com 도메인을 IP 주소로 바꾸기 위해, 리눅스 시스템 콜인 getaddrinfo(3) 등을 호출.

이 호출은 네임 서비스 스위치(nsswitch.conf) 설정에 따라 우선 로컬 hosts 파일(/etc/hosts)을 확인하고,

거기에 없다면 DNS 조회를 진행합니다.

hosts에서 files이 dns보다 기본 우선 순위가 높음

 

Step 2. /etc/resolv.conf 확인

glibc의 DNS 리졸버는 /etc/resolv.conf를 열어 어디로 질의를 보낼지 확인합니다.

nameserver 127.0.0.53을 가리키는 stub 모드이므로, localhost의 127.0.0.53 포트로 질의를 보내기로 결정합니다​

참고 ) 만약 이 파일에 nameserver 8.8.8.8과 같이 직접 DNS 서버가 있다면, 해당 DNS 서버로 질의 하지만, stub 모드에서는 로컬 systemd-resovled로 전달. 

glibc란?
glibc (GNU C Library) 는 리눅스에서 C 언어 기반 프로그램이 운영체제의 기능을 사용할 수 있게 해주는 기본 라이브러리
DNS와 glibc
리눅스에서 애플리케이션이 도메인 이름을 IP 주소로 바꾸려면, 보통 getaddrinfo() 또는 gethostbyname() 같은 glibc 함수 사용

 


Step 3.  systemd-resolved (Stub) 처리

127.0.0.53에서 대기 중이던 systemd-resolved가 google.com 도메인에 대한 조회 요청 수신합니다. 

systemd-resolved는 캐시에 최근에 조회된 적 있는지 확인 후, 없는지 확인 하고

캐시에 없다면 다음 단계로 넘어갑니다.

Cache에 없다면, 처음에는 조회를 수행하지만, Cache에 들어가면 Cache에서 결과를 가져옴

 

Step 4.  적절한 상위 DNS 서버 선택

systemd-resolved는 현재 사용 가능한 DNS 서버 중 어느 쪽으로 질의를 보낼지 결정합니다.

일반적으로는 DefaultRoute로 표시된 인터페이스의 DNS 서버(예: eth0의 8.8.8.8)를 사용합니다​.

이 포스팅의 예시에서는 8.8.8.8을 통해 질의한다고 가정합니다.

설정된 DNS Server에서 현재 질의를 담당하는 Current DNS가 있고, 만약 조회에 실패하면, 2차 DNS로 Currnet DNS 서버로 변경됩니다.

 

Step 5.  외부 DNS 서버에 질의

systemd-resolved는 UDP 53 포트를 통해 8.8.8.8 DNS 서버에 google.com A레코드 조회 질의를 보냅니다. 

이 단계는 일반적인 DNS 클라이언트의 동작과 동일합니다.

 

Step 6.  응답 수신 및 검증

8.8.8.8로부터 google.com에 대한 응답이 오면, systemd-resolved가 그 정보를 받습니다. 

DNSSEC 설정이 켜져 있다면 응답에 대한 신뢰 검증도 여기서 수행합니다만, 

기본 설정에서는 DNSSEC 검증이 꺼져 있으므로 바로 다음 단계로 넘어갑니다.

 

Step 7.  캐시 저장 및 응답 전달

systemd-resolved는 받아온 응답을 자신의 캐시에 저장해두고,

질의했던 ping 쪽으로 응답을 전송합니다.

로컬 stub을 통해 응답이 돌아가기 때문에,

ping 프로그램은 마치 일반 DNS 서버에 직접 질의한 것처럼 IP 주소를 받게 됩니다.

 

Step 8.  ping 실행 지속

ping은 받은 IP 주소로 목적지에 ICMP 패킷을 보내기 시작합니다.