IPv6 trên OpenWrt gồm hai nửa: nhận địa chỉ/prefix từ upstream và phân phối prefix xuống LAN. Tôi không chỉ bật một checkbox rồi kết luận xong; cần xác định ISP dùng native DHCPv6, PPPoE, static, relay hay tunnel, sau đó kiểm tra RA, DHCPv6, route và source policy.1
Compliance và tính năng chung
Firmware mặc định thường có odhcp6c làm DHCPv6 client, odhcpd làm RA/DHCPv6 server và firewall IPv6; LuCI cần luci-proto-ipv6. Nếu tự build image, phải thêm các package tương ứng. Tài liệu hướng tới RFC 7084 nhưng vẫn liệt kê những phần chưa xử lý đầy đủ, nên tôi kiểm tra hành vi thực tế thay vì coi RFC là cam kết tuyệt đối.1
Các chức năng quan trọng gồm quản lý address/prefix/route, prefix unreachable-route, prefix class, source-based policy routing, SLAAC, stateless/stateful DHCPv6, DHCPv6-PD, lifetime, DAD, MTU và relay/NDP proxy.
Upstream cho WAN
Native IPv6 connection
Với upstream native, mẫu sau dùng wan6 kiểu dhcpv6 và phân phối prefix /60 xuống LAN. eth1 chỉ là interface ví dụ; topology thật có thể là VLAN, @wan hoặc device khác.1
| |
Với DHCPv6 qua WAN, firewall phải cho phép DHCPv6 reply UDP từ port 547 về port 546 như mẫu nguồn:
| |
PPP-based protocols và option ipv6
PPPoE/PPPoA cần option ipv6 trong interface cha wan. Giá trị 0 tắt IPv6; 1 bật IPCP6 negotiation nhưng để phần còn lại cho wan6 cấu hình thủ công; auto là mặc định, tạo wan_6 và chạy odhcp6c. Khi dùng auto, LAN cần ip6assign 64 hoặc prefix lớn hơn để redistribute xuống client. Tôi không tạo thêm wan6 thủ công nếu wan_6 tự sinh đã đúng với ISP.1
Các option của protocol dhcpv6
Bảng dưới đây giữ tên và ý nghĩa của các option chính trong nguồn, vì đây là nơi dễ cấu hình thiếu:
| Option | Kiểu/giá trị | Mặc định | Ý nghĩa thực hành |
|---|---|---|---|
reqaddress | try, force, none | try | Cách yêu cầu địa chỉ IPv6. |
reqprefix | auto, no, 0-64 | auto | Yêu cầu prefix; no chỉ lấy một địa chỉ cho chính router. |
clientid | hexstring | DUID-LL type 3 | Ghi đè DHCP client identifier. |
ifaceid | IPv6 suffix | link-local identifier | Ghi đè interface identifier nhận qua RA. |
dns | list IP | none | Bổ sung hoặc thay DNS DHCP khi peerdns là 0. |
peerdns | boolean | 1 | Có dùng DNS do DHCP cung cấp hay không. |
defaultroute | boolean | 1 | Có tạo default IPv6 route từ gateway nhận được. |
reqopts | list số | none | Các DHCP option bổ sung muốn yêu cầu. |
defaultreqopts | boolean | 1 | Nếu 0, chỉ yêu cầu option nêu trong reqopts. |
sendopts | chuỗi | none | Option gửi thêm, dạng option:value. |
noslaaconly | boolean | 0 | Không cho phép chỉ cấu hình bằng SLAAC. |
forceprefix | boolean | 0 | Bắt buộc DHCP message phải có IPv6 prefix. |
norelease | boolean | 0 | Không gửi RELEASE khi interface down. |
ip6prefix | IPv6 prefix | none | Thêm prefix do người dùng cung cấp để phân phối. |
iface_dslite | logical interface | none | Template tự cấu hình DS-Lite; 0 để tắt. |
zone_dslite | string | none | Firewall zone của DS-Lite interface. |
iface_map | string | none | Template cho map-e/map-t/lw4o6 autoconfiguration. |
zone_map | string | none | Firewall zone của map interface. |
iface_464xlat | string | none | Template cho 464xlat; 0 để tắt tự động cấu hình. |
zone_464xlat | string | none | Firewall zone của 464xlat. |
zone | string | none | Firewall zone nhận interface. |
sourcefilter | boolean | 1 | Bật source-based IPv6 routing. |
vendorclass | string | none | Vendor class, DHCP option 16. |
userclass | string | none | User class, DHCP option 15. |
delegate | boolean | 1 | Bật prefix delegation cho DS-Lite/map/464xlat. |
soltimeout | integer | 120 | Thời gian solicit tối đa. |
fakeroute | boolean | 1 | Fake default route khi RA không có route. |
ra_holdoff | integer giây | 3 | Khoảng tối thiểu giữa các lần nhận RA. |
noclientfqdn | boolean | 0 | Không gửi Client FQDN option 39. |
Nếu tự động cấu hình DS-Lite từ DHCPv6, source yêu cầu tạo interface với option auto 0, đặt tên vào iface_dslite và thêm interface đó vào firewall zone phù hợp.1
Static IPv6 connection
Khi ISP cấp tĩnh, giữ ip6addr, ip6gw, ip6prefix và DNS như mẫu dưới; các địa chỉ 2001:db80:: chỉ là dải tài liệu, không phải địa chỉ để chép vào mạng thật.1
| |
Downstream cho LAN
Các option static IPv6
ip6addr là địa chỉ gán cho interface; ip6ifaceid có thể là eui64, random hoặc suffix cố định; ip6gw là gateway; ip6assign là độ dài prefix giao xuống; ip6hint là subprefix ID dạng hex; ip6prefix là prefix route tới các interface khác; ip6class lọc prefix class; dns, dns_search, dns_metric và metric điều khiển DNS/route. Đây là các option khác với dhcpv6, không nên trộn theo thói quen.
Prefix delegation với ip6assign, ip6hint, ip6class
ip6assign 64giao các prefix/64cho interface.ip6hintgợi ý ID, ví dụ1234có thể tạo...:1234::/64.ip6class wan6chỉ nhận prefix class từwan6;localchỉ nhận ULA.- Nếu prefix không đủ, OpenWrt có thể đổi ID hoặc giảm độ dài;
ip6hintkhông phù hợp sẽ bị làm tròn xuống. ip6assignnhỏ hơn64cho phép DHCPv6-PD giao các/64còn lại cho downstream router.
Mẫu LAN/guest của nguồn minh họa cách giữ ULA, chọn prefix bằng ip6hint và chỉ cho guest nhận class wan6:1
| |
Trong ví dụ đó, lan nhận 2001:db80:0:10::/60 và fd00:db80:0:10::/60, còn guest chỉ nhận 2001:db80:0:abcd::/64. Nếu router ping6 được nhưng client LAN báo Destination unreachable: Unknown code 5 hoặc Source address failed ingress/egress policy, tôi kiểm tra ip6assign trên LAN trước.
Router Advertisement và DHCPv6
SLAAC và DHCPv6
Mặc định OpenWrt có thể quảng bá RA, cấp DHCPv6 stateless/stateful và DHCPv6-PD. Mẫu SLAAC + DHCPv6 server:
| |
Nguồn nhắc nếu dùng tunnel với prefix LAN cố định, phải bỏ ndp nếu không muốn NDP proxy.
Chỉ SLAAC
Nếu client chỉ dùng SLAAC, tắt DHCPv6 và bỏ RA flags như sau. Một số client, trong đó có Android theo ghi chú nguồn, có thể ưu tiên IPv4 khi DHCPv6 bị tắt:1
| |
IPv6 relay
Relay hữu ích khi upstream router không cấp DHCPv6-PD nhưng vẫn có IPv6. Đây là cấu hình relay hai phía của nguồn:
| |
Routing management
OpenWrt dùng source-address/source-interface policy routing để xử lý nhiều uplink. Prefix được delegate có thể kèm unreachable route để tránh loop. Tôi xem trạng thái bằng ifstatus wan6; mẫu rút gọn sau cho thấy address /64, prefix /56 được giao /60 cho LAN, cùng default route qua link-local gateway:1
| |
Hai điều cần đọc từ output: route 2001:db80::/48 và default route ::/0 đi qua fe80::800:27ff:fe00:0, nhưng chúng chỉ được dùng cho traffic có source address phù hợp. Vì vậy kiểm tra route thôi chưa đủ; phải test từ chính client LAN.
ULA prefix
ULA hữu ích cho suffix IPv6 ổn định với DHCPv6, site-to-site khi GUA thay đổi/mất, hoặc NAT66 khi ISP không delegate GUA. Nếu không có GUA, tôi xem đây là workaround có giới hạn, không tuyên bố rằng ULA tự tạo ra Internet-routable IPv6.
Kiểm tra và phục hồi
Sau khi reload network, kiểm tra ifstatus wan6, ip -6 addr, ip -6 route, RA trên client và firewall log. Nếu cấu hình mới làm mất mạng, quay về bản sao /etc/config/network và /etc/config/dhcp qua console; không dán nguyên ví dụ IP/prefix của nguồn vào hệ thống thật.


Góp Ý / Bình Luận / Đánh giá