1. IPv6 Day 2. IPv6 deployment 3. 與IPv4比較 3.1 IPv6編碼 3.2 IPv6格式 3.3 IPv4映射地址 3.4 IPv6新增了區域ID 3.5 IPv6的省略書寫 3.6 IPv6地址的分類 3.7 特殊地址 4. 鄰居發現 5. 無狀態自動配置(SLAAC) 5.1 對於Linux客戶端 5.2 對於網關 6 Privacy extensions 隱私擴展 6.1 dhcpcd 6.2 NetworkManager 6.3 systemd-networkd 6.4. ConnMan 7. Stable private addresses 穩定的私人地址 8. Static address 靜態地址 9. IPv6和PPPoE a 前綴委派(DHCPv6-PD) a.1 使用dhcpcd a.2 systemd-networkd a.3. 其他客戶端 b Disable 禁用 IPv6 b.1 禁用功能 b.2 其他程序 b.2.1 dhcpcd b.2.2 NetworkManager b.2.3 ntpd b.2.4 GnuPG b.2.5 sshd b.3. systemd-networkd c 在IPv6上優先使用IPv4
網際協議第6版(英語:Internet Protocol version 6,縮寫:IPv6)是網際協議的最新版本,用作互聯網的協議。用它來取代IPv4主要是為了解決IPv4地址枯竭問題,同時它也在其他方面對於IPv4有許多改進。
1. IPv6 Day
1982年, 互聯網開始使用IPv4。
如今, 全球上網人數已超40億,IPv4僅能提供約42.9億個IP位置。NAT網絡地址轉換, CIDR無類別域間路由等技術延緩網絡位置匱乏之現象。
1990年開始, 互聯網工程工作小組開始規划IPv4的下一代協議,
1994年提議, 各IPng領域的代表們於多倫多舉辦的IETF會議中,正式提議IPv6發展計划,該提議直到同年的11月17日才被認可。
1998年公布, 12月由互聯網工程工作小組以互聯網標准規范(RFC 2460)的方式正式公布IPv6
...
2011年6月8日, 世界IPv6日(英語:World IPv6 Day)是在2011年6月8日由互聯網協會組織和贊助的,一次公開測試IPv6的活動。
2012年6月6日, 世界IPv6啟動日. 在2011年的活動大獲成功之后,互聯網協會將2012年6月6日定為了世界IPv6啟動日,在這一天,全球IPv6網絡已正式啟動。
2. IPv6 deployment
https://zh.wikipedia.org/wiki/IPv6部署
Google的統計數據顯示,截至2021年4月,根據用戶的星期幾(周末更大),其用戶的IPv6可用性約為30.30–35.10%。下表是摘錄了部分有數據的國家使用IPv6的比例.
測試本地是否支持IPv6, 蘇州的移動寬帶去年測試還不通, 今天測了一下通了.
http://test-ipv6.com/
3. 與IPv4比較
在Internet上,數據以分組的形式傳輸。IPv6定義了一種新的分組格式,目的是為了最小化路由器處理的消息標頭。
由於IPv4消息和IPv6消息標頭有很大不同,因此這兩種協議無法互操作。但是在大多數情況下,IPv6僅僅是對IPv4的一種保守擴展。
除了嵌入了互聯網地址的那些應用協議(如FTP和NTPv3,新地址格式可能會與當前協議的語法沖突)以外,大多數傳輸層和應用層協議幾乎不怎么需要修改就可以在IPv6上運行。
3.1 IPv6編碼
就以地球人口70億人計算,每人平均可分得約4.86×10 28(486117667×10 20)個IPv6地址。
RFC 2373和RFC 2374定義的IPv6地址有128位長;IPv6地址的表達形式一般采用32個十六進制數。
在很多場合,IPv6地址由兩個邏輯部分組成:一個64位的網絡前綴和一個64位的主機地址,主機地址通常根據物理地址自動生成,叫做EUI-64(或者64-位擴展唯一標識)。
3.2 IPv6格式
- IPv4二進制是32位. 以8位位一組, 分為4組以點號"."隔開. 4組*8位=32位。通常使用: 點分十進制. 4組十進制數字用點隔開.
- IPv6二進制128位. 以16位為一組,分為8組以冒號":"隔開. 8組*16位=128位. 通常使用: 每組以4位十六進制方式表示。
類似於IPv4的點分十進制,同樣也存在點分十六進制的寫法,將8組4位十六進制地址的冒號去除后,每位以點號“.”分組,例如:2001:0db8:85a3:08d3:1319:8a2e:0370:7344則記為2.0.0.1.0.d.b.8.8.5.a.3.0.8.d.3.1.3.1.9.8.a.2.e.0.3.7.0.7.3.4.4,其倒序寫法用於ip6.arpa子域名記錄IPv6地址與域名的映射。
3.3 IPv4映射地址
::ffff:1.2.3.4 格式叫做IPv4映射地址。
IPv4位址可以很容易的轉化為IPv6格式。舉例來說,如果IPv4的一個地址為135.75.43.52(十六進制為0x874B2B34),它可以被轉化為0000:0000:0000:0000:0000:FFFF:874B:2B34 或者::FFFF:874B:2B34。同時,還可以使用混合符號(IPv4-compatible address),則地址可以為::ffff:135.75.43.52。
3.4 IPv6新增了區域ID
IPv6新增了區域ID(Zone ID)加以區分,或稱作用域ID(Scope ID)。作用域ID僅用於本地鏈接,使用百分號追加在地址后面。
其內容特定於操作系統,例如Windows使用數字 fe80::2%3 ,Linux使用網卡名字 fe80::2%eth0 。
在URI中使用時,百分號需要進行編碼,例如 fe80::a%en1 應顯示為 http://[fe80::a%25en1] 。
3.5 IPv6的省略書寫
2001:0db8:02de:0000:0000:0000:0000:0e13
2001:db8:2de:0000:0000:0000:0000:e13
2001:db8:2de:000:000:000:000:e13
2001:db8:2de:00:00:00:00:e13
2001:db8:2de:0:0:0:0:e13
可以用雙冒號“::”表示一組0或多組連續的0,但只能出現一次:
2001:db8:2de:0:0:0:0:e13
2001:db8:2de::e13
3.6 IPv6地址的分類
單播(unicast)地址
單播地址標示一個網絡接口。協議會把送往地址的數據包送往給其接口。IPv6的單播地址可以有一個代表特殊地址名字的范疇,如鏈路本地地址(link local address)和唯一區域地址(ULA,unique local address)。單播地址包括可聚類的全球單播地址、鏈路本地地址等。
任播(anycast)地址
任播像是Unicast(單點傳播)與Broadcast(多點廣播)的綜合。單點廣播在來源和目的地間直接進行通信;多點廣播存在於單一來源和多個目的地進行通信。
而Anycast則在以上兩者之間,它像多點廣播(Broadcast)一樣,會有一組接收節點的地址列表,但指定為Anycast的數據包,只會發送給距離最近或發送成本最低(根據路由表來判斷)的其中一個接收地址,當該接收地址收到數據包並進行回應,且加入后續的傳輸。該接收列表的其他節點,會知道某個節點地址已經回應了,它們就不再加入后續的傳輸作業。
So, 以目前的應用為例,Anycast地址只能分配給中間設備(如路由器、三層交換機等),不能分配給終端設備(手機、電腦等),而且不能作為發送端的地址。
多播(multicast)地址
多播地址也稱組播地址。多播地址也被指定到一群不同的接口,送到多播地址的數據包會被發送到所有的地址。多播地址由皆為一的字節起始,亦即:它們的前置為FF00::/8。其第二個字節的最后四個比特用以標明"范疇"。
一般有node-local(0x1)、link-local(0x2)、site-local(0x5)、organization-local(0x8)和global(0xE)。多播地址中的最低112位會組成多播組群標識符,不過因為傳統方法是從MAC地址產生,故只有組群標識符中的最低32位有使用。定義過的組群標識符有用於所有節點的多播地址0x1和用於所有路由器的0x2。
另一個多播組群的地址為"solicited-node多播地址",是由前置FF02::1:FF00:0/104和剩余的組群標識符(最低24位)所組成。這些地址允許經由鄰居發現協議(NDP,Neighbor Discovery Protocol)來解譯鏈接層地址,因而不用干擾到在區網內的所有節點。
3.7 特殊地址
IANA維護官方的IPv6地址空間列表。全局的單播地址的分配可在各個區域互聯網注冊管理機構或 GRH DFP 頁面找到。
https://www.iana.org/numbers
IPv6中有些地址是有特殊含義的:
- 未指定地址
::/128-所有比特皆為零的地址稱作未指定地址。這個地址不可指定給某個網絡接口,並且只有在主機尚未知道其來源IP時,才會用於軟件中。路由器不可轉送包含未指定地址的數據包。
- 鏈路本地地址
::1/128-是一種單播繞回地址。如果一個應用程序將數據包送到此地址,IPv6堆棧會轉送這些數據包繞回到同樣的虛擬接口(相當於IPv4中的127.0.0.1/8)。
fe80::/10-這些鏈路本地地址指明,這些地址只在區域連線中是合法的,這有點類似於IPv4中的169.254.0.0/16。
- 唯一區域地址
fc00::/7-唯一區域地址(ULA,unique local address)只可用於本地通信,類似於IPv4的專用網絡地址10.0.0.0/8、172.16.0.0/12和192.168.0.0/16。這定義在RFC 4193中,是用來取代站點本地位域。這地址包含一個40比特的偽隨機數,以減少當網站合並或數據包誤傳到網絡時碰撞的風險。這些地址除了只能用於區域外,還具備全局性的范疇,這點違反了唯一區域位域所取代的站點本地地址的定義。
- 多播地址
ff00::/8-這個前置表明定義在"IP Version 6 Addressing Architecture"(RFC 4291)中的多播地址[12]。其中,有些地址已用於指定特殊協議,如ff0X::101對應所有區域的NTP服務器(RFC 2375)。
- 請求節點多播地址(Solicited-node multicast address)
ff02::1:FFXX:XXXX-XX:XXXX為相對應的單播或任播地址中的三個最低的字節。
- IPv4轉譯地址
::ffff:x.x.x.x/96-用於IPv4映射地址。(參見以下的轉換機制)。
https://zh.wikipedia.org/wiki/IPv6#轉換機制
2001::/32-用於Teredo隧道。
2002::/16-用於6to4。
- ORCHID
2001:10::/28-ORCHID (Overlay Routable Cryptographic Hash Identifiers)(RFC 4843)。這些是不可遶送的IPv6地址,用於加密散列識別。
- 文件
2001:db8::/32-這前置用於文件(RFC 3849)。這些地址應用於IPV6地址的示例中,或描述網絡架構。
- 遭舍棄或刪除的用法
::/96-這個前置曾用於IPv4兼容地址,現已刪除。
fec0::/10-這個站點本地前置指明這地址只在組織內合法。它已在2004年9月的RFC3879中舍棄,並且新系統不應該支持這類型的地址。
4. 鄰居發現
$ ping ff02::1%eth0
之后,您可以使用以下命令獲取本地網絡中所有鄰居的列表:
$ ip -6 neigh
注: 若啟用了ip6tables的簡單防火牆, ping命令只能看到自己, 看不到局域網內其他啟用了簡單防火牆的用戶, 但ping之后再執行: ip -6 neigh 還是能找到鄰居.
如果添加選項,則本地鏈接主機將使用其全局鏈接作用域地址進行響應。在這種情況下,可以省略該接口: -I your-global-ipv6
$ ping -I 2001:4f8:fff6::21 ff02::1
5. 無狀態自動配置(SLAAC)
在不適合使用IPv6無狀態地址自動配置的場景下,網絡可以使用有狀態配置(DHCPv6),或者使用靜態方法手動配置。
5.1 對於Linux客戶端
IP6=stateless
如果使用NetworkManager,它會自動檢測網絡情況並配置好IPv6.
注意: 只有IPv6 icmp數據包可以經過網絡傳輸時,SLAAC才可以正常工作。所以在要配置IPv6的計算機上,必須允許ipv6-icmp數據包進入。如果你使用Simple stateful firewall或iptables,只需要加入:
-A INPUT -p ipv6-icmp -j ACCEPT
5.2 對於網關
# replace LAN with your LAN facing interface
interface LAN {
AdvSendAdvert on;
MinRtrAdvInterval 3;
MaxRtrAdvInterval 10;
prefix ::/64 {
AdvOnLink on;
AdvAutonomous on;
AdvRouterAddr on;
};
};
這些配置可以要求客戶端由64位的網絡前綴自動推算並配置地址。請注意這些配置允許使用分配到局域網的所有可用的前綴。如果你不打算使用::/64,需要限制允許使用的前綴,可以注明前綴,例如2001:DB8::/64。prefix選項可以重復使用多次,分別記錄不同的前綴。
要將DNS服務器通告給您的LAN客戶端,您可以使用RDNSS功能。例如,添加以下行/etc/radvd.conf以播發Google的DNS v6服務器:
RDNSS 2001:4860:4860::8888 2001:4860:4860::8844 {
};
網關必須在所有的方向上允許ipv6-icmp數據包。如果你使用Simple stateful firewall或iptables,需要加入如下規則:
-A INPUT -p ipv6-icmp -j ACCEPT
-A OUTPUT -p ipv6-icmp -j ACCEPT
-A FORWARD -p ipv6-icmp -j ACCEPT
使用其他防火牆也需要類似的規則。配置完成后可以開啟radvd.service。
6. Privacy extensions 隱私擴展
這會引起安全問題:計算機的MAC地址可以輕松通過其IPv6地址推算出。為了解決這個問題,提出了“IPv6隱私擴展”標准(RFC 4941)。
使用這個隱私擴展,內核會從原本的IPv6地址計算生成一個“臨時地址”。在連接遠程服務器時,系統會優先選擇這個地址以隱藏原來的地址。要啟用隱私拓展,可以按照如下步驟:
向/etc/sysctl.d/40-ipv6.conf加入如下內容:
# Enable IPv6 Privacy Extensions
net.ipv6.conf.all.use_tempaddr = 2
net.ipv6.conf.default.use_tempaddr = 2
net.ipv6.conf.nic0.use_tempaddr = 2
...
net.ipv6.conf.nicN.use_tempaddr = 2
https://wiki.archlinux.org/title/Network_configuration#Listing_network_interfaces
all.use_tempaddr或default.use_tempaddr參數不會對已經配置好的網卡起作用。
重啟之后,隱私擴展將會啟用。
6.1 dhcpcd
https://wiki.archlinux.org/title/Dhcpcd
dhcpcd從6.4.0版本起就在其默認配置文件中添加了選項slaac private,實現對隱私擴展的支持,可以實現"Stable Private IPv6 Addresses instead of hardware based ones",符合RFC 7217 。(commit)。因此,沒有必要修改任何配置,除非你想經常更換地址,而不是在每次連接上新網絡時。
6.2 NetworkManager
可以通過NetworkManager.conf(5)或連接配置文件中的ipv6.ip6-privacy設置來控制NetworkManager中IPv6隱私擴展的使用。
如果未設置全局或每個連接,則NetworkManager將回退為 /proc/sys/net/ipv6/conf/default/use_tempaddr
要在默認情況下顯式啟用IPv6隱私擴展,請將這些行添加到NetworkManager.conf(5):
/etc/NetworkManager/conf.d/ip6-privacy.conf
[connection]
ipv6.ip6-privacy=2
應用配置,然后重新連接到所有活動的連接。
要控制IPv6隱私擴展在單個NetworkManager管理的連接中的使用,請在中編輯所需的連接密鑰文件/etc/NetworkManager/system-connections/,並將[ipv6]密鑰/值對附加到其部分ip6-privacy=2:
/etc/NetworkManager/system-connections/your-ssid.nmconnection
...
[ipv6]
method=auto
ip6-privacy=2
...
重新加載連接,然后再重新連接。
注:雖然它看起來可能scope global temporary通過啟用隱私擴展永遠不會被更新(它永遠不會轉移到創建IPv6地址deprecated的狀態在其任期valid_lft),它是在一個較長的時間周期,以驗證該地址的確確改變。
6.3 systemd-networkd
https://wiki.archlinux.org/title/Systemd-networkd
Systemd-networkd也不遵守/etc/sysctl.d/40-ipv6.conf里的net.ipv6.conf.xxx.use_tempaddr配置,需要在配置中設置IPv6PrivacyExtensions選項。除非使用.network文件中的值設kernel置選項IPv6PrivacyExtensions
IPv6隱私擴展的其他選項如下:
net.ipv6.conf.xxx.temp_prefered_lft
net.ipv6.conf.xxx.temp_valid_lft
注意: temp_prefered_lft是變量名,首選必須拼寫錯誤。
有關詳細信息,請參見systemd- networkd和systemd.network(5)。
6.4 ConnMan
設置在服務文件中,即: /var/lib/connman/service/settings
IPv6.privacy=preferred
7. Stable private addresses 穩定的私人地址
為了使內核生成密鑰(wlan0例如,對於),我們可以設置:
$ sudo sysctl net.ipv6.conf.wlan0.addr_gen_mode=3
打開和關閉接口,運行后,您應該stable-privacy在每個IPv6地址旁邊看到ip addr show dev wlan0。內核已經生成了一個128位密鑰來為該接口生成ip地址,以使其運行sysctl net.ipv6.conf.wlan0.stable_secret。我們將保留此值,因此將以下行添加到/etc/sysctl.d/40-ipv6.conf:
# Enable IPv6 stable privacy mode
net.ipv6.conf.wlan0.stable_secret = <output from previous command>
net.ipv6.conf.wlan0.addr_gen_mode = 2
注意: 如果您使用dhcpcd獲取IPv6地址,則該stable-privacy標志不會被分配給該IP地址。
$ sudo cat /etc/NetworkManager/system-connections/ssid.nmconnection
8. Static address 靜態地址
要想用netctl分配一個靜態地址,可以參照/etc/netctl/examples/ethernet-static。如下的部分尤其重要:
...
# For IPv6 static address configuration
IP6=static
Address6=('1234:5678:9abc:def::1/64' '1234:3456::123/96')
Routes6=('abcd::1234')
Gateway6='1234:0:123::abcd'
注意: 如果你只有IPv6連接,那么你要給出IPv6的DNS服務器,例如:
DNS=('6666:6666::1' '6666:6666::2')
如果您的提供商沒有給您提供IPv6 DNS,並且您沒有自己運行,則可以從resolv.conf文章中進行選擇。
https://wiki.archlinux.org/title/Resolv.conf
9. IPv6和PPPoE
+ipv6
如果你使用netctl,那么就向你的netctl配置文件加入如下內容:
PPPoEIP6=yes
a. 前綴委派(DHCPv6-PD)
地址委派是一種常見的IPv6部署方式,被許多ISP所采用。具體的做法是將一個地址前綴分配給用戶(局域網),即路由器配置為將不同的前綴分配給不同的子網;ISP通過DHCPv6將地址前綴(通常是/56或/64)分發出去,DHCP客戶端再將前綴分配給局域網。對於一個擁有兩個網卡的簡單網關來說,它的工作就是將從WAN口(或虛擬接口,比如ppp)獲取的前綴分配給局域網。
DHCPv6要求客戶端在端口546 UDP上接收傳入連接。對於基於nftables的防火牆,可以在輸入鏈中用一行配置/etc/nftables.conf:
table inet filter {
chain input {
udp dport dhcpv6-client accept
...
}
...
}
a.1 使用dhcpcd
duid
noipv6rs
waitip 6
# Uncomment this line if you are running dhcpcd for IPv6 only.
#ipv6only
# use the interface connected to WAN
interface WAN
ipv6rs
iaid 1
# use the interface connected to your LAN
ia_pd 1 LAN
#ia_pd 1/::/64 LAN/0/64
此配置客戶端會從WAN接口獲取一個前綴,分配給LAN接口。如果ISP分配的是/64的地址,則需要使用第二個ia_pd instruction。這也會禁用除WAN接口之外的所有路由器請求。
提示:另請閱讀dhcpcd(8)和dhcpcd.conf(5)。
a.2 systemd-networkd
/etc/systemd/network/wan.network
[Network]
# Use 'yes' instead of 'ipv6' for both ipv4 and ipv6.
DHCP=ipv6
/etc/systemd/network/lan.network
[Network]
IPv6SendRA=yes
DHCPv6PrefixDelegation=yes
a.3 其他客戶端
https://github.com/jaymzh/v6-gw-scripts/blob/master/dhclient-ipv6
b. Disable 禁用 IPv6
注意: Arch內核直接內置了IPv6支持,因此不能將模塊列入黑名單。
b.1 禁用功能
- 添加ipv6.disable=1到內核行會禁用整個IPv6堆棧,如果遇到問題,這可能就是您想要的。有關更多信息,請參見內核參數。https://wiki.archlinux.org/title/Kernel_parameters
- 或者,添加ipv6.disable_ipv6=1將保持IPv6堆棧正常運行,但不會將IPv6地址分配給您的任何網絡設備。
- 通過將以下sysctl配置添加到/etc/sysctl.d/40-ipv6.conf,可以避免系統將IPv6地址分配給特定的網絡接口:
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.nic0.disable_ipv6 = 1
...
net.ipv6.conf.nicN.disable_ipv6 = 1
重新啟動systemd-sysctl.service單元以應用配置更改。
注意你必須在這里清楚地列出所有不需要分配IPv6地址的網卡,僅僅設置all.disable_ipv6並不會立刻對已經連接的網卡起作用。
#<ip-address> <hostname.domain.org> <hostname>
127.0.0.1 localhost.localdomain localhost
#::1 localhost.localdomain localhost
b.2 其他程序
在內核中關閉IPv6功能不會阻止應用程序嘗試使用IPv6。多數情況下,這樣不會有問題,但如果你發現程序無法正常運行,你應該查閱該應用程序的手冊頁,以找到關閉IPv6的合適方法。
b.2.1 dhcpcd
noipv6rs
noipv6
b.2.2 NetworkManager
“編輯連接”>“有線”>“網絡名稱” >“編輯”>“ IPv6設置”>“方法”>“忽略/禁用”
Edit Connections > Wired > Network name > Edit > IPv6 Settings > Method > Ignore/Disabled
然后點擊“保存”。
$ sudo nmcli connection edit connection0
其中,connection0是要修改的網絡名稱。nmcli運行后進入其命令行,輸入如下命令:
nmcli> set ipv6.method ignore
連接到該網絡時,NetworkManager不會再配置該網絡的IPv6地址。
b.2.3 ntpd
$ sudo systemctl edit ntpd.service
這樣會產生一個drop-in snippet,替代原有的ntpd.service來加載ntpd。參數-4關閉了ntpd的IPv6支持。向drop-in snippet中加入如下內容:
[Service]
ExecStart=
ExecStart=/usr/bin/ntpd -4 -g -u ntp:ntp
第一行清除了之前的ExecStart配置,接下來的一行將該配置設置為帶有-4參數的ntpd。
b.2.4 GnuPG
~/.gnupg/dirmngr.conf
disable-ipv6
並重新啟動用戶服務 dirmngr.service。
b.2.5 sshd
/etc/ssh/ssh_config
AddressFamily inet
並重新啟動sshd.service。
b.3 systemd-networkd
但是請注意,即使未使用上述選項,如果未全局禁用IPv6,networkd仍將期望接收路由器通告。如果接口未接收到IPv6流量(例如,由於sysctl或ip6tables設置),它將保持配置狀態,並可能導致等待網絡完全配置的服務超時。為避免這種情況,IPv6AcceptRA=no還應該在[Network]中設置該選項。
c. 在IPv6上優先使用IPv4
在配置文件中/etc/gai.conf 取消注釋以下行:
#
# For sites which prefer IPv4 connections change the last line to
#
precedence ::ffff:0:0/96 100
