Loading...

Cách khắc phục lỗi "DHCP Server Pool Exhausted, Empty, Assignment Failure" trên Router, Switch Cisco

Trên router hoặc switch Layer 3 Cisco đóng vai trò DHCP server, đôi khi người dùng không nhận được IP dù số client kết nối rất ít, và log báo "DHCP Server Pool Exhausted, Empty, Assignment Failure". Bài viết này đi qua một ca thực tế trên Catalyst 4507R+E, từ đọc log, kiểm tra pool và conflict đến cách khôi phục quỹ IP và cấu hình để lỗi không quay lại.

⚡ Điểm nhanh

  • Triệu chứng: client không nhận được IP, log DHCP server báo address pool ... is empty, ASSIGNMENT FAILURE, due to: POOL EXHAUSTED.
  • Pool "hết" không đồng nghĩa có nhiều client: IP khả dụng = Tổng địa chỉ − Excluded (exclude thủ công + conflict) − Leased. Ở ví dụ trong bài: 254 − 251 − 3 = 0, dù chỉ có 3 client đang kết nối.
  • Nguyên nhân thường gặp: danh sách conflict phình to, subnet quá nhỏ so với số client, lease quá dài hoặc binding cũ không giải phóng, thiết bị reload làm mất cơ sở dữ liệu binding, tấn công DHCP starvation.
  • Lệnh cốt lõi: show ip dhcp pool, show ip dhcp conflict, show ip dhcp binding, clear ip dhcp conflict *.
  • Phòng ngừa: cảnh báo ngưỡng sử dụng pool (utilization mark), chọn lease phù hợp, DHCP snooping, và xử lý conflict logging đúng cách.

Phân tích log và xử lý conflict trên thiết bị thực tế

Khi trong hệ thống mạng xuất hiện hiện tượng: người dùng không thể kết nối với mạng do họ không thể nhận được địa chỉ IP từ DHCP server, việc đầu tiên chúng ta cần làm là bật tính năng debug trên DHCP server để kiểm tra các log thông báo:

4507R+E# debug ip dhcp server packets
4507R+E# debug ip dhcp server events
Nov  6 13:46:26.742: DHCPD: Sending notification of DISCOVER:
Nov  6 13:46:26.742: DHCPD: htype 1 chaddr 34bb.1f9b.17f9
Nov  6 13:46:26.742: DHCPD: giaddr = 192.168.7.10
Nov  6 13:46:26.742: DHCPD: interface = Vlan7
Nov  6 13:46:26.742: DHCPD: class id 426c61636b4265727279
Nov  6 13:46:26.742: DHCPD: out_vlan_id 0
Nov  6 13:46:26.742: DHCPD: Sending notification of DISCOVER:
Nov  6 13:46:26.742: DHCPD: htype 1 chaddr 34bb.1f9b.17f9
Nov  6 13:46:26.742: DHCPD: giaddr = 192.168.7.10
Nov  6 13:46:26.742: DHCPD: interface = Vlan7
Nov  6 13:46:26.742: DHCPD: class id 426c61636b4265727279
Nov  6 13:46:26.742: DHCPD: out_vlan_id 0
Nov  6 13:46:26.742: DHCPD: subnet [192.168.7.1,192.168.7.254] in address pool Guest-WiFi-VLAN is empty.
Nov  6 13:46:26.742: DHCPD: Sending notification of ASSIGNMENT FAILURE:
Nov  6 13:46:26.742: DHCPD: htype 1 chaddr 34bb.1f9b.17f9
Nov  6 13:46:26.742: DHCPD: remote id 020a0000c0a8070107000000
Nov  6 13:46:26.742: DHCPD: giaddr = 192.168.7.10
Nov  6 13:46:26.742: DHCPD: interface = Vlan7
Nov  6 13:46:26.742: DHCPD: class id 426c61636b4265727279
Nov  6 13:46:26.742: DHCPD: out_vlan_id 0
Nov  6 13:46:26.742: DHCPD: Sending notification of ASSIGNMENT_FAILURE:
Nov  6 13:46:26.742: DHCPD: due to: POOL EXHAUSTED

Căn cứ vào các thông tin log nhận được chúng ta thấy rằng quỹ địa chỉ IP cho pool Guest-WiFi-VLAN đã hết điều này có nghĩa là DHCP server (trên Router, switch Cisco) đã hết IP để cấp cho người dùng. Giờ ta cùng tìm hiểu lý do tại sao lại hết quỹ địa chỉ IP. Một lý do phổ biến là số lượng người dùng truy cập đến nhiều hơn quỹ địa chỉ IP trên DHCP server. Chúng ta cùng kiểm tra cấu hình trên Router, Switch Cisco:

4507R+E# show run
...output omitted....
!
ip dhcp excluded-address 192.168.7.1 192.168.7.20
!
ip dhcp pool Guest-WiFi-VLAN
 network 192.168.7.0 255.255.255.0
 default-router 192.168.7.1
 dns-server 8.8.8.8 8.8.4.4
 lease 0 2
!
…output omitted

Như vậy chúng ta đã loại trừ 20 địa chỉ IP đầu tiên, quỹ IP còn lại 234 địa chỉ, leased time (thời gian cho thuê IP) của DHCP server là 2 giờ. Tiếp đến kiểm tra xem có bao nhiêu Client đã kết nối đến:

4507R+E# show ip dhcp binding | inc Vlan7
IP address      Client-ID/Hardware address   Lease expiration        Type       State      Interface
192.168.7.81    019c.65b0.3760.e3            Nov 06 2014 05:19 PM    Automatic  Active     Vlan7
192.168.7.92    012c.2997.58a3.b5            Nov 06 2014 05:42 PM    Automatic  Active     Vlan7
192.168.7.134   0114.8fc6.bd62.f2            Nov 06 2014 04:41 PM    Automatic  Active     Vlan7

4507R+E# show ip dhcp pool
Pool Guest-WiFi-VLAN :
 Utilization mark (high/low) : 100 / 0
 Subnet size (first/next)    : 0 / 0
 Total addresses             : 254
 Leased addresses            : 3
 Excluded addresses          : 251
 Pending event               : none
 1 subnet is currently in the pool :
 Current index             IP address range                    Leased / Excluded / Total
     0.0.0.0               192.168.7.1 - 192.168.7.254            3     / 231    / 254

Như vậy chỉ có 3 Client kết nối đến, nhưng Excluded address (địa chỉ IP bị loại trừ) là 251 địa chỉ. Mục Current index là địa chỉ IP tiếp theo sẽ được cấp phát, nhưng kết quả lại là 0.0.0.0 như vậy có nghĩa quỹ địa chỉ IP của pool đã hết. Bước tiếp theo kiểm tra trên DHCP server xem có xung đột nào không:

4507R+E# show ip dhcp conflict
IP address          Detection method   Detection time          VRF
192.168.7.59      Ping                         Sep 10 2014 06:17 AM  
192.168.7.62      Ping                         Sep 10 2014 06:35 AM  
192.168.7.21      Gratuitous ARP         Sep 10 2014 09:58 AM  
192.168.7.67      Gratuitous ARP         Sep 10 2014 10:54 AM  
192.168.7.69      Gratuitous ARP         Sep 10 2014 12:08 PM  
192.168.7.96      Gratuitous ARP         Sep 10 2014 12:11 PM  
192.168.7.100     Ping                        Sep 10 2014 01:37 PM  
192.168.7.129     Gratuitous ARP        Sep 11 2014 02:13 AM  
192.168.7.156     Gratuitous ARP        Sep 11 2014 02:19 AM  
192.168.7.164     Gratuitous ARP        Sep 11 2014 04:52 AM  
192.168.7.158     Gratuitous ARP        Sep 11 2014 05:46 AM  
192.168.7.230     Gratuitous ARP        Sep 11 2014 04:35 PM  
192.168.7.236     Gratuitous ARP        Sep 11 2014 09:00 PM  
…output omitted

Qua kiểm tra chúng ta thấy được có tất cả 231 địa chỉ IP bị conflict, các địa chỉ này cũng sẽ bị DHCP server loại trừ khỏi quỹ địa chỉ IP do đó dẫn tới không còn IP để cấp phát cho các client tiếp theo kết nối đến. Việc cần làm là xóa sạch bảng địa chỉ IP xung đột này để khôi phục lại quỹ IP cho Pool trên DHCP server:

4507R+E# clear ip dhcp conflict *
4507R+E# show ip dhcp conflict
         IP address        Detection method   Detection time          VRF

