SW개발/우분투 리눅스

Could not resolve host: github.com 해결 방법

공무원 봉급 2022. 5. 28. 19:36

Could not resolve host: github.com 해결 방법

티스토리 블로그를 개설한 지 얼마 되지 않았는데 이상하게 블로그가 통째로 다음에서 검색이 안되기 시작했습니다. 구글 애드센스를 달기 위해서 나름 열심히 노력하고 있는데 특정 글이 아닌 블로그 전체가 검색이 안되니까 많이 속상하네요. 힘내서 글을 써보려고 합니다. 

 

개요

본 글에서는 git 명령 수행시에 "Could not resolve host: github.com" 에러가 뜨는 문제를 해결하는 방법에 대해서 설명하고자 합니다.

 

문제의 상황

신용카드 크기의 미니 컴퓨터인 라즈베리파이는 휴대하기 정말 간편합니다. 시골집에 라즈베리파이를 가져와서 작업 중인데 기존에 잘 사용하던 repository에서 git pull을 했는데 아래와 같은 에러 메시지가 뜨면서 git pull이 되지 않더군요. 

$ git pull
fatal: unable to access 'https://github.com/boyinblue/raspberry.git/': Could not resolve host: github.com

 

여기저기 검색을 해보면서 결국 해결을 하기는 했습니다만, 완벽한 솔루션을 한 번에 제공하는 페이지는 찾을 수 없었습니다. 

 

문제 원인 분석

이 상황에서 www.github.com으로 ping을 날려보면 ping이 제대로 나가지 않는 것을 확인할 수 있습니다. 

$ ping www.github.com
ping: www.github.com: Name or service not known

도메인 네임에 해당하는 IP를 찾을 수 없어서 발생하는 문제입니다. 

 

$ sudo cat /etc/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
# 127.0.0.53 is the systemd-resolved stub resolver.
# run "systemd-resolve --status" to see details about the actual nameservers.
nameserver 127.0.0.53
options edns0 trust-ad

/etc/resolv.conf 파일을 살펴보면 nameserver 설정이 올바르지 않다는 것을 확인할 수 있습니다. 여기서 주의할 점은 /etc/resolve.conf (X)파일이 아니라 /etc/resolv.conf (O) 파일이므로 이 점을 유념하시기 바랍니다. 

 

임시 대책 (/etc/resolv.conf 파일 수정)

/etc/resolv.conf 파일을 편집해서 hostname에 8.8.8.8과 8.8.4.4를 추가해주면 됩니다. 

$ sudo cat /etc/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
# 127.0.0.53 is the systemd-resolved stub resolver.
# run "systemd-resolve --status" to see details about the actual nameservers.
nameserver 127.0.0.53
nameserver 8.8.8.8
nameserver 8.8.4.4
options edns0 trust-ad

 

위와 같이 수정하고 www.github.com으로 ping을 날려보면 ping이 제대로 나가는 것을 확인하실 수 있습니다. 

$ ping www.github.com  
PING github.com (15.164.81.167) 56(84) bytes of data.
64 bytes from ec2-15-164-81-167.ap-northeast-2.compute.amazonaws.com (15.164.81.167): icmp_seq=1 ttl=46 time=11.9 ms
64 bytes from ec2-15-164-81-167.ap-northeast-2.compute.amazonaws.com (15.164.81.167): icmp_seq=2 ttl=46 time=11.7 ms

 

이 상태에서 git 명령을 실행시켜보면 정상적으로 github 서버와 통신이 되는 것을 확인하실 수 있습니다. 하지만 이게 영구적인 대책은 아닙니다. 왜냐하면 /etc/resolv.conf 파일을 재부팅 시에 자동으로 생성되어 리셋될 수 있기 때문입니다. 실제로 리부팅하면 /etc/resolv.conf가 초기화되어 있는 것을 확인할 수 있습니다. 

 

영구 대책 (resolvconf 설정)

영구적으로 nameserver 설정을 제대로 해주는 방법이 있습니다. 물론 여러가지 방법들이 있겠지만 reolvconf 패키지를 설치해서 설정하는 방법에 대해서 설명드리겠습니다. 

 

1. 우선 resolvconf 패키지를 설치합니다. 

$ sudo apt-get install resolvconf
패키지 목록을 읽는 중입니다... 완료
의존성 트리를 만드는 중입니다... 완료
상태 정보를 읽는 중입니다... 완료
다음 새 패키지를 설치할 것입니다:
  resolvconf
