컴퓨터 네트워킹(Networking)
동적 호스트 구성 프로토콜
이번 학습단원에서는 라즈베리 파이를 사용해서 동적 호스트 구성 프로토콜을 독립된 별도 네트워크 위에 구축하는 실습을 시연한다.
학습 목표
- 동적 호스트 구성 프로토콜(Dynamic Host Configuration Protocol, DHCP)이 무엇인지 이해한다.
- 전반적인 컴퓨터 네트워크 구조에서 DHCP가 수행하는 역할을 알게 된다.
들어가며
지금까지 /etc/network/interfaces
파일을 반복적으로 변경하는 것은 시간이 많이 소요되고 고된 노동임이 분명하다. 네트워크 위에 모든 컴퓨터에 대해서 정적 IP 주소(static IP address)를 부여하는 것은 단점이 많다. 지금도 많지만 더 많은 컴퓨터를 네트워크에 추가할 때 무슨 일이 발생할지 고려해보라.
- 사용자가 수작업으로 IP 주소를 할당해야 한다.
- 어떤 컴퓨터도 동일한 주소를 부여받지 않도록 확실히 해야 한다.
- 모든 컴퓨터에 있는 환경설정 파일을 편집하는 것은 시간이 많이 소요된다.
- 노트북 같은 모바일 디바이스에는 이상적이지 않다. 왜냐하면 자주 네트워크에 붙었다 떨어져 나가기 때문이다.
어떻게 하면 좀더 쉽게할 수 있을까요?
학습후 얻는 것.
모든 학생이 수행할 수 있는 것
- 컴퓨터 네트워크에서 DHCP에 대한 필요성을 이해한다.
- DHCP 서버를 사용해서 라즈베리 파이에 IP 주소를 부여한다.
대부분 학생이 수행할 수 있는 것
DHCP 서버 내부 로직에 대해서 이해한다.
학습 정리
- DHCP 서비스가 수행되는 논리적 프로세스를 토의한다.
- 라즈베리 파이 한대를 DHCP 서버로 설정한다.
- 서버로부터 다른 라즈베리 파이를 사용해서 IP 주소를 얻어온다.
- 네트워크를 테스트한다.
학습에 필요한 것
수업 대부분에 짝을 이뤄 학생들이 작업을 수행하도록 권장한다. 이더넷 허브 혹은 스위치는 완전히 결리되어 독립된 상태로 두어야 되며, 어떤 이더넷 케이블도 학교 주 네트워크에 연결되어서는 안된다.
- 짝을 이룬 학생 두명마다 라즈베리 파이 1대
- 짝마다 이더넷 케이블 1개
- 짝마다 라즈비언 운영체제가 설치된 NOOBS SD 카드 1개
- 짝마다 라즈베리 파이에 연결된 마우스와 키보드
- 짝마다 라즈베리 파이에 연결된 모니터
- 모든 라즈베리 파이를 연결하는데 충분한 포트를 가진 이더넷 허브 혹은 스위치
- 숫자 선택 카드 한벌 (시작 언플러그드 활동)
- 종이, 연필 혹은 볼펜 (시작 언플러그드 활동)
들어가며
먼저 컴퓨터 서버(server) 개념을 점검한다. 서버는 본질적으로 컴퓨터로, 주요 목적이 서비스를 제공하는 것이다. 예를 들어, 웹서버(web server)는 인터넷을 통해서 웹페이지, 이미지, 파일 전송 서비스를 제공한다. 마인크래프트 서버는 3D 세상을 간직한 서비스를 제공한다. 3D 세상에는 무슨 블록 어디에 위치하는지를 저장되어 있으며, 플레이어가 서로 만날 수도 있게 한다. 서버는 컴퓨터로 특정 작업(하지만, 한가지 이상에 작업을 수행하기도 한다)을 수행하도록 전용으로 구축되었다.
서버를 사용하고자 하는 컴퓨터 혹은 응용프로그램을 클라이언트(client)라고 부르는데 이유는 서버에 고객과 같기 때문이다. 웹브라우져를 종종 웹클라이언트(web client)라고 부르는데 이유는 웹서버에 고객처럼 동작하기 때문이다. 아마도 동일한 사유로 게임 클라이언트(game client)로 마인크래프트 사본을 부르는 것을 들어봤을 것이다.
만약 본인 네트워크에 IP 주소 할당하고, 누가 무슨 주소를 갖는지 기억하고 관리하는 서버를 갖는다면 정말 멋지지 않을까?
이것이 정확하게 DHCP가 사용되는 이유가 된다. DHCP는 동적 호스트 구성 프로토콜(Dynamic Host Configuration Protocol)을 나타낸다: 동적(Dynamic) 의미는 항상 바뀐다는 것이고, 호스트(Host)는 컴퓨터를 지칭하는 또다른 단어, 구성(Configuration)은 네트워크 환경을 설정, 프로토콜(Protocol)은 규칙의 집합으로 무언가 수행하는 방법을 정의한다.
시작 언플러그드 활동
언플러그드 활동을 통해서 DHCP 서비스 논리적 전개과정을 사전에 익히는 것이 매우 좋다.
학생 한명을 DHCP 서버로 지명해서 시작한다; 서버 학생은 카드 한벌, 종이, 연필/볼펜을 갖는다. 이제 나머지 학생들이 네트워크 위에 동적 호스트/클라이언트(항상 변화하는 컴퓨터) 역할을 수행한다.
DHCP 서버는 준수되어야 하는 규칙 집합을 갖고 있다; 즉, DHCP 프로토콜 일부다. 이제 호스트/클라이언트 중 한명이 네트워크에 연결하고자 한다; 이름이 데이브(Dave)다. 다음이 서버와 호스트/클라이언트 사이 오고가는 대화가 된다:
- 호스트/클라이언트 : “안녕, 난 데이브야, 거기 DHCP 서버 있남?”
- DHCP : “웅 나 여기 있어, 데이브. 너에게 주소 X를 부여할 수 있어.”
- 호스트/클라이언트 : “DHCP 서버야, 내가 주소 X를 갖을 수 있게 해줘, 부탁이야”
- DHCP : “데이브, 여기 주소 X가 있어. 12시간 동안 갖고서 사용할 수 있어.”
DHCP 서버가 주소 카드를 데이브에게 건네주고, 종이위에 데이브 이름, 건네준 주소, 건네준 시간, 그리고 임대 시간(12시간)을 적는다. 건네준 시간은 임대 기간을 추적하는데 사용된다.
잠시 멈춰서, 만약 예상치 못한 대화부분이 있는지 생각해보자. 컴퓨터가 네트워크에 연결할 때, 가용한 DHCP 서버가 있는지 알길이 없다. 그래서 DHCP 서버가 있는지 탐색하는 방송신호를 전체 네트워크에 내보낸다. 만약 가용한 서버가 있다면, 주소를 제공할 호스트/클라이언트에 응답한다; 그리고 나면, 호스트/클라이언트가 공식적으로 주소를 요청한다. 예상하지 못한 부분은 아마도 주소가 임대시간, 이 경우에 12시간으로 주어진 부분이 된다. 왜 그런지 생각해보고 아래를 계속 진행해 나간다.
이제 데이브가 네트워크를 떠나 연결을 종료한다고 가정하자.
다음이 서버와 호스트/클라이언트 사이 오고가는 대화가 된다:
- 호스트/클라이언트 : “DHCP 서버, 나 데이브야. IP주소를 반납하려고해”
- DHCP : “고마워 데이브, 잘가.”
데이브는 본인이 갖고 있던 주소 카드를 DHCP 서버에 돌려준다. DHCP 전달받은 카드를 보관함에 넣고 종이 명단에서 데이브 이름을 삭제한다. 이제 네트워크 연결을 시도하는 다른 컴퓨터/호스트에게 주소카드를 줄 수 있다.
이제 만약 데이브가 매끄럽게 끝내지 못한다면 무엇이 발생할지 생각해보자. 전력선이 갑자기 끊어져 나가서 DHCP 서버에 주소를 깔끔하게 돌려주지 못하게 되었다; 혹은 아마도 주소를 가지고 도망치기로 결정했다. 그러면 무슨 일이 발생할까? DHCP는 동일한 주소를 두번 할당하지 못한다. 그러면 그 해당 주소는 영원히 잊혀질까?
여기가 임대시간(lease time)이 나오는 시점이다! 주소는 잊혀진 상태가 될 것이지만, 단지 임대시간이 종료될 때까지만이다. 12시간이 지난 뒤에 다음과 같이 진행될 것이다.
- 호스트/클라이언트 : “안녕, 난 프레드야, 거기 DHCP 서버 있남?”
- DHCP : “웅 나 여기 있어, 프레드. 데이브로부터 마지막 소식을 들은 뒤로 12시간이 지났어. 그래서, 너에게 데이브가 사용하던 주소 X를 부여할 수 있어.”
- 호스트/클라이언트 : “DHCP 서버야, 내가 주소 X를 갖을 수 있게 해줘, 부탁이야”
- DHCP : “프레드, 여기 주소 X가 있어. 12시간 동안 갖고서 사용할 수 있어.”
DHCP 서버는 새로운 카드에 주소를 적어 프레드에게 건네주고, 데이브 이름을 명단에서 지워서 프레드로 교체한다.
이 방식이 이런 유형의 문제를 처리하는 방식이다; 모든 주소는 주소에 시간 제한을 두고 건네준다. 그래서 호스트가 망가지거나, 갑자기 네트워크 연결이 끊어질 때, DHCP 서버는 임대기간이 만료되면 천천히 해당 주소를 다시 가져온다.
상기 대화에 또다른 버젼은 다음과 같다:
- 호스트/클라이언트 : “DHCP 서버 난 데이브야, 12시간이 경과해서, 주소 X를 다시 사용할 수 있게 해줄 수 있어?”
- DHCP : “데이브, 이제 추가로 12시간 더 주소를 사용할 수 있어.”
그리고 나서, DHCP는 종이 목록에 데이브에게 건네준 주소 시간을 갱신한다. 모든 DHCP 서버가 12시간을 임대기간으로 사용하지는 않는다; 해당 서버에 따라서 더 길수도, 더 짧을 수도 있다. 이제 만약 프레드가 네트워크에 연결하고자 한다면, 다른 주소가 배정될 것이다.
주요 핵심 활동
먼저 DHCP 서버로 사용할 라즈베리 파이 한대를 고른다. 나중에 있을지도 모른 혼란을 피하기 위해서 스티커를 붙여 놓거나, 좀더 눈에 잘 띄는 곳으로 옮겨 놓는다. 서버로 사용될 라즈베리 파이에 소프트웨어를 몇개 설치할 것이다. 그래서, 먼저 인터넷 연결이 되도록 또다른 LAN선을 연결한다.
서버 전용 라즈베리 파이
주의 단지 한 라즈베리 파이만 DHCP 서버로 사용될 것이기 때문에, 이번 활동 부분은 한명을 제외한 모든 학생이 지켜보는 것으로 진행되는 것이 가장 좋다. 한대 이상 DHCP 서버는 필요하지 않는데, 사실 한대 이상이 되면 문제를 야기할 수 있다!
터미널을 열고 다음 명령어를 명령 프롬프트에 입력한다.
sudo apt-get update
sudo apt-get install dnsmasq
상기 작업이 완료되면, 인터넷에 연결된 LAN 케이블을 뽑아낸다. 그리고 실습 허브/스위치로 되돌아간다.
관례로, 대부분 DHCP 서버는 정적 IP 주소를 갖는데, 네트워크 IP 주소 자리에서 첫번째 혹은 가장 낮은 숫자가 된다. 예를 들어, 대부분 사설 네트워크(private network)는 192.168.0.X
같은 로컬 IP 주소 공간을 사용한다. 여기서 X
는 각 디바이스에 부여되는 숫자가 된다. 이 관례를 따라서, DHCP 서버는 192.168.0.1
정적 IP 주소를 갖는다; 마지막에 .1
이 되는 것에 주목한다. 그리고 나면, DHCP 서버가 서비스를 제공할 수 있는 IP 주소는 192.168.0.2
, .3
, .4
등등 시작해서 .254
까지 범위까지 된다.
그래서, 상기 관례에 따라 라즈베리 파이가 정적 IP 주소를 갖도록 DHCP 서버를 만들어보자. 서버 환경설정을 위해서 네트워크 인터페이스 파일을 다시 편집해야 한다. 다음 명령어를 타이핑한다:
sudo nano /etc/network/interfaces
인터페이스(interface) 파일에서 eth0
는 라즈베리 파이 이더넷 포트를 나태내고, wlan0
는 만약 사용한다면 무선 동글(wireless dongle)을 각각 나타낸다. 다음 행을 찾아보자.
iface eth0 inet dhcp
상기 줄은 라즈베리 파이에게 인터페이스 eth0
에 대해 DHCP 서버로부터 IP 주소를 얻어오게 한다. 그래서 본질적으로 상기 명령줄은 라즈베리 파이를 DHCP 클라이언트를 만든다. 하지만, 원하는 바는 DHCP 서버로 만드는 것이여서 이번 줄을 비활성화 시킨다. #
해쉬 문자를 시작 줄 맨앞에 놓고, 다음 네줄을 추가하면 정적 IP 주소 환경설정을 마치게 된다.
# iface eth0 inet dhcp
auto eth0
iface eth0 inet static
address 192.168.0.1
netmask 255.255.255.0
나노 편집기에서 저장하기 위해서 Ctrl+O
를 누르고 Enter
를 입력하고, Ctrl+X
를 눌러 빠져나온다. 이제 다음 명령어를 명령 프롬프트에 입력해서 라즈베리 파이 네트워킹 서비스를 재시작한다.
sudo service networking restart
이제 라즈베리 파이는 항상 IP 주소로 192.168.0.1
을 갖게 된다. ifconfig
명령어를 입력해서 다시 확인할 수 있다; inet addr
바로 다음에 두번째 줄에 IP 주소가 보여야 한다.
다음으로 앞서 설치한 DHCP 서버 소프트웨어, dnsmasq
환경설정을 한다. 명시적으로 dnsmasq
서비스에 대한 환경설정을 명세할 것이다. 그래서, 디폴트 환경설정 파일(default config file)을 백업하고나서 한곳에 저장한다. 이를 위해 다음 명령어를 입력한다.
cd /etc
sudo mv dnsmasq.conf dnsmasq.default
sudo nano dnsmasq.conf
아무 것도 없는 빈 파일을 편집해야 한다. 다음 코드를 복사해서 나노편집기에 붙여 넣는다.
interface=eth0
dhcp-range=192.168.0.2,192.168.0.254,255.255.255.0,12h
첫번째 줄은 dnsmasq
에게 라즈베리 파이 이더넷 포트에 DHCP 요청을 감지하게 한다. 두번째 줄은 나눠줄 IP 주소 범위를 명세한다; 두번째 줄의 맨 끝에 12h
가 임대기간을 명세하는 것에 주목한다.
나노 편집기에서 저장하기 위해서 Ctrl+O
를 누르고 Enter
를 입력하고, Ctrl+X
를 눌러 빠져나온다. 서버를 활성화하기 전에, DHCP 라즈베리 파이 서버가 실습 허브/스위치에 연결된 유일한 디바이스인지 확인한다; 다른 모든 이더넷 연결을 허브/스위치에서 뽑아낸다. 다음 명령어를 입력하고 dnsmasq
서비스를 다시 시작한다.
sudo service dnsmasq restart
DHCP 서비스가 이제 활성화되고 클라이언트 호스트 컴퓨터로부터 요청을 받을 준비가 되었다.
남아있는 모든 라즈베리 파이 클라이언트
남아있는 라즈베리 파이를 허브/스위치에 다시 연결하기 전에, /etc/network/interfaces
파일 환경설정이 잘 되어 있어서 DHCP 서버에서 IP 주소를 얻어올 수 있는지 확인한다. 다음 명령어를 타이핑한다.
sudo nano /etc/network/interfaces
정적 IP 주소로 지정되지 않도록 확실히 하고, iface eth0 inet dhcp
행이 인터페이스 파일에 있는지 점검한다; 다음이 잘된 사례다.
iface eth0 inet dhcp
# auto eth0
# iface eth0 inet static
# address 192.168.0.1
# netmask 255.255.255.0
나노 편집기에서 저장하기 위해서 Ctrl+O
를 누르고 Enter
를 입력하고, Ctrl+X
를 눌러 빠져나온다.
sudo service networking restart
명령어로 클라이언트 네트워크 서비스를 재시작한다; 그리고 나면 다음 단계로 나갈 수 있어 라즈베리파이 이더넷 LAN 선을 허브/스위치에 다시 연결한다. DHCP 서버에서 즉시 IP 주소를 얻어와야만 한다.
다시 ifconfig
명령어를 사용해서 다시 확인한다; 배포된 IP 주소는 서버가 지정한 IP 주소 범위에서 무작위로 선정된다.
네트워크 테스트
모두가 IP 주소를 갖게되면, 네트워크가 예상한대로 동작해야 한다. 채팅 프로그램으로 혹은 마인크래프트를 함께 즐기면서 네트워크를 테스트한다. 모든 학생이 DHCP 서버에 ping 192.168.0.1
명령어로 핑(ping)을 보낼 수 있고, ping 192.168.0.X
명령어로 서로 핑(ping)을 보낼 수 있다. (여기서 X
는 IP 주소 네번째 숫자 부분이다) 서버도 또한 클라이언트에 핑을 보낼 수 있어야 한다.
한단계 더 앞으로
만약 한단계 더 나아가서 DHCP 서버와 클라이언트 사이 통신을 관찰하면, 다음 명령어가 라즈베리 파이 클라이언트에도 사용될 수 있다.
먼저, 이더넷 인터페이스 연결을 끊고, IP 주소를 DHCP 서버에 돌려주기 위해서 다음 명령어를 타이핑한다.
sudo ifdown eth0
다음과 유사한 출력결과가 보여야 된다. DHCPRELEASE
행에 주목한다; 이것이 서버에 돌려주는 IP 주소다.
Listening on LPF/eth0/b8:27:eb:aa:bb:cc
Sending on LPF/eth0/b8:27:eb:aa:bb:cc
Sending on Socket/fallback
DHCPRELEASE on eth0 to 192.168.0.1 port 67
다음으로, 다음 명령어를 사용해서 이더넷 인터페이스를 시작해서 DHCP 서버에서 IP 주소를 가져온다.
sudo ifup eth0
다음과 유사한 출력결과가 보여야 된다. DHCPDISCOVER
, DHCPREQUEST
, DHCPOFFER
, DHCPACK
행에 주목한다. 시작 언플러그드 활동에서 주고 받은 대화내용이 어떻게 상응하는지 살펴보라.
Listening on LPF/eth0/b8:27:eb:aa:bb:cc
Sending on LPF/eth0/b8:27:eb:aa:bb:cc
Sending on Socket/fallback
DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 7
DHCPREQUEST on eth0 to 255.255.255.255 port 67
DHCPOFFER from 192.168.0.1
DHCPACK from 192.168.0.1
bound to 192.168.0.X -- renewal in 40000 seconds.
정상 실습과정에서 이러한 명령어를 사용할 필요는 없는데 이유는 자동적으로 라즈베리 파이가 시작될 때, 끝날 때, 다른 디바이스에 연뎔된 이더넷 포트를 가질 때, 동일한 것이 일어나기 때문이다.
모든 학생이 모인 총회
이제 학생들이 시작 언플러그드 활동과 핵심 실습학습 내용에 유사성을 토의하도록 한다.
다뤄져야 되는 한 질문은 DHCP 서버가 대화하려는 각 라즈베리 파이 컴퓨터를 식별하는 방법이다. 시작 언플러그드 활동에서 IP 주소를 클라이언트 컴퓨터에 부여하기 전에, 클라이언트 호스트 컴퓨터가 “난 데이브”라고 말했다. 그러면 DHCP 서버는 부여한 IP 주소를 종이 위에 데이브라고 썼다. 실제 컴퓨터에 대해 이것과 대등한 것이 무엇일가?
정답은 MAC 주소다 (종종 물리 주소(Physical Address)라고 부른다.) MAC는 Media Access Control(매체 접근 제어)의 두문약어다; 유일한 ID로 제조회사가 이더넷 디바이스 하드웨어에 새겨 넣는다. 와이파이 블루투스를 사용하는 디바이스를 포함해서 모든 네트워크 디바이스는 MAC 주소를 갖는다. MAC 주소는 6 바이트 길이를 갖고, 종종 콜론(:) 혹은 대쉬(-)으로 구별되는 16진수 6개 숫자로 표현된다. 예를 들어, 01:23:45:67:89:ab
.
라즈베리 파이 MAC 주소는 ifconfig
명령어를 사용해서 확인할 수 있다; eth0
아래 HWaddr
(hardware address) 다음에 첫번째 줄이된다. MAC 주소는 b8:27:eb:aa:bb:cc
같다. 라즈베리 파이 MAC 주소는 항상 b8:27:eb
으로 시작된다. 그래서, 누가 어느 IP 주소를 갖는지 기록하는데 DHCP 서버가 저장하는 것은 클라이언트 호스트 컴퓨터 MAC 주소가 된다.
ifup
과 ifdown
명령 결과를 다른 관점에서 살펴보자!
숙제
내장된 DHCP를 갖는 디바이스를 학교나 집에서 찾는 공개 공모전이다. 왜 해당 장소에서 DHCP 서버가 사용되는 이유에 관해 100 단어로 작성하라.