컴퓨터적 사고 함양을 위한 라즈베리 파이
도메인 네임 시스템
이번 학습단원에서는 라즈베리 파이를 사용해서 도메인 네임 시스템을 독립된 별도 네트워크 위에 구축하는 실습을 시연한다.

인터넷 도메인 네임 시스템
학습 목표
- 도메인 네임 시스템(Domain Name System, DNS)가 무엇인지 이해한다.
- 전반적인 컴퓨터 네트워크와 인터넷 구조에서 수행하는 역할을 알게 된다.
들어가며
이번 학습단원을 시작하기 전에 모든 학생이 이전 DHCP 학습단원을 완료할 것을 강력히 추천한다. 이런 순서로 네트워크 학습을 진행하는 것이 중요한데 이유는 DNS를 이해하는데 DHCP와 연관성을 이해하는 것이 필요하기 때문이다. DNS는 무척 복잡한 학습주제이고 이번 학습교재는 단지 개념에 대한 소개에 불과하다. 전반적인 안내를 위한 목적으로 작성된 것은 아니다. 분산 DNS (Distributed DNS)가 구체적으로 다뤄지지는 않지만, 간략하게는 다뤄질 것이다.
IP 주소를 기억하는 것이 다소 까다롭다는 것을 눈치챘을 수도 있다. IP주소는 점(dot)으로 구분된 8 비트 숫자로 구성된다; 예를 들어, 192.168.0.146
. 사람에게 종종 이런 유형의 숫자 시퀀스를 기억하는 것이 어렵고 대신에 이름이나 단어를 기억하는 것이 더 쉽다.
웹서버 같은 네트워크에 위에 있는 자원에 접근할 때, IP 주소를 기억해야만 한다. IP 주소 숫자를 기억하지 말고, 사람이 네트워크 서버에 연결하는 것을 더 쉽게 어떻게 할 수 있을까?
학습 결과
모든 학생이 수행할 수 있는 것
- 컴퓨터 네트워크와 인터넷에 DNS가 필요한 이유를 이해한다.
- DNS 서버를 사용해서 네트워크 자원/서버에 연결한다.
대부분 학생이 수행할 수 있는 것
- DNS 서버 내부 로직을 이해한다.
- DNS와 DHCP 관련성을 이해한다.
학습 정리
- DNS 서비스가 돌아가는 로직 프로세스를 토의한다.
- 라즈베리 파이를 설정해서 DNS 서버를 구축한다.
- 다른 라즈베리 파이를 사용해서 DNS 조회를 수행한다.
- 네트워크 테스트한다.
학습에 필요한 것
수업 대부분에 짝을 이뤄 학생들이 작업을 수행하도록 권장한다. 이더넷 허브 혹은 스위치는 완전히 결리되어 독립된 상태로 두어야 되며, 어떤 이더넷 케이블도 학교 주 네트워크에 연결되어서는 안된다.
- 이전 수업에서 사용한 라즈베리 파이 DHCP 서버
- [웹서버(web server)]로 동작하는 하나 혹은 그이상의 라즈베리 파이 (선택사항)
- 짝을 이룬 학생 두명마다 라즈베리 파이 1대
- 짝마다 이더넷 케이블 1개
- 짝마다 라즈비언 운영체제가 설치된 NOOBS SD 카드 1개
- 짝마다 라즈베리 파이에 연결된 마우스와 키보드
- 짝마다 라즈베리 파이에 연결된 모니터
- 모든 라즈베리 파이를 연결하는데 충분한 포트를 가진 이더넷 허브 혹은 스위치
- 숫자 선택 카드 한벌 (시작 언플러그드 활동)
- 종이, 연필 혹은 볼펜 (시작 언플러그드 활동)
들어가며
컴퓨터 네트워크는 매우 커다랗게 성장할 수 있다. 인터넷은 이 세상에 존재하는 가장 커다란 컴퓨터 네트워크다. 사실 너무나 커서 인터넷에 있는 컴퓨터 대수를 헤아리는 것은 불가능하다. 만약 방문하려고 하는 모든 웹서버 주소를 기억하는 것이 필요하다면, 얼마나 어려울지 상상해 보라.
이것이 DNS 서버가 필요한 이유다; DNS는 도메인 네임 시스템(Domain Name System)의 두문약어다. DNS 주요 기능은 쉽게 기억가능한 도메인 혹은 호스트 이름 (예들 들어, google.com, raspberrypi.org)을 IP 주소로 변경하거나 혹은 반대로 변경하는 서비스를 제공한다. 그래서 필요한 전화번호를 찾을 수 있게하는 일종의 전화번호부다.
주소를 브라우져 주소창에 타이핑할 때, 컴퓨터는 DNS 서버에 연락을 취해서 해당되는 IP 주소를 요청한다. DNS 서버는 요청받은 이름에 대해서 데이터베이스를 검색하고, 해당되는 IP 주소를 찾아서, 클라이언트에 반환한다. 이 과정을 DNS 쿼리(DNS query)라고 부른다.
그러고 나면, 클라이언트는 직접 DNS 쿼리에 전달받은 IP주소를 사용해서 서버와 통신한다.
시작 언플러그드 활동
컴퓨팅 언플러그드 활동은 논리과정(logical process)을 통해 DNS 서비스를 익힐 수 있어 매우 좋다.
DNS 서버 역할을 수행할 학생을 한명 선정한다. 나머지 학생에게 숫자 카드를 하나씩 나눠준다. DNS 서버는 모든 학생 이름과 숫자를 적어둔다. 이름과 숫자가 적힌 목록이 DNS 서버가 관리하는 데이터베이스가 된다.
논의를 진행하기 위해서, 남은 모든 학생이 웹사이트를 호스팅하는 웹서버라고 가정하다. 이제 학생중 한명이 웹브라우져 주소창에 http://dave
라고 타이핑한다. 다음이 DNS 쿼리가 진행되는 방식이다.
- 호스트: “안녕 DNS 서버야, ‘dave’ 이름에 해당하는 IP주소를 알려줄 수 있남. 부탁이야.”
- DNS: “’dave’가
201.72.165.69
으로 등록되어 있어.” - 호스트: “안녕,
201.72.165.69
, 너의 홈페이지를 알려줘.” 201.72.165.69
: “여기 내 홈페이지가 있어.”
엄청 단순하게 보인다, 그렇지 않나? 이제 다음 시나리오를 생각해보자. 학생 한명더 DNS서버로 지명하고 목록의 절반을 담당하게 하자. 다음이 DNS 쿼리가 진행되는 방식이 된다.
- 호스트: “안녕 DNS 서버야, ‘dave’ 이름에 해당하는 IP주소를 알려줄 수 있남. 부탁이야.”
- DNS1: “’dave’를 갖고 있지 않는데, 잠시만 기다려봐.”
- DNS1: “DNS2, ’dave’라는 이름을 갖는 IP 주소가 있으면 꼭 알려줘”
- DNS2: “DNS1, ’dave’가
201.72.165.69
으로 등록되어 있어.” - DNS1: “호스트야, ’dave’가
201.72.165.69
으로 등록되어 있어 있는 것을 찾았어.” - 호스트: “안녕,
201.72.165.69
, 너의 홈페이지를 알려줘.” 201.72.165.69
: “여기 내 홈페이지가 있어.”
이번 시나리오에서 첫 DNS 서버는 데이터베이스에서 ‘dave’ 정보를 갖고 있지 않다. 하지만, 쿼리를 두번째 DNS 서버에 전달했는데, 목록 정보를 갖고 있다. 이것이 반복 DNS 쿼리(iterative DNS Query)로 알려진 것이다. 두번째 DNS 서버가 첫번째에 응답하고 나서, 첫번째가 IP 주소 정보를 갖고 최초 호스트/클라이언트에 응답한다. 말하자면, 요청한 IP 주소 정보가 사슬을 따라 되먹임되 전달된다.
이같은 것이 인터넷에서 어떻게 동작하는지 생각해보자. 실제 인터넷 DNS는 전세계 수많은 DNS 서버 네트워크에 무슨 이름이 어는 IP 주소에 매칭되는지 기억할 책임을 분산관리한다.
실제 발생하는 것은 특정 도메인 네임 수준별로 전용 DNS 서버가 있다. 예를 들어, .com
에 전용 DNS 서버가 있고, .org
에 전용 DNS 서버가 있고, .co.kr
에 전용 DNS 서버가 있다. 그래서, raspberrypi.org
같은 주소를 타이핑하게 될 때, 쿼리가 사용자에게 응답을 주기 전에 DNS 서버 몇개를 통과하게 된다.
반복 DNS 쿼리가 해결되면, 첫 DNS 서버가 결과를 캐쉬해서 나중에 사용되도록 기억한다. 이런 방식으로, 만약 동일한 이름이 요청되면, 첫번째 DNS 서버가 이미 응답을 했서 다른 DNS 서버에 조언을 구할 필요없이 빠르게 응답할 수 있다.
DHCP는 어떻게 될까?
끝마치기 전에, 만약 이전 학습에서 DHCP 서버 개념을 다시 가져온다면 무슨 일이 발생할까? DHCP를 사용할 때, 컴퓨터 IP 주소 변경이 변경될 수 있다. 호스트가 전원이 나가고 DHCP 서버에 IP 주소를 다시 돌려주고 나면, 그 해당 주소는 네트워크에 연결된 또다른 호스트에 배정된다. 이와 같은 상황이 되면, DNS 이름과 IP 주소가 서로 매칭되지 못하게 된다.
주요 핵심 활동
이전 학습에서 사용한 DHCP 서버 라즈베리 파이가 이번 학습에 필요하다. 사용할 소프트웨어는 동일한 dnsmasq
서비스다. 그래서 이번에 어떤 것도 설치할 필요는 없다. 다만, 서버 라즈베리 파이가 다른 것과 쉽게 구별되도록 한다.
만약 이용가능한 웹서버가 있다면, 먼저 IP 주소만 사용해서 브라우져로 홈페이지를 볼 수 있는지 빠른 실습을 수행한다. startx
명렁어로 라즈베리 파이 바탕화면을 실행하고, 미도리(Midori) 브라우져를 열고 주소창에 웹서버 IP 주소를 입력한다.
웹서버 IP 주소를 알아내려면, 웹서버 라즈베리 파이 터미널에서 명령어로 ifconfig
를 사용한다. 주소는 inet addr
다음 두번째 줄에 eth0
아래 나온다. 모두 페이지를 올바르게 가져와서 볼 수 있어야 한다.
서버 라즈베리 파이만 필요
주의 단지 한 라즈베리 파이만 DHCP 서버로 사용될 것이기 때문에, 이번 활동 부분은 한명을 제외한 모든 학생이 지켜보는 것으로 진행되는 것이 가장 좋다.
dnsmasq
프로그램은 DHCP와 DNS 서비스를 모두 제공한다. 그래서, 지금 필요한 것은 설정만 하면 된다. dnsmasq
환경설정 파일을 편집하는데 다음 명령어를 입력한다:
sudo nano /etc/dnsmasq.conf
DHCP 서버가 하는 것처럼 DNS는 방송 시스템을 갖고 있지 않다. 그래서 클라이언트/호스트에 DNS 서버 주소를 일러줄 필요가 있다. 쉬운 해결책은 DHCP 서버가 DNS 서버 주소 정보를 동시에 호스트에 전달하는 것이다.
DNS와 DHCP 서비스가 동일한 라즈베리 파이에서 제공되기 때문에, DNS IP 주소는 정적 IP 주소로 이전 학습에서 서버 라즈베리 파이에 주어졌다. 파일 하단에 다음 줄을 추가한다.
dhcp-option=6,192.168.0.1
다음으로, DNS 쿼리에 대해서 조회 데이터베이스가 위치한 장소를 지정할 필요가 있다. 종종, 이것이 매우 중요한 데이터베이스 플랫폼이지만, 이번 실습에서는 개념만 시연한다는 측면에서 간단한 텍스트 파일을 사용할 것이다.
환경설정 파일에 다음 두줄을 추가한다.
no-hosts
addn-hosts=/etc/hosts.dnsmasq
no-hosts
는 dnsmasq
에게 DNS 쿼리에 대해서 디폴트 기본설정 시스템 /etc/hosts/
파일을 무시하라고 한다. 다음 줄이 DNS 쿼리에 대한 조회 파일로 /etc/hosts.dnsmasq
파일을 지정한다. (잠시 뒤에 이 파일을 생성할 것이다.)
그래서 모든 것을 두번 점검면, 이제 dnsmasq.conf
파일은 다음과 같이 보여야 한다:
interface=eth0
dhcp-range=192.168.0.2,192.168.0.254,255.255.255.0,12h
dhcp-option=6,192.168.0.1
no-hosts
addn-hosts=/etc/hosts.dnsmasq
나노 편집기에서 저장하기 위해서 Ctrl+O
를 누르고 Enter
를 입력하고, Ctrl+X
를 눌러 빠져나온다.
이제 호스트 이름에 대한 조회 테이블을 생성할 필요가 있다. 다음 명령어를 터미널에 명령 프롬프트에 입력한다:
sudo nano /etc/hosts.dnsmasq
이제 빈 텍스트 파일을 편집해야만 한다. 여기서 지켜야 되는 형식이 있다. 해당 형식은 IP<tab>hostname
이다; 키보드 탭(tab) 키 사용을 주목하라.
예를 들어, 다음 행을 입력한다(다음 명령이 라즈베리 파이 서버 DNS 이름으로 serverpi
를 부여한다.)
192.168.0.1 serverpi
나노 편집기에서 저장하기 위해서 Ctrl+O
를 누르고 Enter
를 입력하고, Ctrl+X
를 눌러 빠져나온다.
DNS/DHCP 서버를 다시 활성화하기 전에, 라즈베리 파이 서버가 실습 허브/스위치에 연결된 유일한 디바이스인지 확실히 한다; 모든 이더넷 연결선을 뽑는다. dnsmasq
서비를 재시작하는데 다음 명령어를 입력한다.
sudo service dnsmasq restart
이제 서버가 다시 활성화되고, 클라이언트 호스트 컴퓨터에서 요청을 받을 준비가 되었다.
여기 필요한 것이 한가지 더 있다. 서버가 정정 IP 주소로 설정되어서, DHCP 서버는 본인에게 자신의 DNS 서버를 사용하게 결코 명령할 수 없다. 그래서, 변경이 이것이 되도록 변경할 파일이 하나더 있다. 다음 명령어를 입력한다:
sudo nano /etc/resolv.conf
상기 파일은 다음 줄만 갖아야 한다.
nameserver 127.0.0.1
여기서, 대신에 192.168.0.1
을 사용할 수도 있지만, 127.0.0.1
이 무슨 IP 주소냐에 관계없이, 로컬 컴퓨터를 참조하는 일반적인 방법이다. 그래서 다른 이유로 정적 IP 주소를 변경하더라도, resolv.conf
을 다시 편집할 필요가 없다.
나노 편집기에서 저장하기 위해서 Ctrl+O
를 누르고 Enter
를 입력하고, Ctrl+X
를 눌러 빠져나온다. 이제 네트워킹 서비스를 다시 시작하는데 다음 명령어를 입력한다.
sudo service networking restart
남은 모든 라즈베리 파이 클라이언트
남아있는 라즈베리 파이 클라이언트 아무거나 허브/스위치에 다시 연결하기 전에, /etc/network/interfaces
파일에 환경설정이 제대로 해서 DHCP 서버에서 IP 주소를 얻어 오게 한다. 여전히 이전 학습에서 설정된 방식으로 되어 있어야 한다.
이제 다시 앞으로 진도를 나가 허브/스위치에 남은 라즈베리 파이를 재연결을 시작한다; DHCP 서버에서 즉시 IP 주소를 획득해야 한다. 이를 확인하는데 다시 ifconfig
명령어를 사용한다; 배정된 IP 주소는 서버에 지정된 범위에서 무작위로 선정되어야 한다.
모든 학생이 ping serverpi
명령어를 입력하고 IP 주소에서 응답을 받는 것을 확인해야 한다.
### 한걸음 더 앞으로: 웹서버!
하나 혹은 그 이상 라즈베리 파이 웹서버를 사용한다고 가정하면, 브라우저 주소창에 이름을 입력하고 해당 홈페이지가 보여지게 되는 지점까지 도달하게 되면 멋진 일이 된다. 이것이 다음 실습작업이다!
뭔가 변경을 하기 전에, 변경되는 DHCP IP 주소 배정과 DNS 서버 조회 테이블과 동기화가 어긋나는 문제를 고려해볼 필요가 있다. 이것이 시작 언플러그드 활동에서 살짝 다뤄졌다.
통신망에서 서버 컴퓨터(일종의 서버를 제공하는)가 정적 IP 주소를 갖는 관례가 있다. 이 방식으로 인해서, 미래 특정 시점에 변경되는 걱정없이 IP 주소가 DNS 조회 데이터베이스에 배정될 수 있다.
여기서 주의해야될 필요가 있다! 만약 수작업으로 정적 IP 주소를 할당한다면, DHCP 서버가 동일한 IP 주소를 네크워크에 연결하는 또다른 컴퓨터에 배정할 수 있다. 이것을 피하기 위해서, DHCP 서버가 배정할 IP 주소 범위를 변경할 수 있다. 만약 DHCP 범위가 특정 숫자 보다 더 높은 곳에서 시작된다면, non-DHCP IP 주소 블록을 남겨둬서 자유롭게 정적 주소를 서버에 비정할 수 있다.
다시 라즈베리 파이 서버로 돌아가서
dnsmasq
환경설정 파일을 편집하는데 다음 명령어를 입력한다.
sudo nano /etc/dnsmasq.conf
dhcp-range
행에서 첫 IP 주소(현재 192.168.0.2
)으로 시작해서 마지막 IP 주소(현재 192.168.0.254
)까지 볼 수 있다. 첫 IP 주소를 .51
로 변경해서 정적 IP 주소에 대해서 50보다 작은 숫자를 부여할 수 있다.
이제 해당 줄은 다음과 같다:
dhcp-range=192.168.0.51,192.168.0.254,255.255.255.0,12h
이제 안전하게 정적 IP 주소를 웹서버에 배정할 수 있다. 실제로 동일한 작업을 수행하는 방식이 두가지가 있다. 하나는 웹서버 자체 /etc/network/interfaces
, /etc/resolv.conf
파일을 편집하는 것이다; 혹은 DHCP 서버 환경설정을 바꿔 MAC 주소로 인식하게 하고 항상 동일한 IP 주소를 배정하는 것이다. 후자가 더 깔끔한 방식인데 이유는 DHCP 제안을 통해서 DNS 서버 환경설정 정보를 전송할 수 있기 때문이다; 또한, 서버에서 모든 제어를 할 수 있기 때문이다.
이것을 위해서 웹서버 라즈베리 파이 MAC 주소를 조회할 필요가 있다. ifconfig
명령어를 입력해서 알아낼 수 있다; eth0
아래, HWaddr
(hardware address) 다음 첫번째 줄을 살펴본다. MAC 주소는 b8:27:eb:aa:bb:cc
같을 것이다.
MAC 주소를 라즈베리 파이 DNS 서버에 있는 dnsmasq
환경설정 파일에 다음 행을 추가한다. 예를 들어, 항상 192.168.0.20
을 배정하기 위해서 다음을 넣는다.
dhcp-host=b8:27:eb:aa:bb:cc,192.168.0.20
나노 편집기에서 저장하기 위해서 Ctrl+O
를 누르고 Enter
를 입력하고, Ctrl+X
를 눌러 빠져나온다.
이제 웹서버에 대한 이름을 선정할 필요가 있다. hosts.dnsmasq
파일에 다음을 추가한다.
sudo nano /etc/hosts.dnsmasq
다음과 같은 형식으로 새로운 줄을 추가한다. 예를 들어:
192.168.0.1 serverpi
192.168.0.20 webserverpi
나노 편집기에서 저장하기 위해서 Ctrl+O
를 누르고 Enter
를 입력하고, Ctrl+X
를 눌러 빠져나온다. dnsmasq
서비스를 재시작하는데 다음 명령어를 입력한다.
sudo service dnsmasq restart
라즈베리 파이 웹서버
이제 라즈베리 파이 웹서버를 출시하고 DHCP 서버에서 IP 주소를 새로 갱신(renew)할 필요가 있다; 그러면, DNS 항목과 매칭되도록 선택한 정적 IP 주소가 되어야 한다. 이것을 수행하는 명령어가 다음에 있다:
sudo ifdown eth0
sudo ifup eth0
올바른 IP 주소가 DHCP 서버에 주어졌는지 다시 확인하자; 이를 위해서 ifconfig
명령어를 사용한다. 주소는 inet addr
다음에 두번째 줄 eth0
아래 있다. 만약 맞지 않는다면, 다시 돌아가서 실수한 것이 있는지, 라즈베리 파이 서버 환경설정 파일을 점검한다. 다시 dnsmasq
서비스를 다시 시작하고, 상기 두 명령어를 반복한다.
남은 모든 라즈베리 파이 클라이언트
이제 남은 모든 라즈베리 파이 클라이어트가 웹브라우저 주소창에 webserverpi
이름을 입력해서 홈페이지가 보인다. 이 과정에서 서버를 찾는데 DNS 쿼리를 성공적으로 수행한 것이다. ping webserverpi
명령어도 또한 동작해야 한다.
모든 학생이 모인 총회
이제 학생들이 시작 언플러그드 활동과 핵심 실습학습 내용에 유사성을 토의하도록 한다.
정적 IP 주소와 DNS 조회 항목을 갖는 웹서버 몇대를 더 네트워크에 추가하는 것이 재미있을 수 있다. 이것을 위해서 상기와 동일한 과정을 밟는다.
추가된 각 웹서버마다 필요한 것:
/etc/dnsmasq.conf
파일에 한줄 추가해서 MAC 주소에 기반한 정적 IP 주소를 부여한다.- DNS 조회 항목을
/etc/hosts.dnsmasq
에 추가한다. - 다음 명령어로
dnsmasq
서비스를 재시작한다:sudo service dnsmasq restart
- 웹서버 자체는
sudo ifdown eth0
과sudo ifup eth0
명령어를 사용한다. - 마지막으로, 또다른 라즈베리 파이 클라이언트에서 DNS 이름을 사용해서 서버를 핑(ping)하거나 홈페이지를 다시 볼 수 있다.
숙제
자기주도 학습을 통해서 어떻게 반복 DNS 조회가 인터넷에 작동하는지 연구한다. 다음 DNS 서버가 무엇이며 수행하는 역할이 무엇인지 알아보라.
- 로컬 DNS 서버 (Local DNS Server)
- 루트 DNS 서버 (Root DNS Server)
- 최상위 도메인 DNS 서버 (Top Level Domain DNS Server)
- 인증 DNS 서버 (Authoritative DNS Server)
DNS 쿼리가 상기 모든 서버 사이를 떻게 통과하는지 100 단어 글로 작성하시요.