如何在 Linux VPS 上配置使用 IPv6 的工具

介绍

IPv6是整个互联网依赖于连接到其他位置的IP协议的最新版本(IP协议有点过剩,因为IP代表互联网协议,但我们会使用它,因为它很容易)。

IPv6 寻求解决这些问题,除了对协议进行一般改进之外,使用 IPv6 地址的最明显的好处在于,它具有更大的地址空间,而 IPv4 允许 2^32 地址(其中一些用于特殊用途),IPv6 地址空间允许 2^128 地址,这是一个令人难以置信的增加。

虽然IPv6开辟了很多机会并解决了许多长期存在的问题,但如果您习惯于使用IPv4专门,它确实需要对一些常规网络配置进行一些调整。

通过IPv6进行三重网络诊断

一些用于诊断网络问题最简单的实用程序是用IPv4创建的,为了解决这一问题,当我们想处理IPv6流量时,我们可以使用他们的IPv6表兄弟。

首先,要查看当前为您的服务器配置的 IPv6 地址,您可以使用iproute2工具向您显示当前配置的地址:

1ip -6 addr show

 11: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 
 2    inet6 ::1/128 scope host 
 3       valid_lft forever preferred_lft forever
 42: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
 5    inet6 2400:6180:0:d0::41f/64 scope global 
 6       valid_lft forever preferred_lft forever
 7    inet6 fe80::601:15ff:fe43:b201/64 scope link 
 8       valid_lft forever preferred_lft forever
 93: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
10    inet6 fe80::601:15ff:fe43:b202/64 scope link 
11       valid_lft forever preferred_lft forever

要打印 IPv6 路由表,您可以使用netstat键入类似于此的内容:

1netstat -A inet6 -rn

 1Kernel IPv6 routing table
 2Destination Next Hop Flag Met Ref Use If
 32400:6180:0:d0::/64            ::                         U 256 0 1 eth0
 4fe80::/64                      ::                         U 256 0 0 eth1
 5fe80::/64                      ::                         U 256 0 0 eth0
 6::/0 2400:6180:0:d0::1 UG 1024 0 0 eth0
 7::/0                           ::                         !n   -1 1 90 lo
 8::1/128                        ::                         Un 0 1 20 lo
 92400:6180:0:d0::41f/128        ::                         Un 0 1 86 lo
10fe80::601:15ff:fe43:b201/128   ::                         Un 0 1 75 lo
11fe80::601:15ff:fe43:b202/128   ::                         Un 0 1 0 lo
12ff00::/8                       ::                         U 256 0 0 eth1
13ff00::/8                       ::                         U 256 0 0 eth0
14::/0                           ::                         !n   -1 1 90 lo

如果您更喜欢 iproute2 工具,您可以通过键入类似的信息:

1ip -6 route show

12400:6180:0:d0::/64 dev eth0 proto kernel metric 256 
2fe80::/64 dev eth1 proto kernel metric 256 
3fe80::/64 dev eth0 proto kernel metric 256 
4default via 2400:6180:0:d0::1 dev eth0 metric 1024

现在你已经知道如何获取一些自己的IPv6信息了,让我们来了解一下如何使用一些与IPv6合作的工具。

无处不在的ping命令实际上是IPv4特定的,该命令的IPv6版本是完全相同的,但对于IPv6地址,它被命名为ping6

1ping6 -c 3 ::1

1PING ::1(::1) 56 data bytes
264 bytes from ::1: icmp_seq=1 ttl=64 time=0.021 ms
364 bytes from ::1: icmp_seq=2 ttl=64 time=0.028 ms
464 bytes from ::1: icmp_seq=3 ttl=64 time=0.022 ms
5
6--- ::1 ping statistics ---
73 packets transmitted, 3 received, 0% packet loss, time 1998ms
8rtt min/avg/max/mdev = 0.021/0.023/0.028/0.006 ms

正如你所看到的,这完全按照预期工作,唯一的区别是用于地址的协议版本。

您可以依赖的另一个工具是traceroute,还有一个IPv6等效:

1traceroute6 google.com

1traceroute to google.com (2404:6800:4003:803::1006) from 2400:6180:0:d0::41f, 30 hops max, 24 byte packets
2 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
3 2 2400:6180::501 (2400:6180::501)  0.613 ms 0.636 ms 0.557 ms
4 3 2400:6180::302 (2400:6180::302)  0.604 ms 0.506 ms 0.561 ms
5 4 10gigabitethernet1-1.core1.sin1.he.net (2001:de8:4::6939:1)  6.21 ms 10.869 ms 1.249 ms
6 5 15169.sgw.equinix.com (2001:de8:4::1:5169:1)  1.522 ms 1.205 ms 1.165 ms
7 6 2001:4860::1:0:337f (2001:4860::1:0:337f)  2.131 ms 2.164 ms 2.109 ms
8 7 2001:4860:0:1::523 (2001:4860:0:1::523)  2.266 ms 2.18 ms 2.02 ms
9 8 2404:6800:8000:1c::8 (2404:6800:8000:1c::8)  1.741 ms 1.846 ms 1.895 ms

您可能熟悉的是tracepath命令,以下是 IPv6 版本的其他命令的例子:

1tracepath6 ::1

11?: [LOCALHOST]                        0.045ms pmtu 65536
2 1:  ip6-localhost 0.189ms reached
3 1:  ip6-localhost 0.110ms reached
4     Resume: pmtu 65536 hops 1 back 64

如果您需要监控流量进入您的机器时,通常会使用tcpdump程序,我们可以通过在我们的选项后过滤ip6或 proto ipv6表达式来显示我们的IPv6流量。

例如,我们可以通过告诉工具只捕获我们感兴趣的信息来轻松地测量流动的 IPv6 流量,我们可以使用此命令从 这里来收集信息的摘要,以避免延迟输出:

1tcpdump -t -n -i eth0 -s 512 -vv ip6 or proto ipv6

检查 IPv6 DNS 信息

您可以通过使用典型的工具轻松检查域的DNS信息,主要的区别是,您可能会要求AAAA记录,这些记录用于IPv6地址,而不是A记录,这些记录仅用于IPv4地图。

要获取一个域的 IPv6 地址记录,你可以简单地请求AAAA记录,用主机命令,你可以这样做:

1host -t AAAA google.com

1google.com has IPv6 address 2404:6800:4003:803::1004

如果您更喜欢使用挖掘,则可以使用以下语法获得类似的结果:

1dig google.com AAAA

 1; <<>> DiG 9.8.1-P1 <<>> google.com AAAA
 2;; global options: +cmd
 3;; Got answer:
 4;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14826
 5;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
 6
 7;; QUESTION SECTION:
 8;google.com.			IN	AAAA
 9
10;; ANSWER SECTION:
11google.com.		299	IN	AAAA	2404:6800:4003:803::1006
12
13;; Query time: 5 msec
14;; SERVER: 8.8.4.4#53(8.8.4.4)
15;; WHEN: Tue Apr 1 13:59:23 2014
16;; MSG SIZE rcvd: 56

正如您所看到的,检查您的 DNS 是否正确地为您的域解析,在您使用 IPv6 地址时同样容易。

网络服务与IPv6

你的大多数常见网络服务应该能够处理IPv6流量,有时他们需要特殊的旗帜或语法,而其他时候,他们为IPv6提供了一个替代的实现。

SSH 配置

对于 SSH 来说,可以将 DAEMON 配置为倾听 IPv6 地址,这是您可以通过下面的配置文件来控制的:

1sudo nano /etc/ssh/sshd_config

ListenAddress 指明 SSH 戴蒙将连接到哪个地址. 对于 IPv4 地址,这看起来像这样:

1ListenAddress 111.111.111.111:22

这听取了IPv4地址111.111.111.111在端口22上。

1ListenAddress [1341:8954:a389:33:ba33::1]:22

这会告诉 SSH 示威者在端口 22 上听 1341:8954:a389:33:ba33::1 地址,你可以告诉它通过键入:

1ListenAddress ::

请记住在您更改后重新加载 DAEMON:

1sudo service ssh restart

