目錄
- Ubuntu22.04 IPv6 測試配置手冊
- 00 設備參數
- 01 禁止網絡服務控制網口eth1
- 1.1 解除netplan對eth1的控制
- 1.2 解除systemd-networkd對eth1的控制
- 1.3 解除NetworkManager對eth1的控制
- 02 配置系統啓動參數
- 2.1 確認是否存在all參數(全局參數),並註釋
- 2.2 確認是否存在舊eth1參數
- 2.3 寫入新eth1參數
- 03 開展IPv6測試
- 3.1 配置測試機TN
- 3.2 配置測試機TUN
- 3.3 開展測試
- 3.4 測試中的特殊操作
- 3.4.1 重啓網卡
- 3.4.2 觀察網卡狀態
- 3.4.3 ping6
- 3.5 測試未通過項
- 3.5.1 RFC 8200(IPv6 Specification)
- 3.5.2 RFC 4861(Neighbor Discovery for IPv6)
- 3.5.3 RFC 4862(IPv6 Stateless Address Autoconfiguration)
- 3.5.4 RFC 8201(Path MTU Discovery for IPv6)
- 3.5.5 RFC 4443(ICMPv6)
Ubuntu22.04 IPv6 測試配置手冊
00 設備參數
- Linux 發行版:
Ubuntu22.04 - Linux kernel:
5.19.0-28-generic - 控制網口:
eth0 - 測試網口:
eth1
01 禁止網絡服務控制網口eth1
在Ubuntun22.04系統下開展IPv6測試,需要在逐一解除netplan、systemd-networkd和NetworkManager對eth1的控制後,直接使用sysctl配置內核參數。
以下為詳細操作步驟:
1.1 解除netplan對eth1的控制
進入netplan配置目錄:
cd /etc/netplan
如當前文件夾下如存在xml配置文件,則查看是否存在並刪除eth1相關配置。
如配置文件為:
network:
version: 2
renderer: networkd
ethernets:
eth0:
dhcp4: false
addresses:
- 192.165.56.155/24
routes:
- to: default
via: 192.165.56.1
eth1: # 待刪除
dhcp4: false # 待刪除
eth2:
dhcp4: false
addresses:
刪除後eth1配置後為:
network:
version: 2
renderer: networkd
ethernets:
eth0:
dhcp4: false
addresses:
- 192.165.56.155/24
routes:
- to: default
via: 192.165.56.1
eth2:
dhcp4: false
addresses:
刪除後執行
netplan apply
完成以上操作,即可以解除netplan對網卡eth1的控制
1.2 解除systemd-networkd對eth1的控制
進入systemd-networkd配置目錄 /etc/systemd/network
cd /etc/systemd/network
查看可能控制eth1的文件
ls -la *.network
如果有eth1相關配置,則備份或刪除之:
# 創建備份目錄
mkdir backup
# 備份文件
mv *eth1*.network backup
# 或者刪除文件
rm -f *eth1*.network backup
重啓systemd-networkd服務:
systemctl restart systemd-networkd
1.3 解除NetworkManager對eth1的控制
檢查NetworkManager是否在運行並且管理網卡:
# 檢查NetworkManager服務狀態
systemctl status NetworkManager
# 查看NetworkManager管理的所有設備
nmcli device status
如果發現eth1被NetworkManager管理(狀態為connected或disconnected),可以使用以下方法解除控制:
# 編輯NetworkManager主配置文件
vim /etc/NetworkManager/NetworkManager.conf
# 在[main]或[keyfile]部分添加以下內容:
# [keyfile]
# unmanaged-devices=interface-name:eth1
重啓NetworkManager使配置生效
# 重啓NetworkManager服務
systemctl restart NetworkManager
# 驗證eth1是否已被設置為未託管
nmcli device status | grep eth1
02 配置系統啓動參數
2.1 確認是否存在all參數(全局參數),並註釋
查詢是否有全局的網卡參數,可能包含all、ALL、default等關鍵詞:
# 進入sysctl配置目錄
cd /etc/sysctl.d/
# 搜索所有conf文件中包含all/ALL/default的配置
grep -iHr "all\|default" *.conf 2>/dev/null || true
# 同時檢查主配置文件
grep -i "all\|default" /etc/sysctl.conf 2>/dev/null || true
如果存在形如:
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
編輯對應文件,將其註釋:
# net.ipv6.conf.all.disable_ipv6 = 1
# net.ipv6.conf.default.disable_ipv6 = 1
重新加載系統配置
sysctl --system
重啓網卡
ip link set eth1 down; ip link set eth1 up
2.2 確認是否存在舊eth1參數
搜索所有可能存在的eth1相關配置:
# 在sysctl配置目錄中搜索eth1相關配置
cd /etc/sysctl.d/
grep -iHr "eth1\|\.eth1\." *.conf 2>/dev/null || true
# 在主配置文件中搜索
grep -i "eth1\|\.eth1\." /etc/sysctl.conf 2>/dev/null || true
# 檢查內核啓動參數
grep -i "eth1\|ipv6" /proc/cmdline 2>/dev/null || true
# 查看當前生效的eth1相關內核參數
sysctl -a 2>/dev/null | grep -i "\.eth1\." | head -20
如果發現以下類型的舊eth1配置,需要刪除或註釋掉:
net.ipv6.conf.eth1.disable_ipv6 = 1
net.ipv6.conf.eth1.accept_ra = 0
net.ipv6.conf.eth1.autoconf = 0
net.ipv6.conf.eth1.use_tempaddr = 2
net.ipv6.conf.eth1.forwarding = 0
註釋為:
# net.ipv6.conf.eth1.disable_ipv6 = 1
# net.ipv6.conf.eth1.accept_ra = 0
# net.ipv6.conf.eth1.autoconf = 0
# net.ipv6.conf.eth1.use_tempaddr = 2
# net.ipv6.conf.eth1.forwarding = 0
重新加載系統配置
sysctl --system
重啓網卡
ip link set eth1 down; ip link set eth1 up
2.3 寫入新eth1參數
創建網卡eth1的IPv6配置參數
touch 90-ipv6-eth1.conf
寫入如下內容:
# ===============================
# IPv6 配置模板 for eth1
# 支持 SLAAC + RFC7217
# ===============================
# ---------- 基本 IPv6 開關 ----------
net.ipv6.conf.eth1.disable_ipv6 = 0
net.ipv6.conf.eth1.forwarding = 0 # 主機模式,不轉發
net.ipv6.conf.eth1.hop_limit = 64
# ---------- 地址自動生成 ----------
net.ipv6.conf.eth1.autoconf = 1 # 啓用 SLAAC
net.ipv6.conf.eth1.addr_gen_mode = 0 # 2 = RFC7217 穩定隱私地址
net.ipv6.conf.eth1.use_tempaddr = 0 # 不生成臨時地址
# ---------- DAD 設置 ----------
net.ipv6.conf.eth1.accept_dad = 1
net.ipv6.conf.eth1.dad_transmits = 2
net.ipv6.conf.eth1.max_addresses = 32
# ---------- Router Advertisement ----------
net.ipv6.conf.eth1.accept_ra = 1 # 接收 RA(必須)
net.ipv6.conf.eth1.accept_ra_defrtr = 1
net.ipv6.conf.eth1.accept_ra_mtu = 1
net.ipv6.conf.eth1.accept_ra_pinfo = 1
net.ipv6.conf.eth1.accept_ra_rt_info_max_plen = 128
net.ipv6.conf.eth1.accept_ra_rt_info_min_plen = 0
net.ipv6.conf.eth1.accept_ra_rtr_pref = 1
# ---------- Router Solicitation ----------
net.ipv6.conf.eth1.router_solicitation_interval = 4
net.ipv6.conf.eth1.router_solicitations = 3
net.ipv6.conf.eth1.router_solicitation_delay = 1
net.ipv6.conf.eth1.router_solicitation_max_interval = 4
# ---------- Redirect & Neighbor ----------
net.ipv6.conf.eth1.accept_redirects = 1
net.ipv6.conf.eth1.drop_unsolicited_na = 0
# ---------- Multicast / MLD ----------
net.ipv6.conf.eth1.force_mld_version = 0
net.ipv6.conf.eth1.force_tllao = 0
# ---------- 保留設置 ----------
net.ipv6.conf.eth1.keep_addr_on_down = 0
net.ipv6.conf.eth1.max_desync_factor = 600
重新加載系統配置:
sysctl --system
重啓網卡:
ip link set eth1 down; ip link set eth1 up
驗證配置是否生效:
sysctl -a | grep "net.ipv6.conf.eth1"
設備配置完成,可以開展測試工作。
03 開展IPv6測試
3.1 配置測試機TN
編輯tn.def文件
vim /usr/local/v6eval/etc/tn.def
link0設置為和待測機TUN直連的網卡名稱,mac不用修改
# ......
#linkname interface BOGUS ether source address
# name of the Tester Interface
Link0 em1 00:00:00:00:01:00
#Link1 em2 00:00:00:00:01:01
# ......
3.2 配置測試機TUN
編輯tn.def文件
vim /usr/local/v6eval/etc/tun.def
link0設置為待測機TUN的待測網卡名稱eth1、mac地址和ipv6的本地和全局地址
# ......
#linkname interface The EXACT ether source address link-local address global address
# name of the Interface Under Test
Link0 eth1 3c:ec:ef:56:35:8b fe80::3eec:efff:fe56:358b 3ffe:501:ffff:100:5bd0:ce80:5300:8e32
#Link1 br0 cc:5c:de:c8:8f:81 fe80::ce5c:deff:fec8:8f81 3ffe:501:ffff:101:ce5c:deff:fec8:8f81
# ......
3.3 開展測試
進入測試目錄
cd /usr/local/ipv6ready/Self_Test_5-0-9/
此位置下存在幾個目錄:
|
目錄名
|
目錄説明
|
|
|
RFC 4862 - IPv6 無狀態地址自動配置
|
|
|
RFC 4443 - 互聯網控制報文協議版本6 (ICMPv6)
|
|
|
RFC 4861 - IPv6 鄰居發現協議
|
|
|
RFC 8201 - IPv6 路徑MTU發現
|
|
|
RFC 8200 - IPv6 規範 (基本協議)
|
進入各自目錄可以對各個項目開展測試,此處以RFC 4862項目測試為例:
# 進入addr.p2(RFC 4862)測試文件夾
cd addr.p2
# 測試 RFC 4862 所有項目
make ipv6ready_p2_host
# 單獨測試第 11 - 13 個項目
make ipv6ready_p2_host AROPT="-s 11 -e 13"
如果項目通過,結果類似:
ipv6# make ipv6ready_p2_host AROPT="-s 11 -e 11"
===> spec.p2
/usr/local/v6eval/bin/autorun -G -title='Section 1: RFC 8200 - IPv6 Specification' INDEX_p2_host
Error : Already exist index.html.
please run after delete index.html or run with -f option.
/usr/bin/perl -e 'use Pod::Html; pod2html("--noindex", @ARGV);' SPEC.pm > SPEC.html
rm -f pod2html-dircache pod2html-itemcache
/bin/rm -f index.html summary.html report.html
/usr/local/v6eval/bin/autorun -s 11 -e 11 -F -tiny -title='Section 1: RFC 8200 - IPv6 Specification' INDEX_p2_host
========== TEST 11 ==========
./EX_NH_Zero.seq -pkt ./EX_NH_Zero.def -log 11.html -ti "Next Header Zero"
Start Capturing Packets (Link0)
Send Echo Request (Hop-by-Hop Options Header after Hop-by-Hop Options Header)
Recv Neighbor Solicitation (Link-Local to Link-Local)
Send Neighbor Advertisement (Link-Local to Link-Local)
Recv ICMP Error (Parameter Problem, unrecognized Next Header type encountered)
OK
--- Cleanup NUT
Send Neighbor Advertisement (Link-Local Address with Different Link-layer Address)
Send Echo Request
Wait for transit target Neighbor Cache Entry to INCOMPLETE/NONCE (10 sec.)
Stop Capturing Packets (Link0)
-> PASS
===> nd.p2
/usr/local/v6eval/bin/autorun -G -title='Section 2: RFC 4861 - Neighbor Discovery for IPv6' INDEX_ND_p2_host INDEX_RD_p2_host INDEX_REDIRECT_p2_host
Error : Already exist index.html.
please run after delete index.html or run with -f option.
/bin/rm -f index.html summary.html report.html
/usr/local/v6eval/bin/autorun -s 11 -e 11 -F -tiny -title='Section 2: RFC 4861 - Neighbor Discovery for IPv6' INDEX_ND_p2_host INDEX_RD_p2_host INDEX_REDIRECT_p2_host
如果通過,輸出結果顯示為PASS,如果未通過,輸出結果中帶有FAIL
3.4 測試中的特殊操作
3.4.1 重啓網卡
# 先禁用eth1網絡接口,再重新啓用eth1網絡接口(相當於重啓網卡)
ip link set eth1 down; ip link set eth1 up
3.4.2 觀察網卡狀態
# 每0.5秒刷新一次,高亮顯示eth1網卡的IPv6地址配置變化
watch -n 0.5 -d ip -6 addr show dev eth1
3.4.3 ping6
# 發送1452字節的IPv6探測包到ff1e::1:2,通過eth1網卡,進行路徑MTU發現
ping6 -s 1452 -c 1 -I eth1 ff1e::1:2 -M want
3.5 測試未通過項
3.5.1 RFC 8200(IPv6 Specification)
- 完全通過
3.5.2 RFC 4861(Neighbor Discovery for IPv6)
- No.12/13:多測試幾次能通過
- No.188/190/191/193:HOST可以略過不測
3.5.3 RFC 4862(IPv6 Stateless Address Autoconfiguration)
- No.33: 偶爾通過
- No.43/47/48:將addr_gen_mode改為3,再改為2之後,IPv6全局地址生成類型發生改變,再修訂一下nut.conf中的全局地址以確保能夠從新的IPv6中接收到DAD信息,測試通過
3.5.4 RFC 8201(Path MTU Discovery for IPv6)
- No.17:可選項,可以不測試,大部分設備不支持
3.5.5 RFC 4443(ICMPv6)
- 完全通過