IPv6 1. IPv6 Day 2. IPv6 deployment 3. 与IPv4比较 4. 邻居发现 5. 无状态自动配置(SLAAC) 6. Privacy extensions 隐私扩展 7. Stable private addresses 稳定的私人地址 8. Static address 静态地址 9. IPv6和PPPoE a. 前缀委派(DHCPv6-PD) b. Disable 禁用 IPv6 c. 在IPv6上优先使用IPv4

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
https://zh.wikipedia.org/wiki/IPv6
网际协议第6版(英语:Internet Protocol version 6,缩写:IPv6)是网际协议的最新版本,用作互联网的协议。用它来取代IPv4主要是为了解决IPv4地址枯竭问题,同时它也在其他方面对于IPv4有许多改进。
如今, 全球上网人数已超40亿,IPv4仅能提供约42.9亿个IP位置。NAT网络地址转换, CIDR无类别域间路由等技术延缓网络位置匮乏之现象。
为求解决根本问题...
1990年开始, 
互联网工程工作小组开始规划IPv4的下一代协议,
1994年提议, 各IPng领域的代表们于多伦多举办的IETF会议中,正式提议IPv6发展计划,该提议直到同年的11月17日才被认可。
1996年8月10日, 1994年的提议发展成为IETF的草案标准
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://en.wikipedia.org/wiki/IPv6_deployment
https://zh.wikipedia.org/wiki/IPv6部署
Google的统计数据显示,截至2021年4月,根据用户的星期几(周末更大),其用户的IPv6可用性约为30.30–35.10%。下表是摘录了部分有数据的国家使用IPv6的比例. 
IPv6
1. IPv6 Day
2. IPv6 deployment
3. 与IPv4比较
4. 邻居发现
5. 无状态自动配置(SLAAC)
6. Privacy extensions 隐私扩展
7. Stable private addresses 稳定的私人地址
8. Static address 静态地址
9. IPv6和PPPoE
a. 前缀委派(DHCPv6-PD)
b. Disable 禁用 IPv6
c. 在IPv6上优先使用IPv4

测试本地是否支持IPv6, 苏州的移动宽带去年测试还不通, 今天测了一下通了. 
http://test-ipv6.com/

3. 与IPv4比较

https://zh.wikipedia.org/wiki/IPv6
在Internet上,数据以分组的形式传输。IPv6定义了一种新的分组格式,目的是为了最小化路由器处理的消息标头。
由于IPv4消息和IPv6消息标头有很大不同,因此这两种协议无法互操作。但是在大多数情况下,IPv6仅仅是对IPv4的一种保守扩展。
除了嵌入了互联网地址的那些应用协议(如FTP和NTPv3,新地址格式可能会与当前协议的语法冲突)以外,大多数传输层和应用层协议几乎不怎么需要修改就可以在IPv6上运行。

3.1 IPv6编码

IPv6具有比IPv4大得多的编码地址空间。这是因为IPv6采用128位的地址, 地址空间支持2128。而IPv4使用的是32位(总地址约亿40个)。
就以地球人口70亿人计算,每人平均可分得约4.86×1028(486117667×1020)个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位十六进制方式表示。
例如:2001:0db8:86a3:08d3:1319:8a2e:0370:7344 是一个合法的IPv6地址。
类似于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映射地址

如果这个地址实际上是IPv4的地址,后32位可以用10进制数表示;因此::ffff:192.168.89.9 相等于::ffff:c0a8:5909。
::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

由于同一非全局地址可能在同一范围的多个区域中使用(例如,在两条独立的物理链路中使用链路本地地址 fe80::1),而且一个节点可能连接到同一范围的不同区域的接口(例如,一个路由器通常有多个接口连接到不同的链路)。
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的省略书写

每组数字前导0可以省略,省略后前导数字仍是0则继续,例如下组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地址的分类

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 特殊地址

https://zh.wikipedia.org/wiki/IPv6#特殊位址
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导致所有本地主机在链接本地范围内做出响应。必须指定一个接口:
$ ping ff02::1%eth0
之后,您可以使用以下命令获取本地网络中所有邻居的列表:
$ ip -6 neigh
注: 若启用了ip6tables的简单防火墙, ping命令只能看到自己, 看不到局域网内其他启用了简单防火墙的用户, 但ping之后再执行: ip -6 neigh 还是能找到邻居. 
通过ping多播地址,ff02::2只有路由器会响应。
如果添加选项,则本地链接主机将使用其全局链接作用域地址进行响应。在这种情况下,可以省略该接口: -I your-global-ipv6
$ ping -I 2001:4f8:fff6::21 ff02::1

5. 无状态自动配置(SLAAC)

在网络准备好的情况下,获取IPv6地址最简单的方法是通过“无状态地址自动配置”(SLAAC)。地址会自动由路由器给出的前缀推算出,不需要其他配置,也不需要DHCP客户端。
在不适合使用IPv6无状态地址自动配置的场景下,网络可以使用有状态配置(DHCPv6),或者使用静态方法手动配置。