4507R+E#

Giờ thì các Client sẽ có thể kết nối tới hệ thống mạng thành công.

Vì sao pool báo "Empty" khi chỉ có vài client?

Nếu bạn chưa nắm rõ quy trình client xin IP (Discover, Offer, Request, Acknowledge) và vai trò của giaddr trong log debug ở trên, hãy xem trước Bài 39: DHCP, cơ chế DORA, cấu hình DHCP Server/Relay.

DHCP server trên Cisco IOS và IOS-XE không chỉ trừ các địa chỉ đã cấp. Nó còn loại khỏi quỹ cấp phát:

  1. Các địa chỉ khai báo bằng ip dhcp excluded-address (ở ví dụ là 20 địa chỉ từ 192.168.7.1 đến 192.168.7.20).
  2. Các địa chỉ nằm trong danh sách conflict (ở ví dụ là 231 địa chỉ).
  3. Các địa chỉ đang có binding còn hiệu lực (ở ví dụ là 3 địa chỉ).

Ghép lại: 20 + 231 = 251 địa chỉ Excluded, cộng 3 địa chỉ Leased là 254, bằng đúng tổng số địa chỉ của /24. Con trỏ Current index vì thế trả về 0.0.0.0, nghĩa là không còn địa chỉ nào để cấp.

Vì sao pool DHCP báo hết địa chỉ khi chỉ có 3 client

Danh sách conflict được ghi nhận theo hai cách, hiển thị ở cột Detection method:

  • Ping: DHCP server ping thử địa chỉ sắp cấp và thấy có thiết bị khác đang trả lời.
  • Gratuitous ARP: có thiết bị khác thông báo đang dùng chính địa chỉ đó trên mạng.

Các nguyên nhân thường gặp và cách kiểm tra

Nguyên nhânDấu hiệuLệnh kiểm traHướng xử lý
Danh sách conflict phình to Excluded lớn bất thường, Leased thấp show ip dhcp conflict Tìm nguồn conflict, sau đó clear ip dhcp conflict *
Subnet quá nhỏ so với số client Leased tiệm cận tổng số địa chỉ khả dụng show ip dhcp pool Mở rộng subnet (ví dụ /24 lên /23) hoặc tách VLAN
Lease quá dài, binding cũ còn lại Nhiều binding của thiết bị đã rời mạng show ip dhcp binding Giảm lease, xóa binding cụ thể bằng clear ip dhcp binding <IP>
Reload thiết bị khi bật conflict logging mà không có DHCP database Conflict tăng vọt ngay sau khi reload show ip dhcp conflict, show logging Dùng DHCP database agent, hoặc tắt conflict logging (xem phần phòng ngừa)
Thiết bị gán IP tĩnh trong dải cấp phát động Cùng một IP bị báo conflict lặp lại nhiều lần show ip arp <IP> Đưa IP tĩnh vào excluded-address hoặc đổi sang IP ngoài dải
MAC ngẫu nhiên trên điện thoại (private Wi-Fi address) Mỗi lần kết nối lại tạo thêm một binding mới show ip dhcp binding Giảm lease cho mạng guest, tăng kích thước pool
Tấn công DHCP starvation Hàng loạt DISCOVER từ nhiều MAC khác nhau trong thời gian ngắn debug ip dhcp server packets DHCP snooping, giới hạn tốc độ DHCP trên cổng access

Quy trình xử lý từng bước

Quy trình 5 bước xử lý lỗi DHCP Pool Exhausted trên Cisco

Bước 1. Xem tình trạng pool

4507R+E# show ip dhcp pool Guest-WiFi-VLAN

So sánh ba con số Leased, Excluded, Total. Nếu Excluded lớn hơn nhiều so với số exclude đã cấu hình thủ công, phần chênh lệch chính là các địa chỉ conflict.

Bước 2. Tìm nguồn gây conflict trước khi xóa

Chọn vài địa chỉ trong danh sách conflict để truy vết:

4507R+E# show ip dhcp conflict
4507R+E# show ip arp 192.168.7.59
4507R+E# show mac address-table address 0123.4567.89ab

