目錄

  • 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測試,需要在逐一解除netplansystemd-networkdNetworkManagereth1的控制後,直接使用sysctl配置內核參數。

以下為詳細操作步驟:

1.1 解除netplaneth1的控制

進入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-networkdeth1的控制

進入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 解除NetworkManagereth1的控制

檢查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/

此位置下存在幾個目錄:

目錄名

目錄説明

addr.p2

RFC 4862 - IPv6 無狀態地址自動配置

icmp.p2

RFC 4443 - 互聯網控制報文協議版本6 (ICMPv6)

nd.p2

RFC 4861 - IPv6 鄰居發現協議

pmtu.p2

RFC 8201 - IPv6 路徑MTU發現

spec.p2

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)

  • 完全通過