5.1 对于Linux客户端

如果你使用netctl管理网络,那么只需要在网络配置中加入下面这一行:
IP6=stateless
如果使用NetworkManager,它会自动检测网络情况并配置好IPv6.
注意: 只有IPv6 icmp数据包可以经过网络传输时,SLAAC才可以正常工作。所以在要配置IPv6的计算机上,必须允许ipv6-icmp数据包进入。如果你使用Simple stateful firewall或iptables,只需要加入:
-A INPUT -p ipv6-icmp -j ACCEPT

5.2 对于网关

网关需要运行一个守护进程,以确保能够将IPv6地址分发给客户端。一般使用radvd(official repositories)。配置radvd很简单。修改/etc/radvd.conf,加入如下配置:
# 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 隐私扩展

当一个客户端使用SLAAC配置其IPv6时,它会使用网络前缀和网卡的MAC地址构造地址。
这会引起安全问题:计算机的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

其中,nic0到nicN是你的网卡。您可以使用“网络配置#列出网络接口”中的说明找到它们的名称。
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

https://wiki.archlinux.org/title/NetworkManager#Configuration
可以通过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

https://wiki.archlinux.org/title/ConnMan
设置在服务文件中,即: /var/lib/connman/service/settings
IPv6.privacy=preferred

7. Stable private addresses 稳定的私人地址

另一种选择是稳定的私有IP地址(RFC 7217)。这允许IP在网络内保持稳定,而不会暴露接口的MAC地址。
为了使内核生成密钥(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地址。

另外: NetworkManager不接受上述设置,但是NetworkManager默认情况下使用稳定的专用地址。
$ sudo cat /etc/NetworkManager/system-connections/ssid.nmconnection 
[ipv6]
addr-gen-mode=stable-privacy
dns-search=
method=auto

8. Static address 静态地址

有些情况下使用静态地址可以增强安全性。使用SLAAC分配动态地址时,你的计算机的地址会由其网卡MAC推算出,这不利于安全,因为即使地址的网络号改变,你的电脑依然可以被追踪到。
要想用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

PPPoE的软件包pppd提供了对PPPoE之上的IPv6的支持(前提是你的ISP和调制解调器支持)。只需要将如下内容加入/etc/ppp/options
+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

Dhcpcd在IPv4之外也提供了一个完整的支持DHCPv6-PD的客户端。如果你使用dhcpcd,需要修改/etc/dhcpcd.conf。你可能已经在用dhcpcd来配置IPv4,所以只需要对现有的配置进行小幅修改: 
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

配置上游(WAN)和下游(LAN)接口。这将在运行DHCPv6客户端的接口上启用DHCPv6-PD。委托前缀由IPv6路由器在下游网络上分发。
/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 其他客户端

dhclient也可以请求前缀,但是必须使用dhclient退出脚本将该前缀或该前缀的一部分分配给接口。例如: 
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地址分配给特定的网络接口:
# Disable 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并不会立刻对已经连接的网卡起作用。

注意:如果通过sysctl禁用IPv6,则应注释掉/etc/hosts中的IPv6主机。否则,可能会出现一些连接错误,因为主机已解析为无法访问的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

dhcpcd会尝试发送IPv6路由器请求。要禁用这种行为,可以依照其手册页dhcpcd.conf (5),向/etc/dhcpcd.conf加入如下内容: 
noipv6rs
noipv6

b.2.2 NetworkManager

要在NetworkManager中禁用IPv6,请右键单击网络状态图标,然后选择: 
“编辑连接”>“有线”>“网络名称” >“编辑”>“ IPv6设置”>“方法”>“忽略/禁用”
Edit Connections > Wired > Network name > Edit > IPv6 Settings > Method > Ignore/Disabled

然后点击“保存”。

在命令行终端下,关闭IPv6支持可以使用nmcli:
$ sudo nmcli connection edit connection0
其中,connection0是要修改的网络名称。nmcli运行后进入其命令行,输入如下命令:
nmcli> set ipv6.method ignore 
连接到该网络时,NetworkManager不会再配置该网络的IPv6地址。

b.2.3 ntpd

依照Systemd#Drop-in files,修改ntpd.service的启动方式:
$ 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

在dirmngr的配置文件中禁用IPv6 :
~/.gnupg/dirmngr.conf
disable-ipv6
并重新启动用户服务 dirmngr.service。

b.2.5 sshd

通过将以下内容添加到来确保sshd使用的是ipv4 sshd_config:
/etc/ssh/ssh_config
AddressFamily inet
并重新启动sshd.service。

b.3 systemd-networkd

networkd支持在每个接口上禁用IPv6。当网络单元的[Network]部分具有LinkLocalAddressing=ipv4或LinkLocalAddressing=no时,networkd不会尝试在匹配的接口上配置IPv6。
但是请注意,即使未使用上述选项,如果未全局禁用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