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
1. IPv6 Day
如今, 全球上网人数已超40亿,IPv4仅能提供约42.9亿个IP位置。NAT网络地址转换, CIDR无类别域间路由等技术延缓网络位置匮乏之现象。
1990年开始, 互联网工程工作小组开始规划IPv4的下一代协议, 1994年提议, 各IPng领域的代表们于多伦多举办的IETF会议中,正式提议IPv6发展计划,该提议直到同年的11月17日才被认可。
... 2011年6月8日, 世界IPv6日(英语:World IPv6 Day)是在2011年6月8日由互联网协会组织和赞助的,一次公开测试IPv6的活动。 2012年6月6日, 世界IPv6启动日. 在2011年的活动大获成功之后,互联网协会将2012年6月6日定为了世界IPv6启动日,在这一天,全球IPv6网络已正式启动。
2. IPv6 deployment
测试本地是否支持IPv6, 苏州的移动宽带去年测试还不通, 今天测了一下通了. http://test-ipv6.com/
3. 与IPv4比较
由于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映射地址
3.4 IPv6新增了区域ID
其内容特定于操作系统,例如Windows使用数字 fe80::2%3 ,Linux使用网卡名字 fe80::2%eth0 。
在URI中使用时,百分号需要进行编码,例如 fe80::a%en1 应显示为 http://[fe80::a%25en1] 。
3.5 IPv6的省略书写
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地址的分类
而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 特殊地址
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。 - ORCHID2001: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. 邻居发现
如果添加选项,则本地链接主机将使用其全局链接作用域地址进行响应。在这种情况下,可以省略该接口: -I your-global-ipv6 $ ping -I 2001:4f8:fff6::21 ff02::1
5. 无状态自动配置(SLAAC)
在不适合使用IPv6无状态地址自动配置的场景下,网络可以使用有状态配置(DHCPv6),或者使用静态方法手动配置。
5.1 对于Linux客户端
注意: 只有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
重启之后,隐私扩展将会启用。
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将回退为 /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
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地址。
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 其他客户端
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
Edit Connections > Wired > Network name > Edit > IPv6 Settings > Method > Ignore/Disabled
然后点击“保存”。
nmcli> set ipv6.method ignore
连接到该网络时,NetworkManager不会再配置该网络的IPv6地址。
b.2.3 ntpd
[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