Cấu hình Kea DHCPv6 trên Linux: Cấp phát IPv6 Stateful và Prefix Delegation thực tế

Network tutorial - IT technology blog
Network tutorial - IT technology blog

Vì sao SLAAC không đủ và khi nào bạn cần DHCPv6?

Khi mới triển khai IPv6 cho văn phòng khoảng 50 máy trạm kèm 10 máy chủ nội bộ, SLAAC (Stateless Address Autoconfiguration) thường là lựa chọn đầu tiên vì quá tiện. Router chỉ cần bắn gói tin Router Advertisement (RA), client tự bắt prefix rồi ghép với EUI-64 hoặc địa chỉ ngẫu nhiên là xong mạng. Mọi thứ mượt mà cho đến khi bạn phải quản trị hàng ngày.

Ba rắc rối lớn nhất mình gặp phải sau 3 tháng vận hành SLAAC:

  • Mất dấu thiết bị: Tính năng IPv6 Privacy Extensions trên Windows và macOS tự đổi IP sau mỗi 24 giờ. Khi có cảnh báo bảo mật từ firewall, việc truy vết máy nào đã tạo traffic lúc 10 giờ sáng là cơn ác mộng.
  • Cần IP cố định cho máy chủ nội bộ: Máy in, NAS hay database server cần địa chỉ cố định. Đặt static thủ công từng máy vừa tốn công, vừa dễ nhầm lẫn khi thay đổi hạ tầng.
  • Nhu cầu chia mạng con tự động (Prefix Delegation): Khi cấp dải mạng riêng cho các cụm router nhánh MikroTik hoặc máy chủ ảo Proxmox, việc phân bổ thủ công từng block /64 tốn nhiều thời gian và rất dễ trùng IP.

Gói isc-dhcp-server kinh điển đã chính thức ngừng phát triển (EOL). Kea DHCP do ISC phát triển là lựa chọn thay thế trực tiếp: dùng file JSON rõ ràng, hỗ trợ hook module, quản trị qua REST API và xử trị IPv6 Stateful (IA_NA) lẫn Prefix Delegation (IA_PD) rất tin cậy.

Cài đặt Kea DHCPv6 Server trên Ubuntu / Debian

Kea đã có sẵn trên repository mặc định từ Ubuntu 22.04 LTS và Debian 11 trở lên. Bạn chỉ cần cài gói server cùng bộ công cụ quản trị:

# Cập nhật repo và cài đặt Kea DHCPv6
sudo apt update
sudo apt install -y kea-dhcp6-server kea-admin

# Kiểm tra phiên bản
kea-dhcp6 -v

File cấu hình mặc định nằm ở /etc/kea/kea-dhcp6.conf. Hãy sao lưu bản gốc trước khi sửa đổi:

sudo cp /etc/kea/kea-dhcp6.conf /etc/kea/kea-dhcp6.conf.bak

Kịch bản cấu hình: Stateful IP & Prefix Delegation

Giả sử bạn có thông số mạng thực tế như sau:

  • Interface server: eth0 với IP tĩnh 2001:db8:1000:1::1/64.
  • Dải IPv6 ISP cấp cho toàn doanh nghiệp: 2001:db8:1000::/48.
  • Dải cấp phát máy trạm nội bộ (IA_NA): 2001:db8:1000:1::/64 (pool từ ::100 đến ::200).
  • Dải cấp cho Prefix Delegation (IA_PD): 2001:db8:1000:f000::/52 (chia thành 256 dải /60 cho các router con).

Soạn file cấu hình /etc/kea/kea-dhcp6.conf

Chỉnh sửa nội dung file cấu hình theo mẫu JSON dưới đây:

{
"Dhcp6": {
    "interfaces-config": {
        "interfaces": [ "eth0" ]
    },
    "control-socket": {
        "socket-type": "stdout"
    },
    "lease-database": {
        "type": "memfile",
        "persist": true,
        "name": "/var/lib/kea/kea-leases6.csv",
        "lfc-interval": 3600
    },
    "preferred-lifetime": 3000,
    "valid-lifetime": 7200,
    "renew-timer": 1000,
    "rebind-timer": 2000,

    "option-data": [
        {
            "name": "dns-servers",
            "data": "2001:db8:1000:1::1, 2001:4860:4860::8888"
        },
        {
            "name": "domain-search",
            "data": "itfromzero.local"
        }
    ],

    "subnet6": [
        {
            "id": 1,
            "subnet": "2001:db8:1000:1::/64",
            "interface": "eth0",
            "pools": [
                {
                    "pool": "2001:db8:1000:1::100 - 2001:db8:1000:1::200"
                }
            ],
            "pd-pools": [
                {
                    "prefix": "2001:db8:1000:f000::",
                    "prefix-len": 52,
                    "delegated-len": 60
                }
            ],
            "reservations": [
                {
                    "duid": "00:01:00:01:2c:4a:5b:6c:00:0c:29:8a:9d:11",
                    "ip-addresses": [ "2001:db8:1000:1::50" ]
                }
            ]
        }
    ]
}
}

