Bookmark

Cấu hình IPv6 trên OpenWrt: WAN, prefix delegation, RA và relay

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# cat /etc/config/network
config interface wan
        option ipv6 1 # only required for PPP-based protocols
        ...

config interface wan6
        option device   eth1 # use same device as in wan-section or "@wan"
        option proto    dhcpv6

config interface lan
        option proto    static
        option ip6assign 60
        ...

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:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# cat /etc/config/firewall
....
config rule
        option target 'ACCEPT'
        option src 'wan'
        option proto 'udp'
        option dest_port '546'
        option name 'Allow DHCPv6 replies'
        option family 'ipv6'
        option src_port '547'

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:

OptionKiểu/giá trịMặc địnhÝ nghĩa thực hành
reqaddresstry, force, nonetryCách yêu cầu địa chỉ IPv6.
reqprefixauto, no, 0-64autoYêu cầu prefix; no chỉ lấy một địa chỉ cho chính router.
clientidhexstringDUID-LL type 3Ghi đè DHCP client identifier.
ifaceidIPv6 suffixlink-local identifierGhi đè interface identifier nhận qua RA.
dnslist IPnoneBổ sung hoặc thay DNS DHCP khi peerdns là 0.
peerdnsboolean1Có dùng DNS do DHCP cung cấp hay không.
defaultrouteboolean1Có tạo default IPv6 route từ gateway nhận được.
reqoptslist sốnoneCác DHCP option bổ sung muốn yêu cầu.
defaultreqoptsboolean1Nếu 0, chỉ yêu cầu option nêu trong reqopts.
sendoptschuỗinoneOption gửi thêm, dạng option:value.
noslaaconlyboolean0Không cho phép chỉ cấu hình bằng SLAAC.
forceprefixboolean0Bắt buộc DHCP message phải có IPv6 prefix.
noreleaseboolean0Không gửi RELEASE khi interface down.
ip6prefixIPv6 prefixnoneThêm prefix do người dùng cung cấp để phân phối.
iface_dslitelogical interfacenoneTemplate tự cấu hình DS-Lite; 0 để tắt.
zone_dslitestringnoneFirewall zone của DS-Lite interface.
iface_mapstringnoneTemplate cho map-e/map-t/lw4o6 autoconfiguration.
zone_mapstringnoneFirewall zone của map interface.
iface_464xlatstringnoneTemplate cho 464xlat; 0 để tắt tự động cấu hình.
zone_464xlatstringnoneFirewall zone của 464xlat.
zonestringnoneFirewall zone nhận interface.
sourcefilterboolean1Bật source-based IPv6 routing.
vendorclassstringnoneVendor class, DHCP option 16.
userclassstringnoneUser class, DHCP option 15.
delegateboolean1Bật prefix delegation cho DS-Lite/map/464xlat.
soltimeoutinteger120Thời gian solicit tối đa.
fakerouteboolean1Fake default route khi RA không có route.
ra_holdoffinteger giây3Khoảng tối thiểu giữa các lần nhận RA.
noclientfqdnboolean0Khô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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# cat /etc/config/network
config interface wan
        option device   eth1
        option proto    static
        option ip6addr  2001:db80::2/64   # Own address
        option ip6gw    2001:db80::1      # Gateway address
        option ip6prefix 2001:db80:1::/48 # Prefix addresses for distribution to downstream interfaces
        option dns      2001:db80::1      # DNS server

config interface lan
        option proto    static
        option ip6assign 60
        ...

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_metricmetric đ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 64 giao các prefix /64 cho interface.
  • ip6hint gợi ý ID, ví dụ 1234 có thể tạo ...:1234::/64.
  • ip6class wan6 chỉ nhận prefix class từ wan6; local chỉ nhận ULA.
  • Nếu prefix không đủ, OpenWrt có thể đổi ID hoặc giảm độ dài; ip6hint không phù hợp sẽ bị làm tròn xuống.
  • ip6assign nhỏ hơn 64 cho phép DHCPv6-PD giao các /64 cò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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# cat /etc/config/network
config globals globals
        option ula_prefix fd00:db80::/48

config interface wan6
        option proto static
        option ip6prefix 2001:db80::/56
        ...

config interface lan
        option proto static
        option ip6assign 60
        option ip6hint 10
        ...

config interface guest
        option proto static
        option ip6assign 64
        option ip6hint abcd
        list ip6class wan6
        ...

Trong ví dụ đó, lan nhận 2001:db80:0:10::/60fd00: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:

1
2
3
4
5
6
# cat /etc/config/dhcp
config dhcp lan
    option dhcpv6 server
    option ra server
    option ra_flags 'managed-config other-config'
    ...

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

1
2
3
4
5
6
# cat /etc/config/dhcp
config dhcp lan
    option dhcpv6 disabled
    option ra server
    list ra_flags 'none'
    ...

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:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# cat /etc/config/dhcp
config dhcp lan
    option dhcpv6 relay
    option ra relay
    option ndp relay
    ...

config dhcp wan6
    option dhcpv6 relay
    option ra relay
    option ndp relay
    option master 1
    option interface wan6

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
...
        "ipv6-address": [
                {
                        "address": "2001:db80::a00:27ff:fe67:cd9c",
                        "mask": 64,
                        "preferred": 1681,
                        "valid": 7081
                }
        ],
        "ipv6-prefix": [
                {
                        "address": "2001:db80:0:100::",
                        "mask": 56,
                        "preferred": 86282,
                        "valid": 86282,
                        "class": "wan6",
                        "assigned": {
                                "lan": {
                                        "address": "2001:db80:0:110::",
                                        "mask": 60
                                }
                        }
                }
        ],
        "route": [
                {
                        "target": "2001:db80::",
                        "mask": 48,
                        "nexthop": "fe80::800:27ff:fe00:0",
                        "metric": 1024,
                        "valid": 7081
                },
                {
                        "target": "::",
                        "mask": 0,
                        "nexthop": "fe80::800:27ff:fe00:0",
                        "metric": 1024,
                        "valid": 7081
                }
        ],
...

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/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.

Nguồn


  1. https://openwrt.org/docs/guide-user/network/ipv6/configuration — OpenWrt Wiki – IPv6 configuration. Nội dung được biên tập độc lập từ snapshot ngày 2023-11-27; dải địa chỉ trong code là dải ví dụ của tài liệu. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎


0 Bình luận

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