Vấn đề thực tế: Nỗi đau khi chia subnet IPv6 tĩnh
Cách đây sáu tháng, đội ngũ của chúng tôi đã thiết kế lại hệ thống định tuyến biên cho 12 văn phòng chi nhánh khu vực. Mỗi chi nhánh vận hành hai gateway chạy Ubuntu đảm nhiệm ba VLAN khách hàng, một mạng IoT và một phân đoạn lab nội bộ. Để đơn giản hóa việc triển khai ban đầu, chúng tôi đã cấu hình cứng (hardcode) các prefix /64 tĩnh trên từng interface downstream. Chúng tôi cứ ngỡ rằng ISP phía upstream sẽ hiếm khi thay đổi các dải mạng được cấp phát.
Nhưng chúng tôi đã lầm. Trong một đợt bảo trì lúc nửa đêm mà không có thông báo trước, ISP đã thay đổi dải /48 cấp phát cho chúng tôi. Ngay lập tức, toàn bộ 12 chi nhánh mất hoàn toàn kết nối IPv6.
Hơn 60 interface VLAN rơi vào tình trạng tê liệt, kéo theo gần bốn giờ bảo trì khẩn cấp khi các kỹ sư phải cập nhật cấu hình thủ công trên từng máy một. Việc quản lý thủ công hoàn toàn sụp đổ trước những biến động thực tế. Chúng tôi cần các router Linux có khả năng tự động yêu cầu dải mạng từ upstream, chia nhỏ chúng thành các subnet /64 và quảng bá lại dải mạng mới. Đó là lý do chúng tôi chuyển sang DHCPv6 Prefix Delegation (DHCPv6-PD).
Các khái niệm cốt lõi của DHCPv6 Prefix Delegation
Được định nghĩa trong RFC 3633 và cập nhật trong RFC 8415, DHCPv6-PD xử lý việc cấp phát địa chỉ khác biệt so với DHCPv4 stateful truyền thống hay DHCPv6 IA_NA. Thay vì cấp một địa chỉ IP duy nhất cho một interface, server phía upstream sẽ ủy quyền (delegate) toàn bộ một routing prefix—thường là /56 (256 subnet) hoặc /48 (65.536 subnet)—cho router biên của bạn.
Các vai trò và định danh quan trọng
- Delegating Router (DR): Router của ISP phía upstream hoặc switch core quản lý address pool IPv6 cha.
- Requesting Router (RR): Hệ thống biên Linux của bạn. Nó nhận dải mạng được cấp qua đường WAN và gán các subnet /64 đã chia cho các interface cục bộ.
- Identity Association for Prefix Delegation (IA_PD): Container của DHCPv6 chứa prefix được ủy quyền, valid lifetime (thường là 30 ngày) và preferred lifetime (thường là 7 ngày).
- SLAAC and Router Advertisements (RA): Các thiết bị đầu cuối không bao giờ giao tiếp trực tiếp qua DHCPv6-PD. Khi máy chủ Linux gán prefix /64 đã chia cho một cổng LAN, nó sẽ quảng bá prefix đó qua ICMPv6 RA để các thiết bị client tự động gán địa chỉ.
Cơ chế bắt tay bốn bước (Four-Way Handshake)
Quá trình đàm phán sử dụng cổng UDP 546 trên client và cổng 547 trên server:
- SOLICIT: Router Linux gửi một bản tin multicast đến
ff02::1:2để yêu cầu một IA_PD. - ADVERTISE: Router của ISP đề xuất các dải mạng ứng viên (ví dụ:
2001:db8:1a00::/56). - REQUEST: Router Linux chính thức yêu cầu dải mạng được đề xuất.
- REPLY: Router của ISP xác nhận cấp lease và chốt thời gian hết hạn preferred cũng như valid.
Thực hành: Xây dựng Gateway Linux với DHCPv6-PD
Xem xét mô hình tham chiếu sau. Một gateway chuyên dụng chạy Ubuntu 24.04 LTS với ba card mạng vật lý (NIC):
eth0: Uplink WAN kết nối tới ISP.eth1: Mạng LAN nội bộ doanh nghiệp (Subnet ID0x01).eth2: Mạng Khách và IoT (Subnet ID0x02).
Bước 1: Chuẩn bị Kernel và bật IPv6 Forwarding
Linux sẽ bỏ qua Router Advertisements ngay khi tính năng chuyển tiếp gói tin (packet forwarding) được kích hoạt. Vì router phải chuyển tiếp các gói tin quá cảnh nhưng vẫn cần học default route upstream thông qua RA trên WAN, hãy thiết lập accept_ra = 2 trên interface uplink.
# /etc/sysctl.d/90-ipv6-routing.conf
net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.default.forwarding = 1
# Chấp nhận RA trên WAN ngay cả khi đang chuyển tiếp gói tin
net.ipv6.conf.eth0.accept_ra = 2
# Tắt địa chỉ tạm thời (privacy addresses) trên các interface của router
net.ipv6.conf.all.use_tempaddr = 0
Áp dụng các cấu hình này vào kernel đang chạy:
sudo sysctl --system
Bước 2: Cấu hình systemd-networkd cho DHCPv6-PD
Các bản phân phối Linux hiện đại hỗ trợ chia nhỏ prefix một cách tự nhiên thông qua systemd-networkd. Bạn không cần phải cài các daemon độc lập như dhcp6c hay radvd.
Cấu hình uplink trên eth0 để yêu cầu IA_PD:
# /etc/systemd/network/10-wan.network
[Match]
Name=eth0
[Network]
DHCP=ipv6
IPv6AcceptRA=yes
LinkLocalAddressing=ipv6
[DHCPv6]
PrefixDelegation=yes
WithoutRA=solicit
Gán prefix /64 đã chia đầu tiên (Subnet 1) cho mạng LAN văn phòng trên eth1:
# /etc/systemd/network/20-lan.network
[Match]
Name=eth1
[Network]
LinkLocalAddressing=ipv6
IPv6SendRA=yes
DHCPPrefixDelegation=yes
[DHCPPrefixDelegation]
SubnetId=1
[IPv6SendRA]
Managed=no
OtherInformation=no
RouterLifetimeSec=1800
Chia prefix /64 thứ hai (Subnet 2) cho các thiết bị khách trên eth2:
# /etc/systemd/network/30-guest.network
[Match]
Name=eth2
[Network]
LinkLocalAddressing=ipv6
IPv6SendRA=yes
DHCPPrefixDelegation=yes
[DHCPPrefixDelegation]
SubnetId=2
[IPv6SendRA]
Managed=no
OtherInformation=no
RouterLifetimeSec=1800
Áp dụng cấu hình:
sudo systemctl restart systemd-networkd
Bước 3: Phương án thay thế với WIDE-DHCPv6 (dhcp6c) và radvd
Nếu bạn sử dụng Debian 11, Alpine hoặc các bản image tùy biến của OpenWrt không có systemd, hãy sử dụng bộ công cụ truyền thống wide-dhcpv6-client và radvd.
Cài đặt cả hai tiện ích:
sudo apt-get update && sudo apt-get install -y wide-dhcpv6-client radvd
Cấu hình client ủy quyền trong /etc/wide-dhcpv6/dhcp6c.conf:
interface eth0 {
send ia-pd 0;
request domain-name-servers;
};
id-assoc pd 0 {
prefix-interface eth1 {
sla-id 1;
sla-len 8; # Thêm 8 bit: 56 + 8 = /64
ifid 1; # Router nhận ::1 trên interface này
};
prefix-interface eth2 {
sla-id 2;
sla-len 8;
ifid 1;
};
};
Khởi động daemon client:
sudo systemctl restart wide-dhcpv6-client
sudo systemctl restart radvd
Bước 4: Kiểm tra và phân tích lưu lượng mạng
Kiểm tra xem eth1 và eth2 đã nhận các địa chỉ Global Unicast Address (GUA) có khả năng định tuyến hay chưa:
ip -6 addr show dev eth1
ip -6 addr show dev eth2
Bạn sẽ thấy các địa chỉ khớp với dải mạng upstream của mình, chẳng hạn như 2001:db8:1a00:1::1/64 trên eth1. Tiếp theo, kiểm tra bảng định tuyến kernel để xác nhận default gateway học được từ quảng bá trên WAN:
ip -6 route show default
Bắt gói tin trao đổi lease trên interface WAN để kiểm tra quá trình đàm phán timer:
sudo tcpdump -vvn -i eth0 port 546 or port 547
Kiểm tra output của khối IA_PD. Bạn sẽ thấy prefix được cấp phát, preferred lifetime (ví dụ: preferred-lifetime 604800) và valid lifetime (ví dụ: valid-lifetime 2592000).
Bước 5: Quy tắc Firewall cho DHCPv6-PD
Chính sách drop nghiêm ngặt thường chặn các gói DHCPv6 trước khi quá trình bắt tay hoàn tất. Hãy cập nhật nftables để cho phép đàm phán link-local trên interface WAN:
# /etc/nftables.conf
table inet filter {
chain input {
type filter hook input priority filter; policy drop;
# Cho phép các luồng established và loopback
ct state established,related accept
iifname "lo" accept
# Cho phép phản hồi DHCPv6 từ các router upstream link-local
iifname "eth0" ip6 saddr fe80::/10 udp sport 547 udp dport 546 accept
# Cho phép các bản tin ICMPv6 quan trọng cho neighbor và router discovery
ip6 nexthdr icmpv6 icmpv6 type { nd-neighbor-solicit, nd-neighbor-advert, nd-router-advert } accept
}
}
Kinh nghiệm thực tế sau sáu tháng vận hành Production
Tự động hóa với DHCPv6-PD đã xóa bỏ hoàn toàn việc quản lý địa chỉ thủ công tại các văn phòng chi nhánh. Trong một bài kiểm tra đổi địa chỉ (renumbering) từ phía upstream vào tháng trước, ISP đã thay đổi prefix cấp phát từ 2001:db8:1a00::/56 sang 2001:db8:2b00::/56. Các gateway đã nhận diện thay đổi, gán địa chỉ mới cho các interface downstream và phát quảng bá RA cập nhật chỉ trong chưa đầy 30 giây mà không làm gián đoạn bất kỳ kết nối TCP nào.
Ba quy tắc vận hành mà chúng tôi luôn tuân thủ:
- Cố định DUID của bạn: Hãy sao lưu và giữ nguyên
/etc/systemd/networkd.confhoặc/var/lib/dhcpv6/dhcp6c_duidkhi cài đặt lại máy. Nếu DUID thay đổi, ISP sẽ coi gateway là thiết bị mới và cấp một prefix hoàn toàn khác. - Luôn yêu cầu prefix /56: Một số nhà mạng mặc định chỉ cấp một dải /64 duy nhất nếu bạn không chỉ định rõ. Một dải /56 cung cấp tới 256 subnet, mang lại dư dả không gian cho mạng Docker, hypervisor và các VLAN khách.
- Kiểm tra multicast snooping phía upstream: Nếu cổng WAN kết nối qua một switch managed trung gian, hãy đảm bảo tính năng MLD snooping không làm mất (drop) các khung multicast
ff02::1:2trước khi chúng tới được điểm kết nối của nhà cung cấp.

