- 출처 / 참고: Linux man-pages (resolv.conf(5), systemd-resolved(8)), RFC 1035 (Domain Names)
명령어:
dig,nslookup,resolvectl,systemctl,ping,ip route
키워드: Temporary failure in name resolution, DNS timeout, resolv.conf, systemd-resolved, 네임서버, 53 포트
사용처:apt/yum패키지 설치 실패,curl/wget도메인 호출 에러, 리눅스 서버 초기 네트워크 구축 장애 대응
실행예제
도메인 해석 실패 시 원인이 로컬 DNS 서비스인지, 설정 파일 누락인지, 외부 53번 포트 통신 차단인지를 분리하여 파악합니다.
# 1. 장애 현상 확인: ping 또는 curl 호출 시 오류 발생
$ ping -c 2 google.com
ping: google.com: Temporary failure in name resolution
# 2. IP 직통 통신 여부 확인 (게이트웨이/외부 라우팅 정상 여부 분리)
$ ping -c 2 8.8.8.8
64 bytes from 8.8.8.8: icmp_seq=1 ttl=116 time=12.4 ms
# -> IP 핑이 성공한다면 네트워크 라우팅은 정상이지만 순수 DNS 해석 문제임을 확정
# 3. 현재 등록된 DNS 네임서버 설정 확인
$ cat /etc/resolv.conf
# 만약 파일이 비어있거나 올바른 nameserver IP가 없다면 에러 발생
# 4. systemd-resolved 상태 및 바인딩된 업스트림 DNS 점검
$ resolvectl status
# 또는
$ systemctl status systemd-resolved
# 5. 특정 네임서버를 직접 지정하여 질의 테스트 (53번 포트 통신 가능 여부)
$ dig @8.8.8.8 google.com +time=3
스크립트
현재 시스템의 DNS 해석 경로(resolv.conf, systemd-resolved, 외부 53번 UDP/TCP 통신, 게이트웨이)를 순차 점검하고 문제를 진단하는 쉘 스크립트입니다.
#!/bin/bash
# dns_troubleshoot.sh - Diagnose Linux DNS resolution failures
TARGET_DOMAIN=${1:-"google.com"}
TEST_DNS="8.8.8.8"
echo "=========================================="
echo " [DNS 진단 시작] 대상 도메인: ${TARGET_DOMAIN}"
echo "=========================================="
# 1. 기본 라우팅 및 게이트웨이 확인
echo -e "\n[1] 기본 네트워크 경로 및 IP 라우팅 점검:"
DEFAULT_GW=$(ip route | grep default | awk '{print $3}')
if [ -z "$DEFAULT_GW" ]; then
echo " [오류] 기본 게이트웨이(Default Gateway)가 설정되어 있지 않습니다."
echo " -> 네트워크 인터페이스 설정을 먼저 확인하십시오."
else
echo " [정상] 기본 게이트웨이 감지: ${DEFAULT_GW}"
fi
# 2. 공용 IP 핑 테스트 (순수 네트워크 계층 정상 여부)
echo -e "\n[2] 외부 공용 IP(8.8.8.8) 도달 가능 여부:"
if ping -c 2 -W 2 "$TEST_DNS" &>/dev/null; then
echo " [정상] 외부 IP 직통 연결 정상 (네트워크 계층 이상 없음)"
else
echo " [경고] 외부 IP로 패킷이 나가지 못하고 있습니다. 게이트웨이 또는 방화벽 문제일 수 있습니다."
fi
# 3. /etc/resolv.conf 점검
echo -e "\n[3] /etc/resolv.conf 상태 점검:"
if [ ! -f /etc/resolv.conf ]; then
echo " [오류] /etc/resolv.conf 파일이 존재하지 않습니다."
else
NAMESERVERS=$(grep -E "^nameserver" /etc/resolv.conf | awk '{print $2}')
if [ -z "$NAMESERVERS" ]; then
echo " [오류] resolv.conf 내에 등록된 nameserver가 없습니다."
else
echo " [정상] 등록된 네임서버:"
echo "$NAMESERVERS" | sed 's/^/ - /'
fi
# 심볼릭 링크 여부 확인 (Ubuntu/systemd 계열)
if [ -L /etc/resolv.conf ]; then
echo " [안내] /etc/resolv.conf 는 심볼릭 링크입니다 -> $(readlink -f /etc/resolv.conf)"
fi
fi
# 4. systemd-resolved 데몬 상태 점검
echo -e "\n[4] systemd-resolved 상태 점검:"
if systemctl is-active --quiet systemd-resolved; then
echo " [정상] systemd-resolved 서비스가 활성화되어 있습니다."
else
echo " [참고] systemd-resolved 서비스가 비활성 상태이거나 설치되지 않았습니다."
fi
# 5. 실제 도메인 질의 테스트
echo -e "\n[5] 도메인 해석 테스트:"
if getent hosts "$TARGET_DOMAIN" &>/dev/null; then
echo " [성공] '${TARGET_DOMAIN}' 이름 해석 성공:"
getent hosts "$TARGET_DOMAIN" | sed 's/^/ /'
else
echo " [실패] '${TARGET_DOMAIN}' 이름 해석 실패 (Temporary failure in name resolution)"
echo " -> 외부 DNS(${TEST_DNS}) 직접 질의 테스트 시도..."
if command -v dig &>/dev/null; then
dig @"$TEST_DNS" "$TARGET_DOMAIN" +short
fi
fi
echo -e "\n=========================================="
echo " [진단 완료]"
echo "=========================================="
해설
Temporary failure in name resolution 오류는 운영체제 리졸버(NSS, glibc resolver)가 특정 도메인을 IP로 변환하려고 시도했으나, 유효한 네임서버로부터 응답을 받지 못해 일시적인 실패 상태를 반환할 때 발생합니다.
1. 주요 원인
/etc/resolv.conf설정 누락 또는 잘못된 IP:- 시스템이 질의할
nameserver <IP>항목이 비어 있거나, 설정된 IP의 DNS 서버가 다운된 경우.
- 시스템이 질의할
systemd-resolved심볼릭 링크 깨짐:- Ubuntu 18.04/20.04/22.04+ 환경에서
/etc/resolv.conf가 잘못된 스텁 리졸버 경로(../run/systemd/resolve/stub-resolv.conf)를 가리키거나 링크가 깨진 경우.
- Ubuntu 18.04/20.04/22.04+ 환경에서
- 네트워크 매니저(NetworkManager, Netplan) 덮어쓰기:
- 사용자가
/etc/resolv.conf를 수동으로 수정했으나, DHCP 리스 갱신 또는 서버 재부팅 시 설정이 초기화되는 현상.
- 사용자가
- 53번 포트(UDP/TCP) 방화벽 차단:
- 아웃바운드 방화벽(iptables, 클라우드 보안 그룹 등)에서 외부 네임서버로의
UDP/TCP 53번 포트 통신을 차단한 경우.
- 아웃바운드 방화벽(iptables, 클라우드 보안 그룹 등)에서 외부 네임서버로의
2. 단계별 복구 및 해결 방법
- 임시 즉각 조치 (긴급 복구):
/etc/resolv.conf에 안정적인 퍼블릭 네임서버를 직접 추가:echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf echo "nameserver 1.1.1.1" | sudo tee -a /etc/resolv.conf
- Ubuntu (
systemd-resolved) 환경 영구 복구:- 스텁 리졸버 링크를 복구하고 데몬 재시작:
sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf sudo systemctl restart systemd-resolved /etc/systemd/resolved.conf파일에서 글로벌 DNS 지정:[Resolve] DNS=8.8.8.8 1.1.1.1 FallbackDNS=8.8.4.4
- 스텁 리졸버 링크를 복구하고 데몬 재시작:
- Netplan 환경 영구 반영 (
/etc/netplan/*.yaml):network: version: 2 ethernets: eth0: nameservers: addresses: [8.8.8.8, 1.1.1.1]수정 후
sudo netplan apply적용.
주의사항
/etc/resolv.conf직접 수정 시 덮어쓰기 주의:- 최신 배포판(Ubuntu, RHEL 8/9 등)에서
/etc/resolv.conf는systemd-resolved나NetworkManager에 의해 동적으로 자동 생성됩니다. 직접 파일을 수정하더라도 네트워크 재시작이나 재부팅 시 원복되므로, 반드시netplan,nmcli, 또는resolved.conf를 통해 영구 반영해야 합니다.
- 최신 배포판(Ubuntu, RHEL 8/9 등)에서
chattr +i사용 지양:- 덮어쓰기를 막기 위해
chattr +i /etc/resolv.conf(불변 속성)를 설정하는 임시 방편이 자주 공유되지만, 이는 네트워크 서비스 재시작 시 비정상 종료(Crash)를 유발할 수 있으므로 권장되지 않습니다.
- 덮어쓰기를 막기 위해
- 사내망 및 사설 VPC(AWS Route 53 등) 환경:
- 클라우드 내부 인스턴스에서 외부 공용 DNS(8.8.8.8 등)만 지정할 경우 사내 도메인이나 VPC 내부 엔드포인트(예: RDS 엔드포인트, 내부 API)를 해석하지 못할 수 있습니다. VPC 기본 제공 DNS(예: AWS VPC CIDR + 2)를 최우선 순위로 유지해야 합니다.