Tuesday, April 17, 2018

CentOS 7.3 리눅스 네트워크 ] 6.2 DHCP 서버 구성


안녕하세요. 썬구루입니다. 이 게시물에서는 CentOS 7.3을 DHCP 서버로 구성하는 방법에 알아보도록 하겠습니다.

윈도우 서버에서 DHCP 서버를 구성하는 것과 달리 리눅스 서버에 명령과 파일을 사용하여 DHCP 서버를 구성해야 하기 때문에 조금 불편함이 있습니다.

그리고 이미 고객사에 DHCP 서버/클라이언트 구성이 다 되어 있기 때문에 여러분들이 리눅스 서버를 가지고 신규 DHCP 서버를 구성할 수 있을지...

■ VMware Workstation 가상 네트워크 DHCP 서버 비활성화

DHCP는 브로드캐스트를 사용하여 IP 주소를 요청/할당받기 때문에 하나의 네트워크에 2개의 DHCP 서버가 존재해선 안 됩니다. 존재해도 되긴 하나 원하는 서버로부터 IP를 못 받아오죠. 브로드캐스트를 사용하기 때문에 빨리 신호 받고 IP 주소를 할당해 주는 서버가 장땡~! 그래서 DHCP 설치 및 구성 테스트를 하기 위해 VMware Workstation에서 VMnet8 가상 네트워크(가상 스위치)에 설정된 DHCP 서버를 비활성화할 필요가 있습니다.

아래 그림과 같이 VMnet8에 설정된 DHCP 서버 서비스를 비활성화합니다.

VMware Workstation > Edit 메뉴 > Virtual Network Editor > Change Settings 버튼 > VMnet8 > Use local DHCP service to distributed IP address to VMs 체크박스 체크 해지 > OK


■ CentOS 7.3에 DHCP 서버 관련 패키지 설치

CentOS 7.3 리눅스 운영체제를 설치할 때 Server with GUI로 설치하면 DHCP 서버 관련 패키지가 같이 설치되지 않습니다. 그래서 필요할 시 관련 패키지를 설치해줘야 합니다.. CentOS 7.3 Installation DVD ISO 파일을 가상머신에 연결하여 아래같이 설치 DHCP 서버 패키지를 설치합니다.

[root@centos701 ~]# rpm -qa | grep dhcp

dhcp-libs-4.2.5-47.el7.centos.x86_64
dhcp-common-4.2.5-47.el7.centos.x86_64

[root@centos701 ~]#
[root@centos701 ~]# df -h | grep sr0

/dev/sr0             7.8G  7.8G     0 100% /run/media/root/CentOS 7 x86_64

[root@centos701 ~]#
[root@centos701 ~]# cd /run/media/root/CentOS\ 7\ x86_64/Packages/
[root@centos701 Packages]#
[root@centos701 Packages]# ls dhcp*

dhcp-4.2.5-47.el7.centos.x86_64.rpm         dhcp-devel-4.2.5-47.el7.centos.i686.rpm    dhcp-libs-4.2.5-47.el7.centos.i686.rpm
dhcp-common-4.2.5-47.el7.centos.x86_64.rpm  dhcp-devel-4.2.5-47.el7.centos.x86_64.rpm  dhcp-libs-4.2.5-47.el7.centos.x86_64.rpm

[root@centos701 Packages]#
[root@centos701 Packages]# rpm -ivh dhcp-4.2.5-47.el7.centos.x86_64.rpm

경고: dhcp-4.2.5-47.el7.centos.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
준비 중...                         ################################# [100%]
Updating / installing...
   1:dhcp-12:4.2.5-47.el7.centos      ################################# [100%]