0개 업그레이드, 1개 새로 설치, 0개 제거 및 0개 업그레이드 안 함.
54.7 k바이트 아카이브를 받아야 합니다.
이 작업 후 203 k바이트의 디스크 공간을 더 사용하게 됩니다.
받기:1 http://ports.ubuntu.com/ubuntu-ports jammy/universe arm64 resolvconf all 1.84ubuntu1 [54.7 kB]
내려받기 54.7 k바이트, 소요시간 1초 (36.7 k바이트/초)
패키지를 미리 설정하는 중입니다...
Selecting previously unselected package resolvconf.
(데이터베이스 읽는중 ...현재 232581개의 파일과 디렉터리가 설치되어 있습니다.)
Preparing to unpack .../resolvconf_1.84ubuntu1_all.deb ...
Unpacking resolvconf (1.84ubuntu1) ...
resolvconf (1.84ubuntu1) 설정하는 중입니다 ...
Created symlink /etc/systemd/system/sysinit.target.wants/resolvconf.service → /lib/systemd/system/resolvconf.service.
Created symlink /etc/systemd/system/systemd-resolved.service.wants/resolvconf-pull-resolved.path → /lib/systemd/system/resolvconf-pull-resolved.path.
Created symlink /etc/systemd/system/systemd-resolved.service.wants/resolvconf-pull-resolved.service → /lib/systemd/system/resolvconf-pull-resolved.service.
Processing triggers for man-db (2.10.2-1) ...
Processing triggers for resolvconf (1.84ubuntu1) ...

 

2. 설정 파일 편집 /etc/resolvconf/resolv.conf.d/tail

/etc/resolvconf/resolv.conf.d 경로에 들어가보면 head 파일도 있고 tail 파일도 있습니다. 눈치를 채셨겠지만 head 파일에 nameserver를 추가하면 그 내용이 resolv.conf 파일의 앞쪽에 적용되고, tail 파일에 nameserver를 추가하면 뒤쪽에 적용됩니다.

대부분의 경우 로컬의 hostname을 먼저 처리해줘야되기 때문에 추가적인 nameserver는 tail에 작성해주시는 게 맞습니다. 또한 head 설정은 직접 편집하지 말라는 경고 문구까지 있습니다.

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
# 127.0.0.53 is the systemd-resolved stub resolver.
# run "systemd-resolve --status" to see details about the actual nameservers.

 

따라서 /etc/resolvcon/resolv.conf.d/tail 파일을 열어서 nameserver를 추가해주겠습니다.

$ vi /etc/resolvconf/resolv.conf.d/tail

 

아래 2줄을 추가해줍니다. 

nameserver 8.8.8.8
nameserver 8.8.4.4

 

3. 설정 적용 sudo resolvconf -u

$ sudo resolvconf -u

위의 명령으로 설정 파일을 바로 적용합니다. 리부팅을 하더라도 /etc/resolv.conf 파일의 설정이 올바로 유지가 됩니다. 

 

추가 대책

만약 위의 방법으로도 해당 문제가 해결되지 않는다면, /etc/resolvcon/resolv.conf.d/tail 파일에 "options edns0 trust-ad"를 추가해보는 것도 괜찮은 시도 방법입니다. 물론, 해당 설정이 /etc/resolv.conf 파일에 없다는 가정에서 설명드립니다.

 

/etc/resolvconf/resolv.conf.d/tail 파일을 편집기로 엽니다.

$ sudo vi /etc/resolvconf/resolv.conf.d/tail

 

options edns0 trust-ad 라인을 가장 마지막에 추가해줍니다.

nameserver 8.8.8.8
nameserver 8.8.4.4
options edns0 trust-ad

 

변경된 설정을 적용합니다.

$ sudo resolvconf -u

 

긴급 대책

만약 위의 방법으로도 안 된다면 /etc/hosts 파일에 아래 라인을 추가합니다. dns를 거쳐서 도메인 네임을 IP로 변환하는 게 아니라, 그냥 로컬에서 "github.com"을 "15.164.81.167"로 변환해줍니다.

127.0.0.1       localhost
15.164.81.167   github.com

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

 

22.04 업그레이드시에 발생한 문제라면

만약 22.04 이전 버전에서 22.04 버전으로 업그레이드 한 이후에 이 문제가 발생했다면, /etc/resolv.conf 설정 파일이 22.04 이전의 설정 파일을 가리키고 있어서 발생하는 문제일 수 있습니다. 아래의 글을 참고하시기 바랍니다.

 

[우분투 22.04] 호스트 주소를 해석할 수 없습니다. 오류 조치 방법

우분투 리눅스를 20.04에서 22.04로 업그레이드 한 이후로 여러 가지 문제가 발생했습니다. proftpd 업데이트 안 되는 문제도 있었고, 한글 입력이 안 되는 문제고 있었고, firefox가 snap package라서 이

worldclassproduct.tistory.com

 

이상입니다.