Từ MAC tìm được, xác định cổng switch và thiết bị phía sau. Nếu đó là thiết bị cấu hình IP tĩnh, hãy chuyển sang IP ngoài dải DHCP hoặc thêm vào excluded-address. Bỏ qua bước này, danh sách conflict sẽ đầy lại sau một thời gian.

Bước 3. Xóa conflict để khôi phục quỹ IP

4507R+E# clear ip dhcp conflict *

Nếu chỉ muốn giải phóng một địa chỉ, dùng clear ip dhcp conflict 192.168.7.59.

Bước 4. Xóa binding cũ (nếu cần)

4507R+E# clear ip dhcp binding 192.168.7.81

Ưu tiên xóa từng địa chỉ cụ thể. Chỉ dùng clear ip dhcp binding * trong giờ thấp điểm, vì mọi client sẽ phải xin cấp phát lại.

Bước 5. Kiểm tra lại và tắt debug

4507R+E# show ip dhcp pool Guest-WiFi-VLAN
4507R+E# show ip dhcp server statistics
4507R+E# undebug all

Đừng để lệnh debug ip dhcp server chạy liên tục trên thiết bị đang tải cao. Hãy chạy undebug all ngay khi đã thu đủ log.

Cấu hình phòng ngừa để lỗi không quay lại

1. Cảnh báo sớm khi pool sắp cạn

ip dhcp pool Guest-WiFi-VLAN
 network 192.168.7.0 255.255.255.0
 default-router 192.168.7.1
 dns-server 8.8.8.8 8.8.4.4
 lease 0 2
 utilization mark high 85 log
 utilization mark low 60 log

Khi mức sử dụng vượt 85%, thiết bị ghi log về syslog để bạn xử lý trước khi người dùng bị ảnh hưởng. Cú pháp utilization mark có thể khác nhau giữa các phiên bản IOS-XE, hãy kiểm tra bằng dấu ? trước khi áp dụng.

2. Điều chỉnh lease theo từng loại mạng

Mạng guest có nhiều thiết bị vãng lai nên dùng lease ngắn (ví dụ lease 0 1 hoặc lease 0 2), để địa chỉ của thiết bị đã rời mạng sớm được thu hồi. Mạng nhân viên cố định có thể dùng lease dài hơn để giảm lưu lượng DHCP.

3. Xử lý conflict logging đúng cách

Theo hướng dẫn cấu hình DHCP Server của Cisco IOS XE, conflict xảy ra khi hai thiết bị dùng cùng một địa chỉ IP, và DHCP server phát hiện bằng ping và gratuitous ARP trong lúc cấp địa chỉ. Mặc định server ping địa chỉ trong pool 2 lần, chờ tối đa 2 giây cho mỗi gói trước khi cấp cho client. Có thể chỉnh bằng ip dhcp ping packets và ip dhcp ping timeout; ví dụ trong tài liệu Operate a Robust IOS XE DHCP Server dùng ip dhcp ping packets 3 và ip dhcp ping timeout 400 (đơn vị mili giây). Tài liệu này cũng nêu ip dhcp ping packets 0 sẽ tắt kiểm tra ping, đổi lại tăng rủi ro nhiều thiết bị dùng chung một IP.

Ghi nhận conflict (conflict logging) được bật mặc định. Binding DHCP lưu trong bộ nhớ tạm, nên bị mất khi thiết bị reload hoặc mất điện. Cisco cho biết nếu bật conflict logging mà không cấu hình DHCP database agent, sau khi reboot có thể xuất hiện conflict giả và làm các địa chỉ bị loại khỏi pool, đây chính là một nguyên nhân gây cạn pool. Cisco khuyến nghị dùng database agent; nếu không dùng thì nên tắt ghi nhận conflict. Có hai hướng xử lý:

! Hướng A: lưu binding ra bộ nhớ ngoài (ví dụ flash) để không mất khi reload
ip dhcp database flash:/dhcp-bindings.db

! Hướng B: nếu không dùng DHCP database, tắt ghi nhận conflict
no ip dhcp conflict logging

Ví dụ flash: ở trên lấy từ tài liệu Operate a Robust IOS XE DHCP Server; ngoài flash, Cisco còn mô tả lưu binding lên máy chủ từ xa (DHCP database agent).

4. Chống DHCP starvation bằng DHCP snooping

