Lab007: CentOS - Nghiệp vụ DHCP Server trên Linux
"Hôm nay chúng ta sẽ tìm hiểu về cách cấu hình DHCP - Dynamic Host Configuration Protocol trên Linux, là giao thức tự động cấp phát địa chỉ IP, thường được dùng trong trường hợp cần phải tự động cấp phát IP cho một lượng lớn thiết bị cùng lúc"
**
I Cấu hình DHCP trong cùng lớp mạng
1.1 Thiết lập môi trường thực hành
Trong bài Lab này, ta cần phải tạo một mạng LAN ảo trên môi trường ảo hóa Hyper-V. Vậy thì trước tiên cần tạo một Card mạng (interface) ở chế độ Private.
Đây là một GlobalSetting của Hyper-V nên ta sẽ tiến hành thiết lập tại mục Action -> Virtual Switch Manager:
Tiếp tục chọn New Virtual Network Switch -> Private -> Create Virtual Switch -> Apply / OK:
Đặt tên cho card mạng mới này là Private cho dễ nhớ -> Private Network -> OK:Vậy là chúng ta đã tạo được Card mạng ở chế độ Private để sử dụng cho việc tạo mạng Lan ảo ở bước sau.
**
1.1.1 Topo mạng
Để minh hoạ việc cấp phát IP tự động cho nhiều thiết bị trong mạng, mình sẽ thiết lập mô hình mạng ảo như sau:
Tương ứng, ở trên Hyper-V ta sẽ cần cài đặt các máy ảo (VM) với vai trò:
- VM có tên CentOS8-13 đóng vai trò DHCP Server, được gán IP tĩnh là 10.10.10.20
- VM có tên CentOS-10 / 11 / 12 đóng vai trò Client, sẽ dùng để kiểm chứng kết quả việc cấp phát IP tự động
Ở đây có một thói quen mình thấy cần chia sẻ, đó là hãy sử dụng tính năng Checkpoint. Ví dụ như ta vừa thiết lập xong môi trường thực hành và chuẩn bị làm bài Lab, hãy tạo một Checkpoint (bản backup) để phòng trường hợp thao tác sai khi thực hiện nghiệp vụ chẳng hạn, ta chỉ việc xóa bài chơi lại (dễ dàng hơn cuộc đời rất nhiều)
**
1.1.2 Thiết lập cho máy DHCP-Server
Trong phần này, chúng ta thiết lập Card mạng cho DHCP Server như sau:
- Card "eth0" kết nối với mạng LAN thực lấy IP để có thể remote vào máy ảo, Interface này không thuộc phạm vi bài Lab nên chúng ta không cần quan tâm.
- Card "eth1" kết nối với mạng Lan ảo dùng để lắng nghe các yêu cầu cấp IP từ Clients. Đây sẽ là Card mạng để thực hành bài Lab ngày hôm nay, ta sẽ chỉ cần quan tâm đến Interface này.
Để DHCP-Server tham gia vào mạng LAN ảo như Topo mạng trên, ta sẽ kết nối với switch Private đã tạo bằng cách chọn máy ảo sẽ làm DHCP-Server (số hiệu CentOS8-13) -> Setting:
Chọn Add Hardware -> Network Adapter -> Add -> Apply:
Chọn Network Adapter vừa được thêm -> Virtual Switch -> Private -> Apply:
Kết quả chúng ta sẽ gắn thêm được Card mạng Private như sau:
Từ trên Windows Terminal remote vào VM để kiểm tra địa chỉ mạng của DHCP-Server (số hiệu CentOS8-13) bằng lệnh ssh:ssh root@192.168.1.113
Khi đã vào được máy áo, nhập lệnh kiểm tra địa chỉ IP:
ip addr
Ở đây ta thấy Card mạng "eth0" có địa chỉ 192.168.1.113 là địa chỉ IP thực, ở trong mạng LAN thực, chỉ dùng để remote vào máy ảo. Trong bài Lab này ta sẽ chỉ quan tâm đến Card mạng "eth1" nằm trong mạng LAN ảo dùng để thực hiện các nghiệp vụ của DHCP-Server.
**
1.1.3 Thiết lập cho máy Client
Tương tự, trên các máy Client (số hiệu CentOS-10 / 11 / 12) mình cũng sẽ thiết lập 2 Card mạng, nhưng chúng ta sẽ chỉ quan tâm đến Card mạng Private nằm trong mạng LAN ảo để thực hiện xin cấp IP từ DHCP-Server.
Kiểm tra địa chỉ IP nằm trong mạng LAN ảo. lúc này Interface "eth1" vẫn chưa được cấp phát IP, chúng ta sẽ chỉ cần quan tâm đến Interface này thôi:**
1.2 Cấu hình DHCP-Server
Trên máy ảo được chỉ định làm DHCP-Server, tiến hành cài đặt gói DHCP thông qua lệnh yum:
sudo yum install dhcp-server -y
Để kiểm tra kết quả của việc cài đặt, ta sẽ thử list các gói đã được cài đặt với từ khóa "dhcp"
sudo yum list installed | grep -i dhcp
Thư mục chứa file config dành cho dịch vụ DHCP cũng giống như nhiều file config khác, được lưu tại đường dẫn "/etc/" và ta sẽ xem thử có gì trong thư mục "/etc/dhcp/".
Ở đây chúng ta cần quan tâm đến tệp "dhcpd.conf" là nơi sẽ thực hiện cấu hình cấp phát IP cho các Clients trong mạng, thế nhưng để cho tiện thì ta sẽ copy một file config mẫu đi kèm trong gói DHCP vào thư mục "/etc/dhcp/" bằng câu lệnh sau:sudo cp /usr/share/doc/dhcp-server/dhcpd.conf.example /etc/dhcp/dhcpd.conf
Sau đó, dùng trình soạn thảo Neovim (hoặc Vim) để mở file config mẫu này ra và bắt đầu chỉnh sửa.
sudo nvim /etc/dhcp/dhcpd.conf
Tìm đến đoạn văn mẫu này để tiến hành chỉnh sửa:
Trước khi tiến hành cấu hình DHCP-Server, chúng ta xem lại yêu cầu bài toán:
- Ta sẽ sử dụng Interface "eth1" để lắng nghe các yêu cầu từ Client, Interface này được đặt vào đoạn config nào thì đoạn config đó mới có hiệu lực, vì thế chúng ta chỉ việc mặc kệ các đoạn văn mẫu khác (không cần biến chúng thành comment)
- Giả định ta sẽ cấp phát địa chỉ trên mạng có NetworkAddress 10.10.10.0 Netmask 255.255.255.0 BroadcastAddress 10.10.10.255
- Phạm vi dải IP cấp phát từ 10.10.10.100 ~ 10.10.10.200 Các địa chỉ khác sẽ dự trữ làm IP tĩnh.
Từ các yêu cầu trên ta sẽ chỉnh sửa như sau:
# A slightly different configuration for an internal subnet.
subnet 10.10.10.0 netmask 255.255.255.0 {
interface eth1;
range 10.10.10.100 10.10.10.200;
option domain-name-servers 10.10.10.10;
option domain-name "internal.example.org";
option routers 10.10.10.1;
option broadcast-address 10.10.10.255;
default-lease-time 600;
max-lease-time 7200;
}Ta cần chú ý các tham số trong nội dung config:
- Subnet và Netmask: là NetworkAddress và SubmetMask của mạng LAN mà Server và Client đang thuộc về.
- Interface: là Card mạng dùng để lắng nghe các yêu cầu từ Client. Như đã nói ở trên, tham số này được đặt vào đoạn config nào thì đoạn config đó mới có hiệu lực.
- Option domain-name-servers: địa chỉ của DNS-Server, trong phạm vi bài Lab này thì chúng ta chưa có DNS-Server nhưng mình cứ đặt giả định địa chỉ 10.10.10.10 Sau này chúng ta sẽ xây dụng mô hình mạng với đầy đủ các dịch vụ, chỉ là chuyện sớm muộn thôi.
- Option domain-name: tương tự như trên, nơi cấu hình Domain ví dụ như "aws0111.net" chẳng hạn.
- Option routers: là địa chỉ DefaultGateway của mạng, trong trường hợp này chúng ta không có thiết bị biên đóng vai trò định tuyến lưu lượng để mà gán DefaultGateway (nghe quen quen, chính là Router đấy) nhưng mình cũng sẽ cấu hình tượng trưng là 10.10.10.1
- Option broadcast-address: là địa chỉ Broadcast của mạng LAN mà Server và Clients đang thuộc về.
Đến đây ta đã cơ bản cấu hình xong các tham số sẽ được DHCP-Server cấp cho Client. Việc tiếp theo là khởi động dịch vụ DHCP lên, bắt đầu lắng nghe các yêu cầu:
sudo systemctl start dhcpd sudo systemctl enable dhcpd
**
1.3 Kiểm tra kết quả
Để kiểm chứng kết quả của việc cấu hình DHCP, mình sẽ bật sẵn DHCP-Server (số hiệu CentOS8-13) và sau đó khởi động cùng lúc 3 Clients (số hiệu CentOS-10 / 11 / 12) rồi kiểm tra IP trên từng Client.
Sau khi các Client đã khởi động xong, kiểm tra địa chỉ IP trên Interface "eth1" bằng lệnh "ip addr"
- CentOS-10 nhận IP Address 10.10.10.102
- CentOS-11 nhận IP Address 10.10.10.100
- CentOS-12 nhận IP Address 10.10.10.103
Ở trên máy DHCP-Server (số hiệu CentOS8-13) đọc log hệ thống để kiểm tra tiến trình cấp phát IP cho Clients bằng lệnh:
sudo tail -f /var/log/messages | grep -i "dhcp"
Ta để ý thấy 3 bản tin DHCPACK (acknowledge) biểu thị việc Clients chấp nhận IP được cấp phát bởi DHCP-Server.
sudo tail -f /var/log/messages | grep -i "dhcpack"
Hoặc dùng công cụ "tcpdump" để nghe các gói tin cấp phát IP qua Interface eth1 Port 67. Nếu chưa cài công cụ tcpdump thì ta có thể sử dụng câu lệnh sau:
sudo yum install tcpdump -y sudo tcpdump -i eth1 port 67
**
II Cấu hình DHCP thông qua Relay-Agent
Trong chương trước, ta đã giải quyết được bài toán DHCP-Server cấp phát IP tự động cho Clients cùng một mạng. Ở chương này chúng ta sẽ tiến lên mức độ cao hơn đó là cấp phát IP cho các Clients khác lớp mạng bằng cách cấu hình DHCP-Server thông qua Relay-Agent.
Relay-Agent bình thường sẽ là thiết bị Router hoặc Switch Layer3 được cấu hình thêm chức năng lắng nghe yêu cầu cấp IP từ các Clients rồi chuyển tiếp yêu cầu này đến DHCP-Server nhưng trong trường hợp này ta hoàn toàn có thể dùng một thiết bị chạy Linux để thực hiện nhiệm vụ đó.
Mình đã cài đặt máy ảo DHCP-Server và Relay-Agent với HDH CentOS-8, việc cấu hình trên các phiên bản CentOS cũ hơn có thể sẽ khác về thao tác nhưng nguyên lí thì chỉ có một. Nếu bạn gặp sai khác khi thực hiện thì hãy comment, chúng ta sẽ tiếp tục san bằng tất cả.
**
2.1 Thiết lập môi trường thực hành
2.1.1 Topo mạng và lưu trình thực hiện
Để tạo tình huống yêu cầu / cấp phát IP thông qua Relay-Agent, ta sẽ thiết kế một hệ thống mạng với 2 mạng con riêng biệt, trong đó:
- DHCP-Server CentOS8-13 thuộc mạng 10.10.4.0/24
- 3 Clients CentOS-10 / 11 / 12 thuộc mạng 10.10.5.0/24
- DHCP-Relay CentOS8-14 sẽ có 2 Card mạng thuộc cả 2 mạng con.
- Yêu cầu DHCP-Server cấp phát địa chỉ IP cho các Clients thông qua DHCP-Relay
Đối với đề bài như trên, ta cần thực hiện theo lưu trình sau:
- DHCP-Server: cấu hình IP tĩnh, cấu hình dải mạng sẽ cấp cho Clients
- Định tuyến để gói tin có thể đi từ DHCP-Server trong mạng 10.10.4.0/24 xuống Clients trong mạng 10.10.5.0/24
- Relay-Agent: cài đặt gói dhcp-relay, khởi động dịch vụ relay, chỉ định Interface nào có nhiệm vụ lắng nghe các yêu cầu từ Clients
- Cấu hình chuyển tiếp 2 Interface trên Relay-Agent để gói tin đi được từ Clients lên DHCP-Server
Đó là toàn bộ logic của nghiệp vụ cấp phát IP thông qua Relay-Agent, hãy đảm bảo nắm được logic của nghiệp vụ trước khi tiến hành, đừng vội lao vào làm mò vì trong thực tế không phải lúc nào chúng ta cũng có thể xóa bài chơi lại như với mấy cái máy ảo.
**
2.1.2 Thiết lập Card mạng trên Hyper-V
Nhiệm vụ ở bước này là tạo một hệ thống mạng ảo với 2 mạng con như Topo, vậy chúng ta sẽ tạo ra 2 Switch ở chế độ Private và đặt tên là Private01, Private02 cho dễ nhớ. Chọn Virtual Switch Manager -> New Virtual Network Switch -> Private -> Create Virtual Switch -> đặt tên cho Virtual Switch -> Apply.
Chúng ta sẽ tạo đủ 2 Virtual Switch ở chế độ Private như hình dưới:**
2.1.3 Thiết lập LAN ảo cho DHCP-Server
Trên DHCP-Server (số hiệu CentOS8-13), ta cần nối nó với Switch Private01 như Topo mạng. Chọn máy ảo DHCP-Server -> Setting -> Add Hardware Network Adapter -> Add -> Mục Virtual Switch chọn Private01 -> Apply:
Từ trên WindowsTerminal ta sẽ remote vào máy ảo DHCP-Server thông qua địa chỉ IP thực để kiểm tra các Interface.
Ta thấy sau khi "cắm" máy ảo với Switch Private01 sẽ xuất hiện thêm Interface eth1 chưa được cấu hình IP. Interface eth0 có địa chỉ là IP thực trong mạng LAN nhà mình, chỉ dùng để remote vào máy ảo, không nằm trong phạm vi bài Lab này nên chúng ta sẽ không quan tâm:
Để hoàn tất việc đưa máy ảo DHCP-Server vào mạng LAN ảo 10.10.4.0/24 của bài Lab, ta sẽ tiến hành cấu hình IP tĩnh 10.10.4.20 cho Interface eth1 bằng cách chỉnh sửa file config:
sudo nvim /etc/sysconfig/network-scripts/ifcfg-eth1
Và viết vào các tham số sau:
TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=static DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no NAME=eth1 DEVICE=eth1 ONBOOT=yes IPADDR=10.10.4.20 NETMASK=255.255.255.0 GATEWAY=10.10.4.1
Sau đó tắt / bật Interface eth1 để nhận cấu hình bằng 2 câu lệnh:
ifdown eth1 ifup eth1
Vậy là chúng ta đã kết nối vào mạng LAN ảo cho DHCP-Server.
**
2.1.4 Thiết lập LAN ảo cho Relay-Agent
Tương tự như trên, để kết nối vào LAN ảo cho Relay-Agent, ta sẽ "cắm" nó vào 2 Switch Private01 và Private02 như Topo mạng.
Tương ứng là 2 Interface eth1 và eth2 lúc này chưa được cấu hình IP tĩnh:ifconfig
Ta tiếp tục thực hiện cấu hình IP tĩnh tương tự như trên DHCP-Server cho 2 Interface:
- eth1 IP tĩnh 10.10.4.21 thuộc mạng 10.10.4.0/24
TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=static DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no NAME=eth1 DEVICE=eth1 ONBOOT=yes IPADDR=10.10.4.21 NETMASK=255.255.255.0 GATEWAY=10.10.4.1
- eth2 IP tĩnh 10.10.5.20 thuộc mạng 10.10.5.0/24
TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=static DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no NAME=eth2 DEVICE=eth2 ONBOOT=yes IPADDR=10.10.5.20 NETMASK=255.255.255.0 GATEWAY=10.10.5.1
Khi cấu hình xong thì chúng ta có thể khởi động lại máy ảo bằng lệnh "init 6" cho nhanh và kiểm tra lại địa chỉ IP tĩnh:
**
2.1.5 Thiết lập LAN ảo cho Clients
Với các máy Clients (số hiệu CentOS-10/11/12), ta sẽ đặt chúng khác mạng con với DHCP-Server bằng cách kết nối chúng với Card mạng Private02:
Như vậy là đủ rồi, không cần cấu hình gì thêm vì lát nữa chúng sẽ được cấp phát IP tự động, ta có thể tắt chúng đi.
**
2.2 DHCP-Server
2.2.1 Cấu hình IP cấp phát
Cài đặt gói dhcp-server:
sudo dnf install dhcp-server
Copy file config mẫu có sẵn trong gói vừa cài đặt vào thư mục "/etc/dhcp/"
sudo cp /usr/share/doc/dhcp-server/dhcpd.conf.example /etc/dhcp/dhcpd.conf
Dùng trình soạn thảo Neovim để chỉnh sửa file vừa copy
sudo nvim /etc/dhcp/dhcpd.conf
Tìm đến đoạn văn mẫu sau và thiết lập các tham số cấp phát IP cho các Clients trong mạng 10.10.5.0/24 Các option tạm thời chưa dùng tới chúng ta sẽ vô hiệu hóa bằng cách đặt dấu "#" ở đầu dòng, biến chúng thành comment.
# A slightly different configuration for an internal subnet.
subnet 10.10.5.0 netmask 255.255.255.0 {
interface eth1; # Interface co nhiem vu lang nghe yeu cau cap IP
range 10.10.5.100 10.10.5.200;
# option domain-name-servers ns1.internal.example.org;
# option domain-name "internal.example.org";
option routers 10.10.5.1;
option broadcast-address 10.10.5.255;
default-lease-time 600;
max-lease-time 7200;
}Sau đó khởi động dịch vụ DHCP bằng câu lệnh:
sudo systemctl start dhcpd sudo systemctl enable dhcpd
2.2.2 Cấu hình định tuyến
Để gói tin có thể đi từ mạng 10.10.4.0/24 đến mạng 10.10.5.0/24, ta sẽ tạo file cấu hình Route tương ứng với Interface eth1 như sau:
sudo nvim /etc/sysconfig/network-scripts/route-eth1
Với cú pháp định tuyến <DestinationNetwork> via <NextHop> dev <NextHopInterface> Với ý nghĩa "gói tin từ DHCP-Server muốn đi đến mạng 10.10.5.0/24 thì sẽ phải đến cổng 10.10.4.21 bằng cách đi qua Interface eth1" Đặc biệt chú ý đến từ khóa dev (device) nếu không có từ khóa này thì cấu hình không có hiệu lực.
10.10.5.0/24 via 10.10.4.21 dev eth1
init 6 route -n
**
2.3 Relay-Agent
Ở trên máy ảo Relay-Agent (số hiệu CentOS8-14) chúng ta sẽ cài đặt gói dhcp-relay:
sudo dnf install dhcp-relay -y
2.3.1 Cấu hình chuyển tiếp gói tin
Vì Relay-Agent có 2 Interface eth1 và eth2 nằm ở 2 mạng khác nhau, có nhiệm vụ lắng nghe và chuyển tiếp yêu cầu cấp phát IP của Clients, vậy ta cần cấu hình để gói tin có thể đi 2 chiều giữa 2 Interface này.
Và khai báo nội dung sau:
INTERFACES=”eth1 eth2” # Relay-Agent Network Interfaces DHCPSERVERS="10.10.4.20" # DHCP-Server IP Address
Tiếp tục enable tính năng IP Forward:
sudo nvim /etc/sysctl.conf
Thêm vào file config nội dung sau:
net.ipv4.ip_forward=1
**
2.3.2 Cấu hình ExecStart
Đối với phiên bản CentOS ver 8 trở đi, bước này là cần thiết để khởi động được dịch vụ DHCP-Relay, nếu không thì ta có thể gặp lỗi như sau:
Bắt đầu, ta sẽ lấy một file config mẫu và copy vào đường dẫn "/etc/systemd/system/":
cp /lib/systemd/system/dhcrelay.service /etc/systemd/system/
Và chỉnh sửa dòng "ExecStart..." theo cú pháp <DHCP-Server IP Address> -i <Interface> Với 10.10.4.20 là địa chỉ IP của DHCP-Server và eth2 là Interface sẽ lắng nghe các yêu cầu từ Clients:
sudo nvim /etc/systemd/system/dhcrelay.service
Vậy là giờ chúng ta đã có thể khởi động dịch vụ DHCP-Relay:
sudo systemctl --system daemon-reload sudo systemctl restart dhcrelay
Kiểm tra tình trạng của dịch vụ DHCP-Relay bằng câu lệnh:
sudo systemctl status dhcrelay
**
2.4 Kiểm tra kết quả
Vậy là các bước cấu hình đều đã xong rồi. Giờ chúng ta sẽ mở sẵn log hệ thống trên DHCP-Server lên rồi khởi động 3 máy Clients để xem quá trình yêu cầu -> chuyển tiếp -> cấp phát IP có thành công hay không. Câu lệnh đọc log hệ thống và lọc đầu ra theo từ khóa "dhc"
tail -f /var/log/messages | grep -i "dhc"
Khởi động 3 máy Clients (số hiệu CentOS10/11/12)
- VM CemtOS-10 được cấp IP 10.10.5.100
- VM CentOS-11 được cấp IP 10.10.5.101
- VM CentOS-12 được cấp IP 10.10.5.102
"Ở đây ta thấy các bản tin Ack do Client trả lời Server với ý nghĩa đã chấp nhận IP do DHCP-Server cấp phát"Trong trường hợp chỉ có bản tin Request và Offer mà không thấy bản tin Ack, thì có nghĩa là gói tin từ Server không đến được với Client, có thể do lỗi định tuyến sai chẳng hạn.
**











Nhận xét
Đăng nhận xét