Cấu hình máy chủ DHCP trên Linux Image Cấu hình máy chủ DHCP trên Linux

Bài viết này sẽ giới thiệu với các bạn về cách cấu hình máy chủ DHCP trên hệ điều hành Linux. Từ đây giúp chúng ta học Linux một cách dể dàng hơn.

1. Giới thiệu DHCP

DHCP(Dynamic Host Configuration Protocol) là một giao thức mạng cho phép server tự động cấp phát IP và các tham số cấu hình mạng liên quan cho các client. Các IP được cấp cho Client sẽ nằm trong nhóm IP đã được chúng ta xác định trước. Khi một client khởi động thì nó sẽ nhận được một địa chỉ IP động. Địa chỉ IP được DHCP server gán cho DHCP client, thời gian được thay đổi IP có thể tùy thuộc vào thời gian hiệu lực cấp phát (hay leasetime) tùy theo cấu hình ở máy chủ DHCP.

Cách hoạt động của DHCP:

  • Khi client (được cấu hình để sử dụng DHCP) và được kết nối với mạng, nó sẽ chuyển tiếp thông báo DHCPDISCOVER đến máy chủ DHCP server. Và sau khi DHCP server nhận được thông báo yêu cầu DHCPDISCOVER, nó sẽ trả lời bằng DHCPOFFER.
  • Sau đó, client nhận được thông báo DHCPOFFER và nó sẽ gửi một thông điệp DHCPREQUEST đến cho server biết, nó đã được chuẩn bị để nhận cấu hình mạng được cung cấp trong tin nhắn DHCPOFFE.
  • Cuối cùng DHCP server nhận thông báo DHCPREQUEST từ client và gửi tin nhắn DHCPACK cho client hiện phép sử dụng địa chỉ IP được gán.

Trong hướng dẫn này, chúng ta sẽ tìm hiểu cách cài đặt và định cấu hình DHCP server trong bản phân phối CentOS 8.

Có 2 công cụ hổ trợ cấu hình DHCP server trên CentOS 8:

  • Công cụ isc dhcp server.
  • Công cụ dnsmasq.

Chúng ta sẽ lần lượt tìm hiểu cách cấu hình DHCP server của mỗi công cụ trên.

2. Cấu hình DHCP server sử dụng isc dhcp server

2.1. Cấu hình DHCP server phía server

Bước 1: Để có thể cài đặt DHCP chúng ta chỉ cần chạy lệnh sau:

[root@blogd-net-lab01 ~]# dnf -y install dhcp-server
Last metadata expiration check: 0:01:20 ago on Mon 23 Mar 2020 04:43:25 PM +07.
Dependencies resolved.
=================================================================================================================================================
 Package                             Architecture                   Version                                 Repository                      Size
=================================================================================================================================================
Installing:
 dhcp-server                         x86_64                         12:4.3.6-34.el8                         BaseOS                         530 k
...

Mở file cấu hình chính của DHCP:

[root@blogd-net-lab01 ~]# cat /etc/dhcp/dhcpd.conf
#
# DHCP Server Configuration file.
#   see /usr/share/doc/dhcp-server/dhcpd.conf.example
#   see dhcpd.conf(5) man page
#

Khi mở file cấu hình dhcpd.conf thì nội dung của file này chưa có gì. Trong file này hướng dẫn là mở file /usr/share/doc/dhcp*/dhcpd.conf.sample để xem cấu hình mẫu. Trong những trường hợp như thế này thì không nên soạn 1 file mới bằng vi mà nên copy lại và sửa cấu hình cho hợp với mô hình đang sử dụng.

[root@blogd-net-lab01 ~]# cp /usr/share/doc/dhcp-server/dhcpd.conf.example /etc/dhcp/dhcpd.conf
cp: overwrite '/etc/dhcp/dhcpd.conf'? y

Bước 2: Thực hiện mở file /etc/dhcp/dhcpd.conf bằng trình soạn thảo văn bản vi:

[root@blogd-net-lab01 ~]# vi /etc/dhcp/dhcpd.conf

Bắt đầu thực hiện thêm các tham số áp dụng cho tất cả các mạng con như sau:

option domain-name "labblogd.net";
option domain-name-servers ns1.labblogd.net, ns2.labblogd.net;

Bây giờ, chúng ta xác định một mạng con, trong ví dụ này, chúng ta sẽ định cấu hình DHCP cho mạng LAN là 10.0.0.0:

subnet 10.0.0.0 netmask 255.0.0.0 {
  range 10.0.0.100 10.0.0.200;
  option domain-name-servers 10.0.0.1;
  option domain-name "labblogd.net";
  option routers 10.0.0.1;
  option broadcast-address 10.255.255.255;
  default-lease-time 600;
  max-lease-time 7200;
}

Bước 3: Tiếp theo chúng ta khởi động dịch vụ DHCP và cho phép nó tự động khởi động cùng với hệ thống các lần tiếp theo, sử dụng các lệnh sau:

[root@blogd-net-lab01 ~]# systemctl start dhcpd
[root@blogd-net-lab01 ~]# systemctl enable dhcpd
Created symlink /etc/systemd/system/multi-user.target.wants/dhcpd.service → /usr/lib/systemd/system/dhcpd.service.

Bước 4: Sau đó chúng ta cho phép dịch vụ DHCP (DHCPD daemon listen trên cổng 67/UDP) như sau:

[root@blogd-net-lab01 ~]# firewall-cmd --add-service=dhcp --permanent 
success
[root@blogd-net-lab01 ~]# firewall-cmd --reload 
success

Nếu muốn cấp IP động và cố định cho theo một địa chỉ MAC thì cần phải chỉnh sửa thêm file cấu hình. Ví dụ: cấu hình cấp IP động 10.0.0.111 cho máy tính Client (địa chỉ MAC là 00:0C:29:10:37:0A). Tiếp tục mở file cấu hình và chỉnh sửa bằng trình soạn thảo vi như sau:

[root@blogd-net-lab01 ~]# vi /etc/dhcp/dhcpd.conf

Cấu hình như sau:

host testclient {
  hardware ethernet  00:0c:29:0b:61:6f;
  fixed-address 10.0.0.111;
}

3. Cấu hình DHCP server sử dụng dnsmasq

dnsmasq là một công cụ chuyển tiếp DNS, dễ cấu hình, phần mềm DHCP server và hệ thống con quảng cáo bộ định tuyến cho các mạng nhỏ.

Công cụ dnsmasq hỗ trợ Linux, *BSD, MacOS, Android.

Nó có một hệ thống DNS cung cấp một máy chủ DNS cục bộ cho mạng, với việc chuyển tiếp tất cả các loại truy vấn đến các máy chủ DNS đệ quy ngược dòng và lưu trữ các bản ghi. Hệ thống DHCP subsystem hỗ trợ DHCPv4, DHCPv6, BOOTP, PXE, và TFTP server.

Trong phần này, chúng ta sẽ tìm hiểu cách cài đặt và thiết lập DNS/DHCP server bằng dnsmasq trên các bản phân phối CentOS 8.

3.1. Cấu hình DHCP server

Bước 1: Để có thể cài đặt dnsmasp chúng ta sử dụng lệnh sau để cài đặt:

[root@blogd-net-lab01 ~]# yum install dnsmasq
CentOS-8 - AppStream                                                                           6.6 kB/s | 4.3 kB     00:00
CentOS-8 - Base                                                                                3.9 kB/s | 3.8 kB     00:00
CentOS-8 - Extras                                                                              1.9 kB/s | 1.5 kB     00:00
Dependencies resolved.
===============================================================================================================================
 Package                      Architecture                Version                         Repository                      Size
===============================================================================================================================
Installing:
 dnsmasq                      x86_64                      2.79-6.el8                      AppStream                      317 k

Bước 2: Sau khi cài đặt gói dnsmasq thành công chúng ta cần khởi động dịch vụ dnsmasq:

[root@blogd-net-lab01 ~]# systemctl start dnsmasq

Tiếp theo chúng ta cần phép nó tự động khởi động cùng với hệ thống:

[root@blogd-net-lab01 ~]# systemctl enable dnsmasq
Created symlink /etc/systemd/system/multi-user.target.wants/dnsmasq.service → /usr/lib/systemd/system/dnsmasq.service.

Kiểm tra trạng thái của nó để đảm bảo rằng nó hoạt động và chạy lệnh sau:

[root@blogd-net-lab01 ~]# systemctl status dnsmasq
● dnsmasq.service - DNS caching server.
   Loaded: loaded (/usr/lib/systemd/system/dnsmasq.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2020-03-24 10:42:56 +07; 1min 29s ago
 Main PID: 24804 (dnsmasq)
    Tasks: 1 (limit: 11183)
   Memory: 2.0M
   CGroup: /system.slice/dnsmasq.service
           └─24804 /usr/sbin/dnsmasq -k

Mar 24 10:42:56 blogd-net-lab01 systemd[1]: Started DNS caching server..
Mar 24 10:42:56 blogd-net-lab01 dnsmasq[24804]: started, version 2.79 cachesize 150
Mar 24 10:42:56 blogd-net-lab01 dnsmasq[24804]: compile time options: IPv6 GNU-getopt DBus no-i18n IDN2 DHCP DHCPv6 no-Lua TFT>
Mar 24 10:42:56 blogd-net-lab01 dnsmasq[24804]: reading /etc/resolv.conf
Mar 24 10:42:56 blogd-net-lab01 dnsmasq[24804]: using nameserver 192.168.21.2#53
Mar 24 10:42:56 blogd-net-lab01 dnsmasq[24804]: read /etc/hosts - 2 addresses

Bước 3: Kích hoạt máy chủ DHCP bằng dnsmasq

Chúng ta có thể kích hoạt máy chủ DHCP bằng cách bỏ tùy chọn dhcp-range và cung cấp dải địa chỉ có sẵn để cho thuê và tùy chọn thời gian thuê:

dhcp-range=10.0.0.50,10.0.0.200,12h

Thực hiện thêm dòng sau để xác định default gateway:

dhcp-option=option:router,10.0.0.1

Tiếp theo chúng ta thêm vào NTP, DNS, server và subnetmask:

dhcp-option=option:ntp-server,10.0.0.1
dhcp-option=option:dns-server,10.0.0.1
dhcp-option=option:netmask,255.0.0.0

Tùy chọn xác định DHCP server sẽ giữ cơ sở dữ liệu cho thuê của nó, điều này sẽ giúp bạn dễ dàng kiểm tra địa chỉ IP mà nó đã gán.

dhcp-leasefile=/var/lib/dnsmasq/dnsmasq.leases

Để làm cho DHCP server ở chế độ có thẩm quyền, hãy bỏ dấu # trước tùy chọn sau:

dhcp-authoritative

Lưu tệp và khởi động lại dịch vụ dnsmasq để áp dụng các thay đổi gần đây.

[root@blogd-net-lab01 ~]# systemctl restart dnsmasq

Nếu Firewalld đang chạy, chúng ta cần cho phép chạy dịch vụ DHCP. DHCP server sử dụng port 67/UDP:

[root@blogd-net-lab01 ~]# firewall-cmd --add-service=dhcp --permanent 
success
[root@blogd-net-lab01 ~]# firewall-cmd --reload 
success

3.2. Sử dụng dnsmasq cấu hình DNS server

Bước 1: Cấu hình dnsmasp server:

dnsmasq server được cấu hình thông qua tệp /etc/dnsmasq.conf và các tệp cấu hình do người dùng xác định cũng có thể được thêm vào trong thư mục /etc/dnsmasq.d.

DNS được bật theo mặc định, vì vậy trước khi thực hiện bất kỳ thay đổi nào, chúng ta cần tạo bản sao lưu của tập tin etc/dnsmasq.conf.

[root@blogd-net-lab01 ~]# cp /etc/dnsmasq.conf /etc/dnsmasq.conf.orig

Bây giờ chúng ta thực hiện mở file cấu hình /etc/dnsmasq.conf bằng trình soạn thảo văn bản vi:

[root@blogd-net-lab01 ~]# vi /etc/dnsmasq.conf

Tùy chọn listen-address được sử dụng để thiết lập các địa chỉ IP, nơi dnsmasq sẽ lắng nghe. Để CentOS server của chúng ta lắng nghe các yêu cầu DHCP và DNS trên mạng LAN, đặt tùy chọn listen-address thành các địa chỉ IP LAN (bao gồm 127.0.0.1) như sau:

listen-address=::1,127.0.0.1,10.0.0.1

Lưu ý: Địa chỉ IP máy chủ phải là IP tĩnh.

Chúng ta có thể hạn chế interface dnsmasq lắng nghe bằng cách sử dụng tùy chọn interface (thêm nhiều dòng cho nhiều interface):

interface=ens37

Khi chúng ta cần có một tên miền hãy bỏ dấu # trước tùy chọn expand-hosts:

expand-hosts

Để đặt tên miền cho dnsmasq. Các DHCP client sẽ có các tên miền đủ điều kiện miễn là tên miền đã đặt được khớp:

domain=labblogd.net

Tiếp theo, xác định DNS server ngược dòng cho các non-local domain bằng tùy chọn server (server=dns_server_ip) như sau:

# Google's nameservers
server=8.8.8.8
server=8.8.4.4

Cuối cùng chúng ta có thể buộc tên miền cục bộ của mình thành một địa chỉ IP bằng cách sử dụng tùy chọn address như được hiển thị:

address=/labblogd.net/127.0.0.1 
address=/labblogd.net/10.0.0.1

Lưu file cấu hình và thực hiện kiểm tra file cấu hình xem có lỗi không:

[root@blogd-net-lab01 ~]# dnsmasq --test
dnsmasq: syntax check OK.

Bước 2: Định cấu hình dnsmasq với tệp /etc/resolv.conf

Thực hiện tất cả các truy vấn được gửi đến dnsmasq bằng cách thêm địa chỉ localhost làm máy chủ tên duy nhất trong tệp /etc/resolv.conf.

[root@blogd-net-lab01 ~]# vi /etc/resolv.conf

Cú pháp như sau:

nameserver 127.0.0.1

Tệp /etc/resolv.conf được duy trì bởi một trình nền cục bộ, đặc biệt là trình quản lý mạng, do đó mọi thay đổi do người dùng thực hiện sẽ bị ghi đè. Để ngăn chặn điều này, chúng ta bảo vệ ghi bằng cách đặt thuộc tính tệp không thay đổi (vô hiệu hóa quyền truy cập ghi vào tệp) bằng lệnh chattr như được hiển thị:

[root@blogd-net-lab01 ~]# chattr +i /etc/resolv.conf
[root@blogd-net-lab01 ~]# lsattr /etc/resolv.conf
----i-------------- /etc/resolv.conf

Bước 3: Xác định tên máy chủ và tên DNS

dnsmasq đọc tất cả các máy chủ DNS và tên từ file /etc hosts, do đó thêm DNS server của chúng và IP như sau:

[root@blogd-net-lab01 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

127.0.0.1       dnsmasq
10.0.0.1    dnsmasq
10.0.0.1    gateway
10.0.0.100  maas-controller
10.0.0.20   nagios
10.0.0.25   webserver1

Lưu ý: Tên DNS cục bộ cũng có thể được xác định bằng cách nhập tên từ hệ thống con DHCP hoặc bằng cấu hình của một loạt các loại bản ghi hữu ích.

Để áp dụng các thay đổi trên, hãy khởi động lại dịch vụ dnsmasq như sau:

[root@blogd-net-lab01 ~]# systemctl restart dnsmasq

Nếu máy chủ của chúng ta có firewall thì chúng ta cần mở dịch dụ DNS và DHCP để cho phép các yêu cầu từ máy client đến server:

[root@blogd-net-lab01 ~]# firewall-cmd --add-service=dns --permanent
success
[root@blogd-net-lab01 ~]# firewall-cmd --add-service=dhcp --permanent
success
[root@blogd-net-lab01 ~]# firewall-cmd --reload
success

Bước 4: Thực hiện kiểm tra Local DNS

Để kiểm tra xem máy chủ DNS cục bộ hoặc chuyển tiếp có hoạt động tốt không, chúng ta sử dụng các công cụ dig hoặc nslookup để thực hiện các truy vấn DNS. Chúng ta có thể cài đặt như sau:

[root@blogd-net-lab01 ~]# yum install bind-utils
CentOS-8 - AppStream                                                                           6.0 kB/s | 4.3 kB     00:00
CentOS-8 - Base                                                                                6.5 kB/s | 3.8 kB     00:00
CentOS-8 - Extras                                                                              2.0 kB/s | 1.5 kB     00:00
Package bind-utils-32:9.11.4-26.P2.el8.x86_64 is already installed.
Dependencies resolved.
Nothing to do.
Complete!

Sau khi cài đặt chúng ta có thể kiểm tra tên miền cục bộ như sau:

[root@blogd-net-lab01 ~]# dig labblogd.net

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el8 <<>> labblogd.net
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27810
;; flags: qr aa rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;labblogd.net.       IN A

;; ANSWER SECTION:
labblogd.net.     0  IN A  127.0.0.1

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Tue Mar 24 12:31:08 +07 2020
;; MSG SIZE  rcvd: 46

Hoặc:

[root@blogd-net-lab01 ~]# nslookup labblogd.net
Server:     127.0.0.1
Address: 127.0.0.1#53

Name: labblogd.net
Address: 127.0.0.1

Chúng ta cũng có thể truy vấn FQDN của một máy chủ:

[root@blogd-net-lab01 ~]# dig webserver1.labblogd.net

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el8 <<>> webserver1.labblogd.net
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 3384
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;webserver1.labblogd.net.  IN A

;; ANSWER SECTION:
webserver1.labblogd.net. 0 IN A  10.0.0.25

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Tue Mar 24 12:42:07 +07 2020
;; MSG SIZE  rcvd: 68

Hoặc:

[root@blogd-net-lab01 ~]# nslookup webserver1.labblogd.net
Server:     127.0.0.1
Address: 127.0.0.1#53

Name: webserver1.labblogd.net
Address: 10.0.0.25

Để kiểm tra tra cứu IP ngược, hãy chạy lệnh sau:

[root@blogd-net-lab01 ~]# dig -x 10.0.0.25

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el8 <<>> -x 10.0.0.25
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34888
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;25.0.0.10.in-addr.arpa.      IN PTR

;; ANSWER SECTION:
25.0.0.10.in-addr.arpa. 0  IN PTR   webserver1.labblogd.net.

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Tue Mar 24 12:43:27 +07 2020
;; MSG SIZE  rcvd: 88

Hoặc:

[root@blogd-net-lab01 ~]# nslookup 10.0.0.25
25.0.0.10.in-addr.arpa  name = webserver1.labblogd.net.

4. Cấu hình DHCP server phía client

4.1: Thiết lập với client là Centos

Chúng ta định cấu hình cho client của chúng ta để tự động nhận địa chỉ IP từ máy chủ DHCP. Đăng nhập vào client và sửa đổi tệp cấu hình giao diện Ethernet như sau:

[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens37
TYPE=Ethernet
BOOTPROTO=dhcp
NAME=ens37
UUID=2da380ad-6733-47d5-aead-e1a28d35faed
DEVICE=ens37
ONBOOT=yes

Chúng ta cần cài đặt DHCP client trong máy để tự động nhận địa chỉ IP.

[root@localhost ~]# dnf -y install dhcp-client 

Chúng ta có thể sử dụng lệnh dhclient để yêu cầu địa chỉ IP:

[root@localhost ~]# dhclient ens37

Kiểm tra địa chỉ IP của mấy client sau khi thực thi lệnh trên:

[root@localhost ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:0e:b1:48 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.100/8 brd 10.255.255.255 scope global secondary dynamic ens37
       valid_lft 377sec preferred_lft 377sec
    inet6 fe80::20c:29ff:fe0e:b148/64 scope link
       valid_lft forever preferred_lft forever

Thực hiện ping giữa client và server thành công không:

[root@localhost ~]# ping 10.0.0.1
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=2.06 ms
64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=0.449 ms
64 bytes from 10.0.0.1: icmp_seq=3 ttl=64 time=1.79 ms
64 bytes from 10.0.0.1: icmp_seq=4 ttl=64 time=0.504 ms
64 bytes from 10.0.0.1: icmp_seq=5 ttl=64 time=2.35 ms
64 bytes from 10.0.0.1: icmp_seq=6 ttl=64 time=0.404 ms
...

4.2. Thiếp lập với client là Windows

Chúng ta định cấu hình cho client của chúng ta để tự động nhận địa chỉ IP từ máy chủ DHCP. Đăng nhập vào client và thiết lập kết nối của card mạng về chế độ Obtain an IP address automatically như hình sau:

Thiếp lập nhận DHCP trên client Windows

Sau khi thiết lập nhận IP tự động từ DHCP server chúng ta thực hiện mở cmd chạy lệnh sau và kiểm tra xem client đã được cấp IP với đầy đủ các thông số theo cấu hình:

Nhận ip tự động và kiểm tra

Sau đó chúng ta thực hiện dùng client ping cho server để kiểm tra kết nối xem thành công không:

Kiểm tra kết nối

Như vậy là chúng ta đã nhận IP tự động từ DHCP server thành công.

5. Lời kết

Qua bài trên, giúp cho chúng ta cấu hình máy chủ DHCP trên CentOS 8 của hệ điều hành Linux. Từ đây giúp chúng ta có thể tạo DHCP cho máy chủ của chúng ta. Dể có thể dể dàng cấp IP cho các Client trong mạng của chúng ta.