介绍
IPv6 是整个互联网连接到其他位置所依赖的 IP 协议的最新版本(IP 协议有点多余,因为 IP 代表互联网协议,但我们将使用它,因为它很容易)。 虽然 IPv4 仍在世界许多地区使用,但 IPv4 地址空间正在快速消耗,并且不足以支持互联网就绪设备的快速部署。
IPv6 旨在解决这些问题。 除了对协议进行总体改进外,使用 IPv6 地址最明显的好处是它具有 多 更大的地址空间。 虽然 IPv4 允许 2^32 个地址(其中一些保留用于特殊目的),但 IPv6 地址空间允许 2^128 个地址,这是一个令人难以置信的增长。
虽然 IPv6 提供了很多机会并解决了许多长期存在的问题,但如果您习惯于专门使用 IPv4,它确实需要对一些常规网络配置进行一些调整。 在本指南中,我们将讨论一些流行的 IPv4 工具和实用程序的一些 IPv6 对应物,并讨论如何配置一些流行的服务以利用 IPv6。
IPv6 的简单网络诊断
一些用于诊断网络问题的最简单实用程序是在考虑 IPv4 的情况下创建的。 为了解决这个问题,当我们希望处理 IPv6 流量时,我们可以使用他们的 IPv6 表亲。
首先,要查看您当前为服务器配置的 IPv6 地址,您可以使用 iproute2
工具显示当前配置的地址:
ip -6 addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000 inet6 2400:6180:0:d0::41f/64 scope global valid_lft forever preferred_lft forever inet6 fe80::601:15ff:fe43:b201/64 scope link valid_lft forever preferred_lft forever 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000 inet6 fe80::601:15ff:fe43:b202/64 scope link valid_lft forever preferred_lft forever
要打印出 IPv6 路由表,您可以使用 netstat
输入如下内容:
netstat -A inet6 -rn
Kernel IPv6 routing table Destination Next Hop Flag Met Ref Use If 2400:6180:0:d0::/64 :: U 256 0 1 eth0 fe80::/64 :: U 256 0 0 eth1 fe80::/64 :: U 256 0 0 eth0 ::/0 2400:6180:0:d0::1 UG 1024 0 0 eth0 ::/0 :: !n -1 1 90 lo ::1/128 :: Un 0 1 20 lo 2400:6180:0:d0::41f/128 :: Un 0 1 86 lo fe80::601:15ff:fe43:b201/128 :: Un 0 1 75 lo fe80::601:15ff:fe43:b202/128 :: Un 0 1 0 lo ff00::/8 :: U 256 0 0 eth1 ff00::/8 :: U 256 0 0 eth0 ::/0 :: !n -1 1 90 lo
如果您更喜欢 iproute2 工具,您可以通过键入以下内容获得类似信息:
ip -6 route show
2400:6180:0:d0::/64 dev eth0 proto kernel metric 256 fe80::/64 dev eth1 proto kernel metric 256 fe80::/64 dev eth0 proto kernel metric 256 default via 2400:6180:0:d0::1 dev eth0 metric 1024
现在您已经了解了如何获取一些自己的 IPv6 信息,让我们了解一下如何使用一些与 IPv6 一起工作的工具。
无处不在的 ping
命令实际上是特定于 IPv4 的。 该命令的 IPv6 版本的工作原理完全相同,但对于 IPv6 地址,毫不奇怪地命名为 ping6
。 这将 ping 本地环回接口:
ping6 -c 3 ::1
PING ::1(::1) 56 data bytes 64 bytes from ::1: icmp_seq=1 ttl=64 time=0.021 ms 64 bytes from ::1: icmp_seq=2 ttl=64 time=0.028 ms 64 bytes from ::1: icmp_seq=3 ttl=64 time=0.022 ms --- ::1 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 1998ms rtt min/avg/max/mdev = 0.021/0.023/0.028/0.006 ms
如您所见,这完全符合预期,唯一的区别是用于寻址的协议版本。
您可能依赖的另一个工具是 traceroute
。 还有一个等效的 IPv6 可用:
traceroute6 google.com
traceroute to google.com (2404:6800:4003:803::1006) from 2400:6180:0:d0::41f, 30 hops max, 24 byte packets 1 2400:6180:0:d0:ffff:ffff:ffff:fff1 (2400:6180:0:d0:ffff:ffff:ffff:fff1) 0.993 ms 1.034 ms 0.791 ms 2 2400:6180::501 (2400:6180::501) 0.613 ms 0.636 ms 0.557 ms 3 2400:6180::302 (2400:6180::302) 0.604 ms 0.506 ms 0.561 ms 4 10gigabitethernet1-1.core1.sin1.he.net (2001:de8:4::6939:1) 6.21 ms 10.869 ms 1.249 ms 5 15169.sgw.equinix.com (2001:de8:4::1:5169:1) 1.522 ms 1.205 ms 1.165 ms 6 2001:4860::1:0:337f (2001:4860::1:0:337f) 2.131 ms 2.164 ms 2.109 ms 7 2001:4860:0:1::523 (2001:4860:0:1::523) 2.266 ms 2.18 ms 2.02 ms 8 2404:6800:8000:1c::8 (2404:6800:8000:1c::8) 1.741 ms 1.846 ms 1.895 ms
你可能熟悉的是tracepath
命令。 这遵循 IPv6 版本的其他命令的示例:
tracepath6 ::1
1?: [LOCALHOST] 0.045ms pmtu 65536 1: ip6-localhost 0.189ms reached 1: ip6-localhost 0.110ms reached Resume: pmtu 65536 hops 1 back 64
如果您需要监控进入机器的流量,通常使用 tcpdump
程序。 我们可以让这个实用程序只显示我们的 IPv6 流量,方法是在我们的选项后面使用表达式 ip6 or proto ipv6
过滤它。
例如,我们可以通过告诉工具仅捕获我们感兴趣的信息来轻松测量快速流动的 IPv6 流量。 我们可以使用从 here 获取的这个命令来只收集信息摘要以避免延迟输出:
tcpdump -t -n -i eth0 -s 512 -vv ip6 or proto ipv6
检查 IPv6 DNS 信息
您可以使用典型工具轻松检查域的 DNS 信息。 主要区别在于您可能会询问 AAAA
记录,这些记录用于 IPv6 地址,而不是 A
记录,后者仅用于 IPv4 映射。
要检索域的 IPv6 地址记录,您可以简单地请求 AAAA
记录。 使用 host
命令,您可以这样做:
host -t AAAA google.com
google.com has IPv6 address 2404:6800:4003:803::1004
如果您更喜欢使用 dig
,则可以使用以下语法获得类似的结果:
dig google.com AAAA
; <<>> DiG 9.8.1-P1 <<>> google.com AAAA ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14826 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;google.com. IN AAAA ;; ANSWER SECTION: google.com. 299 IN AAAA 2404:6800:4003:803::1006 ;; Query time: 5 msec ;; SERVER: 8.8.4.4#53(8.8.4.4) ;; WHEN: Tue Apr 1 13:59:23 2014 ;; MSG SIZE rcvd: 56
正如您所看到的,当您使用 IPv6 地址时,检查您的 DNS 是否为您的域正确解析同样容易。
使用 IPv6 的网络服务
大多数常见的网络服务应该能够处理 IPv6 流量。 有时,它们需要特殊的标志或语法,而有时,它们提供专门用于 IPv6 的替代实现。
SSH 配置
对于 SSH,可以将守护进程配置为侦听 IPv6 地址。 这在您可以打开的配置文件中进行控制:
sudo nano /etc/ssh/sshd_config
ListenAddress
指定 SSH 守护进程将绑定到哪个地址。 对于 IPv4 地址,如下所示:
ListenAddress 111.111.111.111:22
这会侦听端口 22 上的 IPv4 地址 111.111.111.111
。 对于 IPv6 地址,您可以通过将地址放在方括号中来执行相同操作:
ListenAddress [1341:8954:a389:33:ba33::1]:22
这告诉 SSH 守护进程监听端口 22 上的 1341:8954:a389:33:ba33::1
地址。 您可以通过键入以下命令告诉它收听 all 可用的 IPv6 地址:
ListenAddress ::
请记住在进行更改后重新加载守护程序:
sudo service ssh restart
在客户端,如果您要连接的守护程序配置为使用 IPv4 和 IPv6 进行侦听,则可以通过使用 -6
标志强制客户端仅使用 IPv6,如下所示:
ssh -6 username@host.com
网络服务器配置
与 SSH 守护程序类似,Web 服务器也必须配置为侦听 IPv6 地址。
在 Apache 中,您可以使用以下语法配置服务器以响应某个 IPv6 地址上的请求:
Listen [1341:8954:a389:33:ba33::1]:80
这告诉服务器在端口 80 上侦听此特定地址。 我们可以将其与 IPv4 地址相结合,以提供更大的灵活性,如下所示:
Listen 111.111.111.111:80 Listen [1341:8954:a389:33:ba33::1]:80
实际上,如果您想在端口 80 上侦听所有协议中所有接口上的连接,您可以使用:
Listen 80
在虚拟主机级别,您还可以指定 IPv6 地址。 在这里,您可以看到可以将虚拟主机配置为同时匹配 IPv4 地址和 IPv6 地址:
<VirtualHost 111.111.111.111:80, [1341:8954:a389:33:ba33::1]:80> . . . </VirtualHost>
请记住重新启动服务以进行更改:
sudo service apache2 restart
如果您更喜欢使用 Nginx 作为您的 Web 服务器,我们可以实现类似的配置。 对于 listen 指令,我们可以将其用于 IPv6 流量:
listen [1341:8954:a389:33:ba33::1]:80;
在 Linux 中,这实际上也启用了端口 80 上的 IPv4 流量,因为它会自动将 IPv4 请求映射到 IPv6 地址。 这实际上阻止了您像这样分别指定 IPv6 地址和 IPv4 地址:
listen [1341:8954:a389:33:ba33::1]:80; listen 111.111.111.111:80;
这将导致错误提示该端口已绑定到另一个服务。 如果您想使用这样的单独指令,您必须使用 sysctl
关闭此功能,如下所示:
sysctl -w net.ipv6.bindv6only=1
您可以通过将其添加到 /etc/sysctl.conf
来确保它在启动时自动应用:
sudo nano /etc/sysctl.conf
. . . net.ipv6.bindv6only=1
之后,您可以通过将 ipv6only=on
标志添加到 IPv6 侦听指令来使用与之前失败的配置类似的配置:
listen [1341:8954:a389:33:ba33::1]:80 ipv6only=on; listen 111.111.111.111:80;
再次,重新启动 Nginx 以进行更改:
sudo service nginx restart
防火墙配置
如果您习惯于使用 iptables
之类的 netfilter 配置前端来配置防火墙规则,那么您会很高兴知道有一个等效的工具称为 ip6tables
。
我们在这里有一个关于 如何为 Ubuntu 配置 iptables 的指南。
对于 IPv6 变体,您可以简单地将命令替换为 ip6tables
来管理 IPv6 数据包过滤规则。 例如,要列出 IPv6 规则,您可以键入:
sudo ip6tables -L
Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
如果您正在使用 ufw
工具,那么恭喜您,您已经完成了! 除非另有说明,否则 ufw
工具会同时配置两个堆栈。 您可能必须为您的特定 IPv6 地址添加规则,但您不必使用其他工具。
您可以在此处了解有关 如何使用 ufw 的更多信息。
TCP 包装器配置
如果您使用 TCP 包装器通过 /etc/hosts.allow
和 /etc/hosts.deny
文件控制对服务器的访问,您可以简单地使用 IPv6 语法来匹配某些源规则。
例如,您可以通过键入编辑 /etc/hosts.allow
文件并添加以下内容,只允许 IPv4 和 IPv6 地址通过 SSH 连接:
sudo nano /etc/hosts.allow
. . . sshd: 111.111.0.0/255.255.254.0, [1341:8954:a389:33::]/64
如您所见,很容易调整您当前的 TCP 包装器规则以应用于 IPv6 地址。 您可以在此处了解有关 如何格式化 IP 地址和子网 的更多信息。
结论
希望您现在意识到过渡到 IPv6 或在 IPv4 之外利用 IPv6 是一个相当直接的过程。
您必须专门调查您使用的任何网络服务,以确定是否需要任何其他配置更改才能正确利用您的 IPv6 资源。 但是,您现在应该对使用最基本的实用程序和服务使用 IPv6 感到更加自在。