Phân tích các block quan trọng

  • lease-database (memfile): Kea giữ lease trên RAM và ghi định kỳ ra file CSV. Cách này nhẹ, chạy mượt cho quy mô dưới 1.000 thiết bị mà không cần cài thêm MySQL hay PostgreSQL.
  • pools: Dải địa chỉ IP lẻ (IA_NA) cấp trực tiếp cho client trong subnet /64.
  • pd-pools: Khối tiền tố (IA_PD). Từ block /52, Kea tự động cắt thành các subnet /60 (mỗi subnet chứa 16 dải /64) để giao cho các router nhánh.
  • reservations: Gán IP cố định dựa trên DUID (DHCP Unique Identifier) của card mạng thay vì dùng địa chỉ MAC như IPv4.

Điểm mấu chốt: Cấu hình M-Flag và O-Flag trên Router RA

Client IPv6 không tự gửi gói tin DHCPv6 nếu router gateway không bật đúng cờ trong bản tin Router Advertisement. Nếu không chỉnh cờ này, client vẫn sẽ dùng SLAAC.

Trên gateway phát RA (dùng radvd, dnsmasq hoặc FRRouting), bạn cần bật 2 cờ:

  • M-Flag (Managed Address Configuration = 1): Bắt buộc client gửi yêu cầu xin địa chỉ IP từ DHCPv6 server.
  • O-Flag (Other Configuration = 1): Yêu cầu client lấy thêm thông tin phụ (DNS, search domain) từ DHCPv6.

Nếu dùng radvd, file /etc/radvd.conf cần có cấu hình tối thiểu sau:

interface eth0 {
    AdvSendAdvert on;
    AdvManagedFlag on;
    AdvOtherConfigFlag on;
    prefix 2001:db8:1000:1::/64 {
        AdvAutonomous off; # Tắt SLAAC tự sinh IP
    };
};

Kiểm tra cú pháp và khởi động dịch vụ

Đừng vội chạy service ngay. Hãy dùng công cụ kiểm tra cú pháp JSON tích hợp của Kea:

# Kiểm tra file cấu hình
sudo kea-dhcp6 -t /etc/kea/kea-dhcp6.conf

Nếu terminal trả về kết quả hợp lệ, bạn kích hoạt và khởi động Kea:

sudo systemctl restart kea-dhcp6-server
sudo systemctl enable kea-dhcp6-server
sudo systemctl status kea-dhcp6-server

Kiểm tra cổng dịch vụ

DHCPv6 server lắng nghe trên cổng UDP 547, còn client gửi từ UDP 546. Kiểm tra bằng lệnh ss:

sudo ss -u -l -n -p | grep 547
# Kết quả đúng: UNCONN 0 0 *:547 *:* users:(("kea-dhcp6",pid=...,fd=...))

Kiểm tra cấp phát từ máy Client

Trên máy trạm Linux, chạy lệnh sau để xin cấp phát Stateful IPv6 (IA_NA):

# Xóa lease cũ và gửi yêu cầu IA_NA mới
sudo dhclient -6 -r eth0
sudo dhclient -6 -N -v eth0

Trên router nhánh hoặc máy chủ ảo đóng vai trò gateway con, chạy lệnh để xin dải Prefix Delegation (IA_PD):

# Gửi yêu cầu nhận Prefix Delegation
sudo dhclient -6 -P -v eth0

Theo dõi log và xem bảng lease thực tế

Để bắt trọn chuỗi bắt tay (Solicit → Advertise → Request → Reply), bạn mở live log của systemd:

sudo journalctl -u kea-dhcp6-server -f

Muốn biết chính xác client nào đang giữ IP hoặc prefix nào, đọc trực tiếp file CSV lease:

cat /var/lib/kea/kea-leases6.csv

Mỗi dòng trong file thể hiện rõ địa chỉ IPv6 (hoặc prefix được ủy quyền), DUID, thời hạn lease và loại lease (IA_NA cho máy trạm hoặc IA_PD cho router con). Nhờ đó, việc quản trị và giám sát hạ tầng IPv6 trở nên minh bạch và dễ kiểm soát hơn rất nhiều.

Share: