DHCP
1. 개요
'''D'''ynamic '''H'''ost '''C'''onfiguration '''P'''rotocol
직역하자면 '동적 호스트 설정 프로토콜(통신규약)'이다.
IP 라우터는 인터페이스 및 호스트에 IP 주소를 할당해 줄 수 있다. 예전에는 각 PC마다 고정 IP 설정[1] 을 도입하여 사용 하거나, RFC 903에 정의 된 것 처럼 RARP를 도입하여 동적으로 적절한 IP 주소를 취득할 수 있게 구현하여 사용하였다. 고정 IP 설정의 단점은 무엇보다도 IP 설정에 실수가 있는 경우 인터넷이 안된다. 예를 들어 실수로 오타가 날 경우(예를들어 IP 주소가 10.10.10.2인데 오타가 나서 10.10.1.2라고 입력 된다거나)도 있고, 실수로 다른 컴퓨터와 동일한 IP를 할당하여 충돌나는 경우도 존재한다. 그외에도 사용하지 않고 꺼놓은 컴퓨터에도 모두 IP를 하나씩 할당해야 하다 보니 IP가 모자라는 문제도 발생한다. 후자로 사용한 RARP의 단점은 데이터 링크층에서 작동되었어야 했으므로 하드웨어로서 구현이 어려웠으며, 서버가 각각의 네트워크에 존재해야만 한다는 단점이 있어 추후 DHCP가 발표되며 사장되었다.
이런 문제를 해결하기 위해서 IP를 필요로 하는 컴퓨터에게 자동으로 할당해서 사용할 수 있도록 해주고, 사용하지 않으면 반환받아 다른 컴퓨터가 사용할 수 있도록 해주는 것이 DHCP이다. 이는 보통 라우터 장비에 해당 기능이 탑재되지만, 별도의 서버에 DHCP 서비스를 설정하여 사용할 수도 있다. 라우터는 단지 게이트웨이 역할만 하고, DHCP 서버는 별도로 두는 구성도 많이 사용된다.
2. 임대(Lease), 갱신(Renewal), 반환(Release)
DHCP 서버의 임대, 갱신, 반환 과정에 대해 서술한다.
2.1. 임대(Lease)
DHCP의 경우 IP를 할당해 주는 것을 '''임대(Lease)'''라고 한다. 이 임대에는 임대 기간이 있는데, 말 그대로 해당 IP 주소를 사용할 수 있는 기간을 말한다. 즉, '''임대 기간이 끝나면 해당 IP 주소는 DHCP 주소 풀로 반환이 된다는 것'''이다. 임대 기간은 기본적으로 8일이며, 장소에 따라서 적당한 값을 찾아서 설정하면 된다. 유동인구가 많은 가게 등지에서 임대 기간을 8일로 두게 된다면 순식간에 주소 풀이 동날 것이고, 더 이상 IP 주소를 할당할 수 없게 되어버린다. 이런 유동인구가 많은 지역에서는 임대 기간을 2~3시간 정도로 짧게 설정하는 편이 좋다. 가정이나 기업 등에서는 기본값을 8일~30일 등으로 길게 잡는다. 아이피타임 공유기의 경우 기본적으로 임대 기간이 7200초(2시간)이다.
2.1.1. 임대의 상세한 동작
DHCP로 임대를 생성할 경우 4가지 과정을 통해서 IP 주소를 할당하게 된다.
'''1. DHCP Discover.'''
IP 주소가 할당되지 않은 클라이언트는 MAC 주소를 기반으로 IP 주소를 받아오기 위해 로컬 네트워크에 Discover 패킷을 Broadcast한다. 이때, Broadcast로 뿌려진 패킷은 해당 네트워크 내의 모든 호스트에게 날아가게 된다. 이 Discover 패킷에는 IP 주소가 필요한 호스트의 MAC 주소가 담겨져 있어서 DHCP 서버가 응답할 때 패킷을 수신할 수 있게 된다. 호스트들이 패킷을 받고 나서, DHCP 서버가 Discover 패킷을 받게 되면 2단계로 넘어간다. 물론 이 때, 다른 호스트들은 '어? 내 패킷이 아니네?' 하고 패킷을 폐기한다.
'''2. DHCP Offer.'''DHCP 서버가 Discover 패킷을 받게 되면, DHCP 서버는 Offer 패킷을 Broadcast한다. 이때, MAC 주소에 아까 Discover 패킷을 보낸 호스트의 MAC 주소를 적어서 보낸다. 마찬가지로 Broadcast이기 때문에 해당 네트워크의 호스트 전체에 패킷이 날아가지만 역시 Discover를 보낸 호스트 이외의 다른 호스트는 패킷을 전부 폐기한다. Discover를 보낸 호스트가 Offer 패킷을 받으면 3단계로 넘어간다.
'''3. DHCP Request.'''해당 호스트는 Offer를 받았으면 해당 네트워크에는 DHCP 서버가 있다고 판단, Request 패킷을 Broadcast한다. Request 패킷은 말 그대로 IP 내놔. 이 역시 Broadcast이기 때문에 해당 네트워크의 호스트 전체에게 날아가고, DHCP 서버 이외의 다른 호스트는 패킷을 폐기한다. DHCP 서버가 Request 패킷을 받으면 4단계로 진행한다.
'''4. DHCP ACK.'''DHCP 서버는 Request 패킷을 받으면 자신의 IP 임대 풀에서 할당 가능한 IP 주소를 찾는다.[2] 예를 들어 게이트웨이와 DHCP가 모두 192.168.0.1일 경우 192.168.0.1을 제외한 0.2~0.254까지의 임대 풀을 가지고 있다. 이 임대 풀에서 가장 앞에 있는 IP 주소부터 할당하게 되는데, 사용 중이 아닌 경우엔 해당 IP 주소를 할당을 하게 된다. 여기서는 192.168.0.2를 할당한다고 가정 하면, "Your (Client) IP Address: 192.168.0.2 (192.168.0.2)" 이런 패킷을 날리게 된다. 역시 Broadcast로 전송되며, 호스트가 이 패킷을 정상적으로 받았다면 IP 주소가 할당된다.
이 과정을 줄여서 흔히 '''DORA'''라고 부른다.참고로 이렇게 4단계로 되어 있는 이유는, 클라이언트에 연결된 네트워크에 DHCP 서버가 여러 개일 수도 있기 때문이다. 즉, 디스커버를 한번만 날려도, 오퍼는 여러개 날아올 수 있다. 그중에 하나를 골라서 정확히 리퀘스트를 던지면, 그제서야 최종적으로 Ack 처리하며 IP를 사용 할 수 있게 되는 것이다.
이 편리해 보이는 DHCP 서버에도 약간의 문제가 있는데, DHCP 옵션을 설정하지 않을 경우 IP 주소와 서브넷 마스크만 할당하게 된다. 이러면 당연히 통신이 안 되는게 당연지사. 그래서 DHCP 옵션에는 기본 게이트웨이 주소, DNS 서버 주소 등이 들어가게 된다.
하지만 위의 문제보다 약간 심각한 문제가 하나 더 있다. 바로 고정 IP 주소도 사용하는 네트워크일 경우이다. DHCP 서버는 단지 자신의 임대 가능한 IP 주소 풀에서 안 쓰는 IP를 하나 주는 것이지, 그 IP가 실제 사용중인지는 모른다. 물론 자신이 할당했다면 기억하지만. 즉, 게이트웨이이자 DHCP 서버가 192.168.0.1이고, 192.168.0.2부터 192.168.0.10까지는 고정 IP로 사용중인데 주소 풀이 192.168.0.2부터 시작한다면 DHCP 서버가 있어도 IP 주소가 충돌하기 때문에 클라이언트에 IP가 할당되지 않는다. 이런 경우, 주소 풀을 옮겨 주면 해결이 된다. 또는 DHCP 예약 기능을 이용하거나해서 아예 임대기간을 -1로 지정해버리면 거의 무기한에 가깝게 임대가 되기에 DHCP를 쓰면서도 고정 IP 효과를 낼 수도 있다. 이경우 클라이언트마다 일일이 고정 IP를 입력해주지 않아도 된다는 장점도 있다.
2.2. 갱신(Renewal)
임대 기간이 끝나면 IP 주소를 반환하게 된다. 반환에 대한 자세한 정보는 아래 반환 문단에서 확인하자. 만약 임대 기간이 1시간이라면, 1시간마다 IP 주소를 반환하고 다시 임대하면 불필요한 브로드캐스트 트래픽을 발생시키게 된다. 이것이 전혀 효율적이지 않기 때문에 DHCP에는 임대 갱신(Lease Renewal)이라는 것이 있다.
이 임대 갱신은 두 차례 시도를 하게 되는데, 첫 시도는 임대 기간이 50% 남았을 때 시도된다. 이 때, 갱신에 성공하면 갱신된 시간으로 부터 임대 기간이 다시 차게 된다. 하지만 클라이언트의 전원이 꺼져 있다던가, 아니면 모종의 이유(DHCP 서버가 점검 중이었다거나)로 갱신에 실패하게 된다면, 한번의 기회를 더 준다. 87.5%의 시간이 지났을 때 다시 갱신을 시도한다. 이 때, 갱신에 성공한다면 그 시점으로부터 임대 기간이 다시 차게 된다.
간단하계 예시를 들어보자면, 임대 기간이 10시간이라고 가정하고, 00시 00분에 임대가 생성됐다고 하자. 이로부터 50%가 지난 시점인 05시 00분에 1차적으로 갱신을 시도하게 되고, 이때 성공한다면 임대 종료 시각은 15시 00분이다. 1차 갱신에 실패한다면, 임대가 생성된 시간으로 부터 87.5%가 지난 시점인 08시 45분에 2차 갱신을 시도한다. 이때 성공한다면, 18시 45분이 임대 종료 시점이 되는 것이다. 만약 2차마저 실패했다면, 임대 기간이 끝나는 시점에 주소를 반환하고 임대 생성부터 다시 하게 된다. 즉, 클라이언트가 IP 주소를 계속 사용 중이라면, 해당 IP 주소를 계속 사용할 수 있도록 임대 기간을 계속 늘려 주고, 사용하지 않는다면 주소를 반환하여 다른 클라이언트가 사용할 수 있도록 해 주는 것이 바로 임대와 갱신이다.
2.2.1. 갱신의 상세한 동작
임대 갱신의 경우 Discover, Offer 과정을 제외한 Request, ACK 과정만을 DHCP 서버와 1:1로 Unicast 통신한다. 이미 IP 주소가 있는데다가, DHCP 서버 주소를 알고 있기 때문에 굳이 Broadcast로 네트워크 상에 쓸데없는 트래픽을 보낼 이유가 없기 때문이다.
갱신 과정은 다음과 같다.
'''1. DHCP Request'''
DHCP 서버에 갱신을 요청하는 Request 패킷을 Unicast로 보낸다. DHCP 서버가 이 패킷을 받으면, 2단계로 넘어간다.
'''2. DHCP ACK'''DHCP 서버에서 Request를 요청한 클라이언트에게 ACK 패킷을 Unicast로 보낸다. 이 패킷에는 갱신에 대한 정보가 담겨 있다.
갱신 과정은 임대 생성에 비해서 간단하다. 그냥 말 그대로 기간만 좀 늘려달라고 부탁하는 것이기 때문이다.2.3. 반환(Release)
임대 기간이 끝났거나, IP 주소를 더 이상 사용하지 않는다면 DHCP 서버에 IP 주소를 반환하게 되는데, 이것을 반환(Release)이라고 한다. DHCP 서버와 클라이언트 모두 임대 기간에 대한 정보를 가지고 있기 때문에, 임대 기간이 끝났는데 클라이언트가 연결되지 않았더라도 해당 주소를 사용 가능하도록 주소 풀로 보낸다. 흔히 인터넷이 안 된다거나, 랜선이랑 다 제대로 꽂혀 있는데 인터넷이 안 된다거나, ipconfig을 쳤는데 IP 주소가 169.254.x.x, 서브넷 마스크가 255.255.0.0으로 나온다면 가장 먼저 해 보라고 하는 것이 명령 프롬프트에 ipconfig /release를 입력하고, ipconfig /renew를 입력하라고 하는 것인데, ipconfig /release는 DHCP 서버에 IP 주소를 반환하는 명령어고, ipconfig /renew는 설정된 IP 주소가 없다면 임대 생성을, 이미 IP 주소가 있다면 임대 갱신을 해 주는 명령어이다. 이렇게 한다면 다 멀쩡하다는 전제 하에 IP 주소를 다시 할당받을 수 있도록 유도해 주는 것이다. 반환 과정이 없다면, 고정 IP를 사용하는 것보다 단점이 더 많은 망한 프로토콜이 되기 때문에 반환 과정은 DHCP에 있어서 임대 생성/갱신보다 중요하다고 볼 수 있겠다.
3. 역할별 분류
3.1. DHCP Server
IP를 보유하고, 원하는 가입자에게 IP를 분배해주는 역할을 한다.
KT나 LG U+ 같은 경우 중앙집중형 관리 정책을 사용하며, 다수의 가입자에 대해서 인증 기능을 처리함과 동시에 IP를 할당하는 크고 아름다운 DHCP Server를 운용하고 있다. KT의 경우 각 지사와 전화국에서 관리하고 있으며, 보통 해당 지사 관할지역이나 읍.면.동 단위로 IP대역 셋팅이 이루어진다. SK와 LG는 아파트의 경우 단지별로 셋팅이 되고, 아파트 단지가 크면 각 아파트 동 단위로 분할셋팅이 되기도 한다.
인터넷 공유기에도 DHCP 서버가 탑재되어 있으며, 각각의 PC에 사설 IP를 할당한다.
일반 기업의 경우 인터넷 회선이 연결된 게이트웨이 장비에 DHCP Server를 활성화 시켜서, 각 업무용 PC에 IP를 받을 수 있도록 세팅하여 사용한다. 만약 해당기업에서 공인 IP를 다수 보유하고 있는 경우라면, 공인 IP만을 이용해서 DHCP 서버를 세팅할 수 있다. 그렇지 않은 경우라면, 인터넷 공유기와 동일하게 사설 IP를 할당하고 NAT 기능을 이용해서 외부로 연결하게 된다. 이런 경우 NAT 내부의 개인 PC는 외부에서 보이지 않지만, 웹 서버나 메일 서버등은 외부에서 접속할 수 있도록 해야 하므로, 회사 네트워크 구성을 신경써서 만들어줘야 한다.
3.2. DHCP Client
PC, 스마트폰, 스마트패드 등 각종 최종 단말 장치들은 모두 DHCP Client가 탑재되어 있어서, 서버로부터 IP를 할당받아 사용한다.
인터넷 공유기에도 DHCP Client가 탑재되어 있는데, 자신이 마치 PC인 것처럼 동작하여 공인 IP를 할당받는 용도로 사용한다.
3.3. DHCP Relay Agent
DHCP Relay Agent라는 것이 있는데, 브로드캐스트 패킷은 라우터, 즉 게이트웨이를 넘어가지 못한다. 대부분의 가정의 경우 그냥 공유기 아래에 물려 있으니 상관이 없지만, 기업 레벨에서는 DHCP 서버가 라우터 너머에 있는 경우가 종종 있다. 하지만 브로드캐스트 패킷은 라우터를 넘어가지 못하는데 위에서 봤다시피 IP 할당 과정 4단계가 전부 브로드캐스트로 이루어진다. 이런 경우 라우터 단에서 DHCP Relay Agent를 설정해서 DHCP 요청이 라우터로 들어오면, 라우터에서 유니캐스트로 변환하여 DHCP서버로 패킷을 보낸다. DHCP 서버에선 역시 유니캐스트로 라우터에게 보내고 라우터는 브로드캐스트로 뿌린다.
대한민국의 ISP인 KT, LG U+, SKB 등은 DHCP 처리를 모두 중앙집중식 DHCP 서버를 사용하는 구조로 되어 있다. Relay Agent에서 정상적인 가입회선이면 IP를 임대해주고 아니라면 임대를 해주지 않거나 일단 IP를 주고 인증페이지로[3] 리다이렉션을 하거나 아예 IP만 주고 binding table에 기입을 안하는 식으로 통신을 막아버리는일도 한다.
3.4. DHCP snooping
DHCP snooping은 네트워크 스위치에 지나다니는 DHCP 패킷을 감시해서, 어느 가입자가 어느 IP를 할당받았는지에 대한 binding table을 관리하는 기능이다. DHCP 서버가 아는 개발 네트워크 장비 입장에서 동작하며, 일반적으로 DHCP relay와 연동되어 동작한다.
이렇게 DHCP snooping이 동작하여 binding table이 관리되면, 다음과 같은 동작에 이용될 수 있다.
- 하단에 언급되는 DHCP exhaustion attack를 감지하거나 이를 차단하는 용도로 쓸 수 있다.
- 허용되지 않는 가입자가 DHCP로 IP를 획득하려 하는 시도를 찾아내어 차단할 수 있다.
- 가입자가 DHCP를 쓰지 않고 고정 IP를 사용하여 인터넷을 사용하는 경우를 감지/차단할 수 있다.
3.5. DHCP proxy agent
실제 IP를 분배하는 DHCP 서버의 앞단에 설치되며, DHCP relay와 유사하게 DHCP packet을 중계한다. 다만, DHCP relay와는 다르게 DHCP proxy는 client가 보기에는 DHCP server인 것처럼 동작한다.
DHCP proxy를 설치할 경우 실제 DHCP server는 가입자에게는 숨겨지는 효과가 나타나기 때문에, DHCP server를 대상으로 하는 DDoS 공격 등으로 부터 안전해진다는 장점이 있다.
4. DHCP 관련 취약점
4.1. DHCP exhaustion attack
DHCP starvation attack이라고도 한다.
공격자가 계속해서 IP를 요청하는 형태의 공격이다. MAC 주소를 적당히 위조하여 서로 다른 가입자인 것처럼 속여서 IP를 계속 할당 받는 방법으로, DHCP 서버가 관리하는 모든 IP 대역을 공격자가 다 먹어버리는 것이다. 그렇게 되면 다른 가입자들은 IP를 할당받을 수 없으니 인터넷을 사용할 수 없게 된다. 이를 해결하기 위해서 DHCP relay 등과 연동되어 가입자 인증을 처리하고, 추가적인 IP 요구를 차단하는 방식으로 방어한다.
여담으로 IP가 랜덤할당이 아닌 순차할당인 경우, 대역 차단을 회피하기 위해 IP를 수백 번 바꾸는 경우가 있는데, KT가 아닌 SK나 LG 인터넷을 사용한다면 포트나 모뎀 인증이 풀려 인터넷 연결이 차단되는 경우가 종종 발생하기도 하는데, 이런 경우가 DHCP starvation attack으로 인식되어 차단되는 것이다. 다만, IP할당이 순차할당인 경우는 LG가 많고[4] , SK는 보통 랜덤 대역할당이 이루어진다. SK, LG는 DHCP서버에 30~100개 미만의 IP주소를 여유분으로 두는 반면, KT는 500~1000개의 여유분을 두는 편이다.[5] 2020년 12월 말 들어서는 KT도 대부분의 서버가 순차할당 방식으로 전환되었다.
4.2. DHCP man-in-the-middle(MITM) attack
중간에서 공격자가 사설 DHCP 서버를 설치하고, 자신이 공인된 DHCP 서버인 척하며 가입자에게 IP를 할당해 준다. IP를 부여할 때 DNS와 default gateway를 공격자가 관리하는 라우터로 지정해 버리면, 피해자의 모든 트래픽은 해당 라우터를 거쳐서 지나가게 된다. 공격자는 이를 분석하여 암호를 비롯하여 가입자의 중요 정보들을 획득할 수 있게 된다. 또는 허위로 DNS 정보를 주어서 실제 사이트가 아닌 피싱 사이트로 연결되도록 하는 것도 가능하다. 이런 방법을 중간자 공격이라고 부른다.
이것이 아니더라도, 가입자가 실수로 공유기에 회선을 잘못 꼽을 경우에도 공유기의 사설 DHCP 서버가 동작하여 다른 가입자가 잘못된 IP를 부여받고 인터넷이 안되는 경우도 발생한다. 정확하게 인터넷 회선은 WAN 포트에 꼽고, 가입자 PC를 LAN 포트에 꼽아야 하는데 잘못 꼽으면 문제가 된다. 이것은 실수한 가입자가 인터넷이 안 되는 것뿐만 아니라 거기에 연결된 다른 가입자에게도 피해를 주게 된다.
이를 해결하기 위해서는 가입자 포트로부터 DHCP offer나 DHCP ack가 오는 것을 강력하게 차단하여 문제를 해결한다. 또한, DHCP relay와 연동하여 정상적인 DHCP 서버로만 패킷이 가도록 제어하여, 사설 DHCP 서버를 차단한다.
[1] 대표적으로 학교 네트워크. 이쪽은 교육청과 VPN 등으로 연결되며, DHCP 서버 자체가 없어야 정상이다.[2] 엄밀히 말해 DHCP 서버는 Discover 메세지를 수신한 시점에서 IP Pool에서 사용 가능한 IP를 찾는다. Offer부터 Ack에 이르기까지의 모든 메시지에 할당받을 IP Address가 기록되어 있다.[3] 추가 IP에 대한 요금을 요구하는 페이지가 대표적이다[4] LG의 경우 일부 건물에는 한 서버에 /29 크기 대역 하나, 즉 공급 가능한 IP가 고작 8개(...)밖에 안 되는 경우가 있다. 여기서도 양 끝값과 기본 게이트웨이를 제외하면 5개밖에 남지 않는다.[5] 한국인터넷진흥원 홈페이지에서 관리대행자별 IPv4 주소 목록을 보면, KT가 압도적으로 많은 수의 IPv4주소를 보유한 것을 알 수 있다. 국내 할당된 IP 대역의 절반을 KT가 먹고 있는 셈(...)