[root@centos701 Packages]#
[root@centos701 Packages]# systemctl status dhcpd
● dhcpd.service - DHCPv4 Server Daemon
   Loaded: loaded (/usr/lib/systemd/system/dhcpd.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
     Docs: man:dhcpd(8)
           man:dhcpd.conf(5)

[root@centos701 Packages]#
[root@centos701 Packages]# systemctl enable dhcpd

Created symlink from /etc/systemd/system/multi-user.target.wants/dhcpd.service to /usr/lib/systemd/system/dhcpd.service.

[root@centos701 Packages]#
[root@centos701 Packages]# systemctl status dhcpd

● dhcpd.service - DHCPv4 Server Daemon
   Loaded: loaded (/usr/lib/systemd/system/dhcpd.service; enabled; vendor preset: disabled)
   Active: inactive (dead)
     Docs: man:dhcpd(8)
           man:dhcpd.conf(5)

[root@centos701 Packages]#

■ DHCP 서버 IP 주소 전달 방식

DHCP 서버는 IP 주소 외 다른 정보(Netmask, Default Gateway, DNS 등등)를 같이 DHCP 클라이언트에게 전달할 수 있습니다. 이러한 정보를 전달하기 위해 브로드캐스트와 유니캐스트를 사용합니다.


CentOS에서 tcpdump 명령을 사용하여 DHCP 관련 패킷을 모니터링하면 IP 주소가 전달되는 과정을 확인해 볼 수 있습니다. 아래 내용과 유사한 결과를 확인하기 위해 VMware Workstation 가상 네트워크 VMnet8에 DHCP 서비스를 잠깐 활성화합니다. 그리고 터미널 윈도우를 두 개 열어 첫 번째 터미널에서는 패킷 모니터링을 하기 위해 # tcpdump -i eth0 port bootps -v -n을 실행합니다. 그리고 다른 창에서 아래와 같이 dhclient  명령을 사용하여 IP 주소 해지와 갱신을 실행합니다.

[root@centos701 Packages]# dhclient -4 -r eth0
[root@centos701 Packages]# dhclient eth0

[root@centos701 Packages]# tcpdump -i eth0 port bootps -v -n

tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
18:05:14.203880 IP (tos 0x0, ttl 64, id 2435, offset 0, flags [DF], proto UDP (17), length 328)
    192.168.80.102.bootpc > 192.168.80.120.bootps: BOOTP/DHCP, Request from 00:0c:29:27:03:f5, length 300, xid 0x9d64e128, Flags [none]
   Client-IP 192.168.80.102
   Client-Ethernet-Address 00:0c:29:27:03:f5
   Vendor-rfc1048 Extensions
     Magic Cookie 0x63825363
     DHCP-Message Option 53, length 1: Release
     Server-ID Option 54, length 4: 192.168.80.120
18:05:20.620771 IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
    0.0.0.0.bootpc > 255.255.255.255.bootps: BOOTP/DHCP, Request from 00:0c:29:27:03:f5, length 300, xid 0xba9cee4e, Flags [none]
   Client-Ethernet-Address 00:0c:29:27:03:f5
   Vendor-rfc1048 Extensions
     Magic Cookie 0x63825363
     DHCP-Message Option 53, length 1: Discover
     Requested-IP Option 50, length 4: 192.168.80.102
     Parameter-Request Option 55, length 13:
       Subnet-Mask, BR, Time-Zone, Classless-Static-Route
       Domain-Name, Domain-Name-Server, Hostname, YD
       YS, NTP, MTU, Option 119
       Default-Gateway
18:05:21.626194 IP (tos 0x10, ttl 16, id 0, offset 0, flags [none], proto UDP (17), length 328)
    192.168.80.120.bootps > 192.168.80.102.bootpc: BOOTP/DHCP, Reply, length 300, xid 0xba9cee4e, Flags [none]
   Your-IP 192.168.80.102
   Server-IP 192.168.80.120
   Client-Ethernet-Address 00:0c:29:27:03:f5
   Vendor-rfc1048 Extensions
     Magic Cookie 0x63825363
     DHCP-Message Option 53, length 1: Offer
     Server-ID Option 54, length 4: 192.168.80.120
     Lease-Time Option 51, length 4: 1800
     Subnet-Mask Option 1, length 4: 255.255.255.0
     BR Option 28, length 4: 192.168.80.255
     Domain-Name Option 15, length 11: "localdomain"
     Domain-Name-Server Option 6, length 4: 192.168.80.2
     Default-Gateway Option 3, length 4: 192.168.80.2
18:05:21.626570 IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
    0.0.0.0.bootpc > 255.255.255.255.bootps: BOOTP/DHCP, Request from 00:0c:29:27:03:f5, length 300, xid 0xba9cee4e, Flags [none]
   Client-Ethernet-Address 00:0c:29:27:03:f5
   Vendor-rfc1048 Extensions
     Magic Cookie 0x63825363
     DHCP-Message Option 53, length 1: Request
     Server-ID Option 54, length 4: 192.168.80.120
     Requested-IP Option 50, length 4: 192.168.80.102
     Parameter-Request Option 55, length 13:
       Subnet-Mask, BR, Time-Zone, Classless-Static-Route
       Domain-Name, Domain-Name-Server, Hostname, YD
       YS, NTP, MTU, Option 119
       Default-Gateway
18:05:21.627723 IP (tos 0x10, ttl 16, id 0, offset 0, flags [none], proto UDP (17), length 328)
    192.168.80.120.bootps > 192.168.80.102.bootpc: BOOTP/DHCP, Reply, length 300, xid 0xba9cee4e, Flags [none]
   Your-IP 192.168.80.102
   Server-IP 192.168.80.120
   Client-Ethernet-Address 00:0c:29:27:03:f5
   Vendor-rfc1048 Extensions
     Magic Cookie 0x63825363
     DHCP-Message Option 53, length 1: ACK
     Server-ID Option 54, length 4: 192.168.80.120
     Lease-Time Option 51, length 4: 1800
     Subnet-Mask Option 1, length 4: 255.255.255.0
     BR Option 28, length 4: 192.168.80.255
     Domain-Name Option 15, length 11: "localdomain"
     Domain-Name-Server Option 6, length 4: 192.168.80.2
     Default-Gateway Option 3, length 4: 192.168.80.2


메시지
내 용
DHCPDISCOVER
 IP 주소를 받기 위해 DHCP 서버를 찾기 위해 사용하는 브로드캐스트 메시지이다.
DHCPOFFER
 DHCPDISCOVER를 받은 DHCP 서버는 DHCP 클라이언트를 위해 IP 주소를 예약하고 대여 제공을 만들기 위해 클라이언트에게 보내는 유니캐스트 메시지이다. 이때 임대 시간도 같이 전달된다.
DHCPREQUEST
 DHCPOFFER 메세지를 받은 클라이언트는 제공된 주소를 사용하려 DHCP 서버에게 응답을 보내는 브로드캐스트 메시지인다.
DHCPACK
 DHCP 서버가 클라이언트에게 IP주소 임대 승인을 발신하는 유니캐스트 메시지이다.




■ DHCP 서버 구성

DHCP 서버에 대한 구성 파일은 /etc/dhcp/dhcpd.conf, /etc/dhcp/dhcpd6.conf입니다. 우리가 현재 IPv4를 사용하고 있기 때문에 dhcpd.conf 파일을 사용할 것입니다. VI 편집기를 사용하여 간단하게 아래 내용을 추가합니다. 여기서는 IP 주소, Netmask, Default Router에 대한 정보가 전달되는 DHCP 서버 테스트를 해볼 것입니다.

[root@centos701 ~]# vi /etc/dhcp/dhcpd.conf

subnet 192.168.80.0 netmask 255.255.255.0 {
range dynamic-bootp 192.168.80.201 192.168.80.210;
option subnet-mask 255.255.255.0;
option routers  192.168.80.2;
default-lease-time 300;
max-lease-time  600;
}

[root@centos701 ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: dhcpv6-client ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  sourceports:
  icmp-blocks:
  rich rules:

[root@centos701 ~]# firewall-cmd --permanent --add-service=dhcp
success
[root@centos701 ~]# firewall-cmd --reload
success
[root@centos701 ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: dhcp dhcpv6-client ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  sourceports:
  icmp-blocks:
  rich rules:

[root@centos701 ~]# 


구성 정보
내 용
range dynamic-bootp
 할당할 IP 주소 범위를 나타냅니다.
option subnet-mask
 할당할 IP 주소의 Netmask를 나타냅니다.
option routers
 Gateway 주소를 나타냅니다.
default-lease-time
 IP 주소가 할당될 때 설정되는 임대 시간을 나타냅니다. (기본 임대시간. 단위는 초이다.)
max-lease-time
 DHCP 클라이언트가 요청할 수 있는 최대 임대 시간을 나타냅니다.

아래 명령을 실행하여 DHCP 서버 서비스를 시작합니다.

[root@centos701 ~]# systemctl start dhcpd

만약 DHCP 서버 서비스를 종료하려 한다면 아래 명령을 실행합니다.

[root@centos701 ~]# systemctl stop dhcpd

만약 DHCP 서버 시스템이 리부팅되더라도 DHCP 서버 서비스가 자동으로 올라오도록 설정하려면 아래 명령을 실행합니다.

[root@centos701 ~]# systemctl enable dhcpd

■ DHCP 클라이언트 확인

DHCP 클라이언트 테스트를 하기 위해 CentOS가 가상머신이 하나 더 필요합니다. 이를 위해 기존에 설치한 CentOS 7.3 가상머신을 복제해도 되고 또는 새로 설치해도 됩니다. 가상머신 복제를 위해 아래 게시물을 참고하세요. 복제를 하기 위해 가상머신을 종료해야 합니다.

가상머신 복제하기 [ 링크 ]

복제 또는 설치를 하여 DHCP 클라이언트로 사용할 CentOS 가상머신을 만들었다면 2개의 터미널 창을 열어 하나는 tcpdump 명령을 실행하여 패킷 모니터링을 하고 하나는 dhclient 명령을 사용하여 IP를 받아옵니다.

[root@centos702 ~]# tcpdump -i eth0 port bootps -v -n

[root@centos702 ~]# dhclient -4 -r ens32
[root@centos702 ~]# dhclient ens32

그러면 tcpdump 명령을 실행한 창에서 다음 결과를 확인할 수 있습니다.

[[root@centos702 ~]# tcpdump -i ens32 port bootps -v -n

tcpdump: listening on ens32, link-type EN10MB (Ethernet), capture size 65535 bytes
19:04:46.630697 IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
    0.0.0.0.bootpc > 255.255.255.255.bootps: BOOTP/DHCP, Request from 00:0c:29:da:c7:46, length 300, xid 0xca0d4f53, secs 5, Flags [none]
   Client-Ethernet-Address 00:0c:29:da:c7:46
   Vendor-rfc1048 Extensions
     Magic Cookie 0x63825363
     DHCP-Message Option 53, length 1: Discover
     Parameter-Request Option 55, length 13:
       Subnet-Mask, BR, Time-Zone, Classless-Static-Route
       Domain-Name, Domain-Name-Server, Hostname, YD
       YS, NTP, MTU, Option 119
       Default-Gateway
19:04:47.634881 IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
    192.168.80.10.bootps > 192.168.80.202.bootpc: BOOTP/DHCP, Reply, length 300, xid 0xca0d4f53, secs 5, Flags [none]
   Your-IP 192.168.80.202
   Client-Ethernet-Address 00:0c:29:da:c7:46
   Vendor-rfc1048 Extensions
     Magic Cookie 0x63825363
     DHCP-Message Option 53, length 1: Offer
     Server-ID Option 54, length 4: 192.168.80.10
     Lease-Time Option 51, length 4: 300
     Subnet-Mask Option 1, length 4: 255.255.255.0
     Default-Gateway Option 3, length 4: 192.168.80.2
19:04:47.635531 IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
    0.0.0.0.bootpc > 255.255.255.255.bootps: BOOTP/DHCP, Request from 00:0c:29:da:c7:46, length 300, xid 0xca0d4f53, secs 5, Flags [none]
   Client-Ethernet-Address 00:0c:29:da:c7:46
   Vendor-rfc1048 Extensions
     Magic Cookie 0x63825363
     DHCP-Message Option 53, length 1: Request
     Server-ID Option 54, length 4: 192.168.80.10
     Requested-IP Option 50, length 4: 192.168.80.202
     Parameter-Request Option 55, length 13:
       Subnet-Mask, BR, Time-Zone, Classless-Static-Route
       Domain-Name, Domain-Name-Server, Hostname, YD
       YS, NTP, MTU, Option 119
       Default-Gateway
19:04:47.639561 IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
    192.168.80.10.bootps > 192.168.80.202.bootpc: BOOTP/DHCP, Reply, length 300, xid 0xca0d4f53, secs 5, Flags [none]
   Your-IP 192.168.80.202
   Client-Ethernet-Address 00:0c:29:da:c7:46
   Vendor-rfc1048 Extensions
     Magic Cookie 0x63825363
     DHCP-Message Option 53, length 1: ACK
     Server-ID Option 54, length 4: 192.168.80.10
     Lease-Time Option 51, length 4: 300
     Subnet-Mask Option 1, length 4: 255.255.255.0
     Default-Gateway Option 3, length 4: 192.168.80.2
19:05:12.165913 IP (tos 0x0, ttl 64, id 64436, offset 0, flags [DF], proto UDP (17), length 328)

그리고 ifconfig 명령을 실행하면 할당받는 IP 주소를 아래와 같이 확인할 수 있습니다.

[root@centos702 ~]# ifconfig ens32

ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.80.201  netmask 255.255.255.0  broadcast 192.168.80.255
        inet6 fe80::7f87:782b:5339:33b4  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:da:c7:46  txqueuelen 1000  (Ethernet)
        RX packets 566  bytes 74879 (73.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 113  bytes 21610 (21.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@centos702 ~]#

■ IP 주소 임대시간 갱신

임대 시간의 50%를 사용하면 클라이언트는 서버에게 IP 주소 임대 시간을 갱신할 것을 요청합니다. 그러면 서버는 그 신호를 받고 응답을 해주고 임대 시간이 갱신된다. 이 내용은 2분 30초가 지나면 DHCP Client에서 tcpdump를 실행한 터미널 창에서 확인할 수 있다.


13:07:43.021823 IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
    192.168.80.201.bootpc > 255.255.255.255.bootps: BOOTP/DHCP, Request from 00:0c:29:0d:d6:03, length 300, xid 0xe9f0716a, secs 130, Flags [none]
   Client-IP 192.168.80.201
   Client-Ethernet-Address 00:0c:29:0d:d6:03
   Vendor-rfc1048 Extensions
     Magic Cookie 0x63825363
     DHCP-Message Option 53, length 1: Request
     Parameter-Request Option 55, length 13:
       Subnet-Mask, BR, Time-Zone, Classless-Static-Route
       Domain-Name, Domain-Name-Server, Hostname, YD
       YS, NTP, MTU, Option 119
       Default-Gateway
13:07:43.029492 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 328)
    192.168.80.202.bootps > 192.168.80.201.bootpc: BOOTP/DHCP, Reply, length 300, xid 0xe9f0716a, secs 130, Flags [none]
   Client-IP 192.168.80.201
   Your-IP 192.168.80.201
   Client-Ethernet-Address 00:0c:29:0d:d6:03
   Vendor-rfc1048 Extensions
     Magic Cookie 0x63825363
     DHCP-Message Option 53, length 1: ACK
     Server-ID Option 54, length 4: 192.168.80.11
     Lease-Time Option 51, length 4: 300
     Subnet-Mask Option 1, length 4: 255.255.255.0
     Default-Gateway Option 3, length 4: 192.168.80.2

서버에서 IP 주소가 클라이언트에게 전달되는 정보를 보려면 아래 파일을 tail 명령으로 확인할 수 있다.

[root@centos701 ~]# tail -f /var/lib/dhcpd/dhcpd.leases

lease 192.168.80.201 {
  starts 4 2017/02/02 09:18:26;
  ends 4 2017/02/02 09:23:26;
  cltt 4 2017/02/02 09:18:26;
  binding state active;
  next binding state free;
  rewind binding state free;
  hardware ethernet 00:0c:29:da:c7:46;
  client-hostname "centos702";
}

DHCP 서버와 클라이언트는 통신을 위해  브로드/유니캐스트를 사용하기 때문에 DHCP 서버의 NIC 네트워크 대역이 아니라면 다른 네트워크에서 발행한 DHCP 요청에 대해 응답을 할 수 없습니다. 이를 위해 DHCP Relay라는 것을 사용하는데 이것은 올해 초에 다루도록 하겠습니다.


다음 게시물에서 NTP 서버 구성에 대해 알아보도록 하겠습니다.






No comments:

Post a Comment