ip dhcp snooping
ip dhcp snooping vlan 7
!
interface GigabitEthernet1/0/10
 description Cong access nguoi dung
 ip dhcp snooping limit rate 15
!
interface GigabitEthernet1/0/48
 description Uplink hoac cong toi DHCP server
 ip dhcp snooping trust

Chỉ đặt limit rate trên cổng access cuối. Không đặt giới hạn thấp trên cổng nối tới AP hoặc WLC, vì các cổng này gom lưu lượng DHCP của rất nhiều client và có thể bị chặn nhầm.

5. Mở rộng quỹ địa chỉ khi nhu cầu thực sự vượt dung lượng

Khi số client đồng thời thường xuyên áp sát tổng số địa chỉ, hãy mở rộng subnet (ví dụ từ /24 lên /23) hoặc tách thành nhiều VLAN. Việc này kéo theo sửa địa chỉ SVI, network trong pool, các dải excluded-address và các ACL hoặc NAT liên quan, nên cần thực hiện trong giờ bảo trì.

So sánh nhanh các biện pháp

Biện phápTác dụngKhi nào dùngLưu ý
Xóa conflict Khôi phục ngay quỹ IP Pool đang cạn, người dùng không nhận được IP Phải tìm nguồn conflict, nếu không sẽ đầy lại
Giảm lease Thu hồi IP của thiết bị đã rời mạng nhanh hơn Mạng guest, Wi-Fi công cộng Tăng lưu lượng DHCP renew
Mở rộng subnet Tăng dung lượng thực sự Số client đồng thời thường xuyên áp sát tổng IP Cần thay đổi địa chỉ SVI, ảnh hưởng nhiều thành phần
DHCP database hoặc tắt conflict logging Tránh conflict ảo sau khi reload Thiết bị từng cạn pool sau reload Chọn một hướng, tùy có dùng database hay không
DHCP snooping, limit rate Ngăn cạn pool do tấn công Mạng mở như guest Wi-Fi Đặt limit rate sai chỗ có thể chặn nhầm client hợp lệ
Utilization mark Cảnh báo sớm qua syslog Mọi pool quan trọng Cần có hệ thống nhận syslog để phát huy tác dụng

Câu hỏi thường gặp

Pool Exhausted có luôn nghĩa là có quá nhiều client? Không. Ở ví dụ trong bài chỉ có 3 client nhưng pool vẫn báo hết, vì 231 địa chỉ nằm trong danh sách conflict. Luôn đối chiếu Leased, Excluded và Total trước khi kết luận cần mở rộng subnet.

Xóa conflict bằng clear ip dhcp conflict * có an toàn không? Lệnh này không ảnh hưởng các client đang có binding hợp lệ. Địa chỉ được xóa khỏi danh sách sẽ được kiểm tra lại trước khi cấp, vì vậy IP thực sự đang bị thiết bị khác chiếm sẽ vẫn bị phát hiện lại. Điều cần làm thêm là truy tìm nguồn gây conflict, nếu không danh sách sẽ đầy trở lại.

Có nên tắt ping-check bằng ip dhcp ping packets 0? Chỉ nên cân nhắc ở môi trường quản lý địa chỉ rất chặt. Cisco ghi nhận việc tắt này làm tăng nguy cơ nhiều thiết bị dùng chung một IP.

Lease nên đặt bao lâu? Không có con số cố định. Mạng guest nhiều thiết bị vãng lai thường dùng 1 đến 2 giờ, mạng nhân viên cố định có thể dùng nhiều giờ hoặc cả ngày. Hãy chọn theo mức quay vòng thực tế của client.

Các lệnh trong bài có áp dụng cho cả router và switch Layer 3 không? Có, cùng nhóm lệnh ip dhcp trên Cisco IOS và IOS-XE, từ router ISR đến switch Catalyst. Với dịch vụ DHCP quy mô lớn, Cisco khuyến nghị cân nhắc DHCP server chuyên dụng thay vì tận dụng switch, đặc biệt trên các Catalyst cũ chạy IOS-XE 3.xE.

Làm sao phát hiện pool sắp cạn trước khi người dùng báo lỗi? Cấu hình utilization mark high ... log trong pool và gửi syslog về hệ thống giám sát. Kết hợp theo dõi định kỳ show ip dhcp pool để so sánh xu hướng Leased và Excluded.

Thông tin liên quan