在客户端方面,如果您正在连接的登录器已配置为使用 IPv4 and IPv6 倾听,则可以通过使用 -6 旗帜来强制该客户端使用 IPv6。

Web 服务器配置

与 SSH 服务器类似,网页服务器也必须配置为收听 IPv6 地址。

在Apache中,您可以使用以下语法配置服务器响应特定IPv6地址的请求:

1Listen [1341:8954:a389:33:ba33::1]:80

这告诉服务器在端口80上倾听这个特定的地址,我们可以将此与IPv4地址相结合,以允许更多的灵活性:

1Listen 111.111.111.111:80
2Listen [1341:8954:a389:33:ba33::1]:80

在实践中,如果你想在端口80上的所有协议中倾听所有界面上的连接,你可以使用:

1Listen 80

在虚拟主机级别上,您还可以指定 IPv6 地址. 在这里,您可以看到可以配置虚拟主机以匹配 IPv4 地址和 IPv6 地址:

1<VirtualHost 111.111.111.111:80, [1341:8954:a389:33:ba33::1]:80>
2    . . .
3</VirtualHost>

请记住重新启动服务以进行更改:

1sudo service apache2 restart

如果您更喜欢使用 Nginx 作为您的 Web 服务器,我们可以实现类似的配置。

1listen [1341:8954:a389:33:ba33::1]:80;

在 Linux 中,这实际上也允许在端口 80 上 IPv4 流量,因为它会自动将 IPv4 请求映射到 IPv6 地址上。

1listen [1341:8954:a389:33:ba33::1]:80;
2listen 111.111.111.111:80;

如果您想要使用这样的单独指令,您必须使用sysctl来关闭此功能:

1sysctl -w net.ipv6.bindv6only=1

您可以通过将其添加到 /etc/sysctl.conf 来确保在启动时自动应用此功能:

1sudo nano /etc/sysctl.conf

1. . .
2net.ipv6.bindv6only=1

之后,您可以使用类似于之前失败的配置,将ipv6only=on旗帜添加到IPv6听取指令中:

1listen [1341:8954:a389:33:ba33::1]:80 ipv6only=on;
2listen 111.111.111.111:80;

再次,重新启动 Nginx 以进行更改:

1sudo service nginx restart

防火墙配置

如果您习惯于使用 netfilter 配置前端来配置防火墙规则,例如iptables,您将很高兴知道有一个名为ip6tables的等效工具。

我们在这里有一个指南 如何为Ubuntu配置iptables在这里。

对于 IPv6 变体,您可以简单地用ip6tables代替命令来管理 IPv6 包过滤规则,例如,要列出 IPv6 规则,您可以键入:

1sudo ip6tables -L

1Chain INPUT (policy ACCEPT)
2target prot opt source destination         
3
4Chain FORWARD (policy ACCEPT)
5target prot opt source destination         
6
7Chain OUTPUT (policy ACCEPT)
8target prot opt source destination

如果你正在使用ufw工具,那么恭喜,你已经完成了!ufw工具同时配置两个堆栈,除非另有说明。

您可以了解更多有关 如何使用 ufw的信息。

TCP 包装配置

如果您使用 TCP 包装器来控制通过 /etc/hosts.allow/etc/hosts.deny 文件访问您的服务器,您可以简单地使用 IPv6 语法来匹配某些源规则。

例如,您可以允许只有一个 IPv4 和一个 IPv6 地址通过 SSH 连接,通过编辑 /etc/hosts.allow 文件并添加以下内容:

1sudo nano /etc/hosts.allow

1. . .
2sshd: 111.111.0.0/255.255.254.0, [1341:8954:a389:33::]/64

正如您所看到的,您可以很容易地调整当前的 TCP 包装规则,以适用于 IPv6 地址。您可以了解更多关于 如何格式化 IP 地址和子网的信息。

结论

希望,到目前为止,你会意识到,过渡到IPv6或利用IPv6以及IPv4是一个相当直接的进程。

您将需要专门调查您使用的任何网络服务,以确定是否需要进行任何额外的配置更改,以正确利用您的IPv6资源。

By Justin Ellingwood
Published At
Categories with 技术
comments powered by Disqus