过去,许多系统管理员只是简单地禁用 IPv6,而不是正确配置它,继续依赖已经运行了很长时间的旧 IPv4.
由于 IPv4 地址空间已经用尽,管理员开始出于需要慢慢采用 IPv6.
在本教程中,我们将介绍如何在 Linux 中配置 IPv6 寻址,并提供一些解决 IPv6 网络问题的基本技巧和建议。
在这个例子中,我们使用 CentOS 7.
基本 IPv6 故障排除
以下是一些可用于执行基本 IPv6 故障排除的基本工具,它们的工作方式与 IPv4 对应工具非常相似。
IPv6 ping
ping6 命令的工作方式与普通 ping 命令相同,只是 ping6 使用 IPv6 地址。
这可用于将 ICMP 流量发送到 IPv6 地址并检查回复,以下示例 ping IPv6 本地主机地址。
[jack@onitroad ~]# ping6 ::1 PING ::1(::1) 56 data bytes 64 bytes from ::1: icmp_seq=1 ttl=64 time=0.039 ms ...
我们也可以 ping 出指定的接口,下面的命令可以 ping 连接到 eno1677736 的所有内容。
[jack@onitroad ~]# ping6 ff02::1%eno16777736 PING ff02::1%eno16777736(ff02::1) 56 data bytes 64 bytes from fe80::204:edff:feef:a770: icmp_seq=1 ttl=64 time=2.32 ms 64 bytes from fe80::204:edff:feef:a770: icmp_seq=2 ttl=64 time=0.640 ms
IPv6 路由
'ip -6 route show' 命令可用于显示 IPv6 路由。
[jack@onitroad ~]# ip -6 route show unreachable ::/96 dev lo metric 1024 error -101 unreachable ::ffff:0.0.0.0/96 dev lo metric 1024 error -101 unreachable 2002:a00::/24 dev lo metric 1024 error -101 unreachable 2002:7f00::/24 dev lo metric 1024 error -101 unreachable 2002:a9fe::/32 dev lo metric 1024 error -101 unreachable 2002:ac10::/28 dev lo metric 1024 error -101 unreachable 2002:c0a8::/32 dev lo metric 1024 error -101 unreachable 2002:e000::/19 dev lo metric 1024 error -101 unreachable 3ffe:ffff::/32 dev lo metric 1024 error -101 fe80::/64 dev eth0 proto kernel metric 256
IPv6 跟踪路由
traceroute6 命令可用于以与 traceroute 命令相同的方式显示到指定目的地的路径中的所有跃点。
[jack@onitroad ~]# traceroute6 ipv6.google.com traceroute to ipv6.google.com (2607:f8b0:4006:80f::200e), 30 hops max, 80 byte packets connect: Network is unreachable
tracepath6 命令以类似的方式工作。
查看当前 IPv6 地址信息
我们可以通过运行“ip address show”的缩写“ip a”命令来显示当前的 IPv6 配置。
这将显示 IPv6 接口为“inet6”,后跟其 IP 地址。
查看 IPv6 网络连接
默认情况下,“netstat”命令显示 IPv4 和 IPv6,但是使用 -6 选项,我们可以选择仅显示服务器正在侦听的端口及其 IPv6 地址以及任何连接。
[jack@onitroad ~]# netstat -antup6 Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp6 0 0 :::111 :::* LISTEN 787/rpcbind tcp6 0 0 :::22 :::* LISTEN 1661/sshd tcp6 0 0 ::1:631 :::* LISTEN 2476/cupsd tcp6 0 0 ::1:25 :::* LISTEN 2066/master udp6 0 0 :::111 :::* 787/rpcbind udp6 0 0 :::123 :::* 781/chronyd udp6 0 0 ::1:323 :::* 781/chronyd udp6 0 0 :::39836 :::* 1439/dhclient udp6 0 0 :::942 :::* 787/rpcbind
配置 IPv6 地址
与 IPv4 相比,IPv6 地址可以通过一些其他方式进行配置,下面列出了其中一些。
- 手动配置:这与手动配置 IPv4 的方式非常相似,本质上我们手动编辑 /etc/sysconfig/network-scripts/ifcfg-<interface> 格式的接口文件。
- DHCPv6:动态主机协议版本 6 类似于 IPv4 的 DHCP,因为它会自动配置我们的接口。
- 无状态地址自动配置 (SLAAC):其工作方式类似于 DHCP,但它通过从网络上的本地 IPv6 路由器接收路由器AD消息来工作。
在这里,我们将主要关注手动 IPv6 网络配置。
手动 IPv6 配置
首先查看 /etc/sysconfig/network-scripts/ 目录,看看是否已经存在针对特定接口的 IPv6 配置。
文件名将被列为 ifcfg-<interface>,我们可以通过运行“ip a”或者不推荐使用的“ifconfig”来确认接口名称。
典型名称可能包括 eth0 或者较新的“eno*”格式,例如 eno16777736.
此文件可以包含同一接口的 IPv4 和 IPv6 配置。
下面是我的 CentOS 7 /etc/sysconfig/network-scripts/ifcfg-eno16777736 文件的配置,注意以“IPV6”开头的设置。
- IPV6INIT=yes - 在接口上配置 IPv6 时需要此项。
- IPV6ADDR=<ipv6-address> - 指定主要静态 IPv6 地址。
- IPV6_DEFAULTGW=<ipv6-address>%eno16777736 - 通过指定的接口添加默认路由。
请注意,如果我们手动编辑这些文件,则需要运行“nmcli con reload”来获取更改。
或者,我们可以使用 nmcli 命令进行更改,这确实需要一些时间来习惯,但功能非常强大,它的选项卡自动完成有很大帮助。
nmcli con mod eno16777736 ipv6.addresses 'fe80::20c:29ff:fe27:f2b6/64' nmcli con mod eno16777736 ipv6.method bananaal
第一个命令设置 IPv6 地址,而第二个命令确保这是一个静态地址并且不会从 DHCP 或者 SLAAC 中丢失。
有关更多信息,请记住“nmcli-examples”手册页,因为此处记录了许多不同的示例,我们可以使用它们。
man nmcli-examples
自动 IPv6 配置
IPv6 地址的自动配置可以通过 DHCPv6 或者 SLAAC 进行。
下面是 CentOS 7 的一些默认配置,它启用了 IPV6_AUTOCONF,它使用 SLAAC 路由器AD配置网络设置。
[jack@onitroad network-scripts]# cat ifcfg-eno16777736 HWADDR=00:0C:29:AB:12:34 TYPE=Ethernet BOOTPROTO=dhcp IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no NAME=eno16777736 UUID=0dbee9e5-2e7e-4c88-822b-869cfc9e2d54 ONBOOT=yes IPV6_PEERDNS=yes IPV6_PEERROUTES=yes
或者,我们可以将 IPV6_AUTOCONF 设置为 no,并定义 DHCPV6C=yes 以使用 DHCPv6 而不是 SLAAC。
使用 SLAAC 或者 DHCPv6 时,IPV6ADDR 和 IPV6_DEFAULTGW 等手动配置项可以删除,因为这些将被自动配置。
有关这些变量的更多信息,我们可以查看 /usr/share/doc/initscripts-*/sysconfig.txt 中的文档
应用网络更改
对 /etc/sysconfig/network-scripts/ 中的文件进行任何更改后,需要重新启动网络以使它们生效。
systemctl restart network
我们也可以执行系统重启,但这会花费更长的时间,但会使用新配置启动界面。