Difference between revisions of "IPv6 (简体中文)"

From ArchWiki
Jump to: navigation, search
(update translation)
(flagged broken section links)
(Tag: wiki-scripts)
 
(11 intermediate revisions by 4 users not shown)
Line 2: Line 2:
 
[[en:IPv6]]
 
[[en:IPv6]]
 
[[es:IPv6]]
 
[[es:IPv6]]
 +
[[ja:IPv6]]
 
[[pt:IPv6]]
 
[[pt:IPv6]]
 
[[ru:IPv6]]
 
[[ru:IPv6]]
[[zh-TW:IPv6]]
+
{{Related articles start (简体中文)}}
{{Article summary start}}
+
{{Related|IPv6 - Tunnel Broker Setup}}
{{Article summary text|This article covers IPv6, and basics of configuring different IPv6 related things like static IP adresses.}}
+
{{Related articles end}}
{{Article summary heading|Related}}
+
{{Article summary wiki|IPv6 - Tunnel Broker Setup}}
+
{{Article summary end}}
+
{{Translateme (简体中文)}}
+
{{TranslationStatus (简体中文)|IPv6|2013-03-05|248324}}
+
在Arch Linux, IPv6默认是打开的。如果你要找IPv6隧道的资料,可以看 [[IPv6 - Tunnel Broker Setup]].
+
  
== Privacy Extensions ==
+
{{TranslationStatus (简体中文)|IPv6|2015-10-24|405419}}
  
To enable Privacy Extensions for Stateless Address Autoconfiguration in IPv6 according to RFC 4941, reproduce the following steps:
+
在Arch Linux中,IPv6是默认开启的。如果你需要找IPv6隧道的资料,请看[[IPv6 tunnel broker setup]]。
  
Add these lines to {{ic|/etc/sysctl.conf}}:
+
== 邻居发现 ==
{{bc|1=
+
# 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}}
+
  
Where <nic0> to <nicN> are your nic's (the "all" or "default" parameters do not apply to nic's that already exist when the sysctl settings are applied).
+
向多播地址{{ic|ff02::1}}发送PING可以获得局域网内所有主机的回应。使用时需要注明网卡:
  
After a reboot, at the latest, Privacy Extensions should be enabled.
+
$ ping6 ff02::1%eth0
  
== Neighbor Discovery ==
+
向多播地址{{ic|ff02::2}}发送PING,只有路由器会回应。
  
Pinging the multicast address {{ic|ff02::1}} results in all hosts in link-local scope responding. An interface has to be specified. With a ping to the multicast address {{ic|ff02::2}} only routers will respond.
+
在PING时加入选项{{ic|-I ''你的ipv6公网地址''}},局域网内的主机会以各自的公网地址回应。这时不必注明网卡:
{{bc|
+
$ ping6 ff02::1%eth0
+
}}
+
  
If you add an option {{ic|-I <your-global-ipv6>}}, link-local hosts will respond with their link-global scope addresses. The interface can be omitted in this case.
+
$ ping6 -I 2001:4f8:fff6::21 ff02::1
{{bc|
+
$ ping6 -I 2001:4f8:fff6::21 ff02::1
+
}}
+
  
== 静态地址 ==
+
== 无状态地址自动配置 (SLAAC) ==
Sometime using static address can improve security. For example, if your local router uses Neighbor Discovery or radvd ([http://www.apps.ietf.org/rfc/rfc2461.html RFC 2461]), your interface will automatically be assigned an address based its MAC address (using IPv6's Stateless Autoconfiguration).  This may be less than ideal for security since it allows a system to be tracked even if the network portion of the IP address changes.
+
  
To assign a static address (for example {{ic|2001:470:1000:1000::5/64}}):
+
在网络准备好的情况下,获取IPv6地址最简单的方法是通过“无状态地址自动配置”(SLAAC)。地址会自动由路由器给出的前缀推算出,不需要其他配置,也不需要DHCP客户端。
  
Add your static IP using {{ic|netcfg}}. Follow the [[netcfg]] article. When copying an example use {{ic|ethernet-static}} and modify it like so:
+
=== 客户端 ===
  
{{bc|1=
+
如果你使用[[netctl]]管理网络,那么只需要在网络配置中加入下面这一行:
CONNECTION='ethernet'
+
DESCRIPTION='ipv6+ipv4 eth0'
+
INTERFACE='eth0'
+
  
IP=static
+
  IP6=stateless
ADDR=192.168.1.5
+
NETMASK=24
+
ROUTES=
+
GATEWAY=192.168.1.1
+
  
IP6=static
+
如果使用[[NetworkManager]],它会自动检测网络情况并配置好IPv6.
ADDR6=(2001:470:1000:1000::5/64)
+
 
GATEWAY6=2001:470:1000:1000::1
+
请注意:只有IPv6 icmp数据包可以经过网络传输时,SLAAC才可以正常工作。所以在要配置IPv6的计算机上,必须修改防火墙,允许{{ic|ipv6-icmp}}数据包进入。如果你使用[[Simple stateful firewall]]或[[iptables]],你只需要加入:
 +
 
 +
  -A INPUT -p ipv6-icmp -j ACCEPT
 +
 
 +
如果你使用了其他防火墙(ufw,shorewall等等),请查阅其文档,允许{{ic|ipv6-icmp}}数据包。
 +
 
 +
=== 网关 ===
 +
 
 +
网关需要运行一个守护进程,以确保能够将IPv6地址分发给客户端。一般使用{{Pkg|radvd}}([[official repositories]])。配置radvd很简单。修改{{ic|/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位的网络前缀自动推算并配置地址。请注意这些配置允许使用分配到局域网的'''所有可用的前缀'''。如果你不打算使用{{ic|::/64}},需要限制允许使用的前缀,可以注明前缀,例如{{ic|2001:DB8::/64}}。{{ic|prefix}}选项可以重复使用多次,分别记录不同的前缀。
 +
 
 +
网关必须在所有的方向上允许{{ic|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
 +
 
 +
使用其他防火墙也需要类似的规则。配置完成后可以开启{{ic|radvd.service}}。
 +
 
 +
== IPv6隐私扩展 ==
 +
 
 +
当一个客户端使用SLAAC配置其IPv6时,它会使用网络前缀和网卡的MAC地址构造地址。这会引起安全问题:计算机的MAC地址可以轻松通过其IPv6地址推算出。为了解决这个问题,提出了“IPv6隐私扩展”标准([https://tools.ietf.org/html/rfc4941 RFC 4941])。使用这个隐私扩展,内核会从原本的IPv6地址计算生成一个“临时地址”。在连接远程服务器时,系统会优先选择这个地址以隐藏原来的地址。要启用隐私拓展,可以按照如下步骤:
 +
 
 +
向{{ic|/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
 +
 
 +
其中,{{ic|nic0}}到{{ic|nicN}}是你的网卡。{{ic|all.use_tempaddr}}或{{ic|default.use_tempaddr}}参数不会对已经配置好的网卡起作用。
 +
 
 +
重启之后,隐私扩展将会启用。
 +
 
 +
=== dhcpcd ===
 +
 
 +
[[dhcpcd]]从6.4.0版本起就在其默认配置文件中添加了选项{{ic|slaac private}},实现对隐私扩展的支持,可以实现"Stable Private IPv6 Addresses instead of hardware based ones",符合[https://tools.ietf.org/html/rfc7217 RFC 7217] 。([http://roy.marples.name/projects/dhcpcd/info/8aa9dab00dc72c453aeccbde885ecce27a3d81ff commit])。因此,没有必要修改任何配置,除非你想经常更换地址,而不是在每次连接上新网络时。
 +
 
 +
=== NetworkManager ===
 +
 
 +
NetworkManager不遵守{{ic|/etc/sysctl.d/40-ipv6.conf}}中的配置。可以在重启后运行{{ic|$ ip -6 addr show ''interface''}}验证:正常的地址之外,没有状态为{{ic|scope global '''temporary'''}}的地址。
 +
 
 +
请查阅[[NetworkManager#Enable IPv6 Privacy Extensions]]。
 +
 
 +
{{注意|即使看起来开启隐私扩展产生的状态为{{ic|scope global temporary}}的IPv6地址从不更新(它在过期后不进入{{ic|deprecated}}状态),但已有验证在长时间之后它'''会'''改变。}}
 +
 
 +
=== systemd-networkd ===
 +
 
 +
Systemd-networkd也不遵守{{ic|/etc/sysctl.d/40-ipv6.conf}}的配置,需要在配置中设置{{ic|IPv6PrivacyExtensions}}选项。
 +
 
 +
请查阅[[systemd-networkd]]和[http://www.freedesktop.org/software/systemd/man/systemd.network.html systemd.network(5) man page]。
 +
 
 +
== 静态地址 ==
 +
 
 +
有些情况下使用静态地址可以增强安全性。使用SLAAC分配动态地址时,你的计算机的地址会由其网卡MAC推算出,这不利于安全,因为即使地址的网络号改变,你的电脑依然可以被追踪到。
 +
 
 +
要想用[[netctl]]分配一个静态地址,可以参照{{ic|/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'
 +
{{注意|1=如果你只有IPv6连接,那么你要给出IPv6的DNS服务器,例如:
 +
DNS=('6666:6666::1' '6666:6666::2')
 +
如果你的ISP没有告诉你IPv6的DNS服务器地址,并且你也没有自己的服务器,你可以从[[resolv.conf]]这篇文章中选一个。
 
}}
 
}}
  
== 禁用 IPv6 ==
+
== IPv6与PPPoE ==
禁用 IPv6 据称可以加速网络访问速度,因为在不支持 IPv6 的网络上程序也会试图使用它来访问。另外说一句, [[Firefox]] 也在受影响的程序列表中。在 IPv6 广泛采用之前,我们可以通过禁用它受益。
+
  
许多人并不需要这个特性,屏蔽它可以增加性能(许多程序会首先查询IPv6地址,不管你是否有IPv6连接)。
+
PPPoE的软件包{{ic|pppd}}提供了对PPPoE之上的IPv6的支持(前提是你的ISP和调制解调器支持)。只需要将如下内容加入{{ic|/etc/ppp/pppoe.conf}}:
  
== 禁用 IPv6 ==
+
  +ipv6
{{Note|1=The Arch kernel has IPv6 support built in directly [https://projects.archlinux.org/svntogit/packages.git/commit/trunk?h=packages/linux&id=3aa460e18eac7002bc013949dd401b16f16120b5], therefore a module cannot be blacklisted.}}
+
  
=== Disable functionality ===
+
如果你使用[[netctl]],那么就向你的netctl配置文件加入如下内容:
Adding {{ic|1=ipv6.disable=1}} to the [[kernel line]] disables the whole IPv6 stack, which is likely what you want if you are experiencing issues.  See [[Kernel parameters]] for more information.
+
  
Alternatively, adding {{ic|1=ipv6.disable_ipv6=1}} instead will keep the IPv6 stack functional but will not assign IPv6 addresses to any of your network devices.
+
  PPPoEIP6=yes
  
One can also avoid assigning IPv6 addresses to specific network interfaces by adding the following sysctl config to {{ic|/etc/sysctl.d/ipv6.conf}}:
+
== 地址委派 (DHCPv6-PD) ==
{{bc|<nowiki>
+
{{注意|这个部分是针对自行使用配置网关的内容,不是客户端。如果你使用从市场购得的路由器,请查阅其附带的文档以开启地址委派。}}
# Disable IPv6
+
net.ipv6.conf.all.disable_ipv6 = 1
+
net.ipv6.conf.<interface0>.disable_ipv6 = 1
+
...
+
net.ipv6.conf.<interfaceN>.disable_ipv6 = 1
+
</nowiki>}}
+
Note that you must list all of the targeted interfaces explicitly, as disabling "all" does not apply to interfaces that are already "up" when sysctl settings are applied.
+
  
Note 2, if disabling IPv6 by sysctl, you should comment out the IPv6 hosts in your {{ic|/etc/hosts}}-file.
+
地址委派是一种常见的IPv6部署方式,被许多ISP所采用。具体的做法是将一个地址前缀分配给用户(局域网),即路由器配置为将不同的前缀分配给不同的子网;ISP通过DHCPv6将地址前缀(通常是{{ic|/56}}{{ic|/64}})分发出去,DHCP客户端再将前缀分配给局域网。对于一个拥有两个网卡的简单网关来说,它的工作就是将从WAN口(或虚拟接口,比如ppp)获取的前缀分配给局域网。
{{bc|<nowiki>
+
#<ip-address> <hostname.domain.org> <hostname>
+
127.0.0.1 localhost.localdomain localhost
+
#::1 localhost.localdomain localhost
+
</nowiki>}}
+
otherwise there could be some connection errors because hosts are resolved to there IPv6 address which is not reachable.
+
  
=== Other programs ===
+
=== 使用dibbler ===
Disabling IPv6 functionality in the kernel does not prevent other programs from trying to use IPv6. In most cases, this is completely harmless, but if you find yourself having issues with that program, you should consult the program's manpages for a way to disable that functionality.
+
  
For instance, dhcpcd will continue to harmlessly attempt to perform IPv6 router solicitation. To disable this, as stated in the dhcpcd.conf manpage, add the following to {{ic|/etc/dhcpcd.conf}}:
+
[http://klub.com.pl/dhcpv6/ Dibbler]是一个支持地址委派的DHCPv6客户端及服务器。它在[[AUR]]中:{{AUR|dibbler}}。
 +
 
 +
如果你使用{{ic|dibbler}},修改{{ic|/etc/dibbler/client.conf}}:
 +
 
 +
log-mode short
 +
log-level 7
 +
# use the interface connected to your WAN
 +
iface "WAN" {
 +
  ia
 +
  pd
 +
}
 +
 
 +
{{小贴士|查阅手册页'''{{ic|dibbler-client(8)}}'''以获取更多的信息。}}
 +
 
 +
=== 使用dhcpcd ===
 +
 
 +
[[Dhcpcd]]在IPv4之外也提供了一个完整的支持DHCPv6-PD的客户端。如果你使用{{ic|dhcpcd}},需要修改{{ic|/etc/dhcpcd.conf}}。你可能已经在用dhcpcd来配置IPv4,所以只需要对现有的配置进行小幅修改:
 +
 
 +
duid
 
  noipv6rs
 
  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
 +
 +
这种配置下,客户端会从{{ic|WAN}}接口获取一个前缀,分配给{{ic|LAN}}接口。
 +
如果ISP分配的是{{ic|/64}}的地址,你需要用第二个{{ic|ia_pd}}选项。
 +
这也会禁用除{{ic|WAN}}接口之外的所有路由器请求。
 +
 +
{{小贴士|查阅手册页'''{{ic|dhcpcd(8)}}'''与'''{{ic|dhcpcd.conf(5)}}'''获得更多信息。}}
 +
 +
=== 使用WIDE-DHCPv6 ===
 +
 +
[http://wide-dhcpv6.sourceforge.net/ WIDE-DHCPv6]是原本由KAME计划开发的DHCPv6开源实现。它在[[AUR]]中:{{AUR|wide-dhcpv6}}。
 +
 +
如果你使用{{ic|wide-dhcpv6}},修改{{ic|/etc/wide-dhcpv6/dhcp6c.conf}}:
 +
 +
# use the interface connected to your WAN
 +
interface WAN {
 +
  send ia-pd 0;
 +
};
 +
 
 +
id-assoc pd 0 {
 +
  # use the interface connected to your LAN
 +
  prefix-interface LAN {
 +
    sla-id 1;
 +
    sla-len 8;
 +
  };
 +
};
 +
 +
{{注意|1={{ic|sla-len}}应设置为满足{{ic|1=(WAN-prefix) + (sla-len) = 64}}的值。这里示范的情况是针对一个长度{{ic|/56}}的前缀,56+8=64。对于前缀长度{{ic|/64}}的网络,{{ic|sla-len}}应为{{ic|0}}。}}
 +
 +
要启用或运行wide-dhcpv6,使用如下命令。把{{ic|WAN}}改为连接到ISP的网卡:
 +
 +
# systemctl enable/start dhcp6c@WAN.service
 +
 +
{{小贴士|查阅手册页'''{{ic|dhcp6c(8)}}'''与'''{{ic|dhcp6c.conf(5)}}'''获取更多信息。}}
 +
 +
== IPv6 on Comcast ==
 +
 +
{{ic|dhcpcd -4}} or {{ic|dhcpcd -6}} worked using a Motorola SURFBoard 6141 and a Realtek RTL8168d/8111d. Either would work, but would not run dual stack: both protocols and addresses on one interface. (The {{ic|-6}} command would not work if {{ic|-4}} ran first, even after resetting the interface. And when it did, it gave the NIC a /128 address.) Try these commands:
 +
 +
# dhclient -4 enp3s0
 +
# dhclient -P -v enp3s0
 +
 +
The {{ic|-P}} argument grabs a lease of the IPv6 prefix only. {{ic|-v}} writes to {{ic|stdout}} what is also written to {{ic|/var/lib/dhclient/dhclient6.leases}}:
 +
 +
Bound to *:546
 +
Listening on Socket/enp3s0
 +
Sending on  Socket/enp3s0
 +
PRC: Confirming active lease (INIT-REBOOT).
 +
XMT: Forming Rebind, 0 ms elapsed.
 +
XMT:  X-- IA_PD a1:b2:cd:e2
 +
XMT:  | X-- Requested renew  +3600
 +
XMT:  | X-- Requested rebind +5400
 +
XMT:  | | X-- '''IAPREFIX 1234:5:6700:890::/64'''
 +
 +
{{ic|IAPREFIX}} is the necessary value. Substitute {{ic|::1}} before the CIDR slash to make the prefix a real address:
 +
 +
# ip -6 addr add 1234:5:6700:890::1/64 dev enp3s0
 +
 +
== 禁用IPv6 ==
 +
 +
{{注意|Arch直接将IPv6支持编译进内核,因此不能禁用对应的内核模块。}}
 +
 +
{{Expansion|Add reasons why users may want to disable IPv6, such as low-quality DNS servers or firewall rules}}
 +
 +
=== 关闭IPv6支持 ===
 +
{{警告|禁用IPv6功能可能导致一些需要其启用的程序无法正常运行。{{bug|46297}}}}
 +
 +
向内核参数加入{{ic|1=ipv6.disable=1}}可以完全关闭IPv6功能,这应该就是你遇到问题时要做的事。查阅[[Kernel parameters]]以获取更多信息。
 +
 +
此外,只加入{{ic|1=ipv6.disable_ipv6=1}}内核参数可以保留IPv6功能,但不会向网卡分配IPv6地址。
 +
 +
也可以通过向{{ic|/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
 +
 +
注意你必须在这里清楚地列出所有不需要分配IPv6地址的网卡,仅仅设置{{ic|all.disable_ipv6}}并不会立刻对已经连接的网卡起作用。
 +
 +
另外,如果使用sysctl关闭IPv6,你应该在{{ic|/etc/hosts}}中删除所有的IPv6主机:
 +
 +
#<ip-address> <hostname.domain.org> <hostname>
 +
127.0.0.1 localhost.localdomain localhost
 +
#::1 localhost.localdomain localhost
 +
 +
如果忽略这一步,可能会出现连接错误,因为这些主机会解析到IPv6地址,无法连接。
 +
 +
=== 应用程序 ===
 +
 +
在内核中关闭IPv6功能不会阻止应用程序尝试使用IPv6。多数情况下,这样不会有问题,但如果你发现程序无法正常运行,你应该查阅该应用程序的手册页,以找到关闭IPv6的合适方法。
 +
 +
==== dhcpcd ====
 +
 +
''dhcpcd''会尝试发送IPv6路由器请求。要禁用这种行为,可以依照其手册页{{ic|dhcpcd.conf (5)}},向{{ic|/etc/dhcpcd.conf}}加入如下内容:
 +
 +
noipv6rs
 +
noipv6
 +
 +
==== NetworkManager ====
 +
 +
在图形界面下,关闭NetworkManager的IPv6支持可以以右键单击网络状态图表,依次选择''Edit Connections > Wired > ''Network name'' > Edit > IPv6 Settings > Method > Ignore/Disabled'',然后点击 "Save"。
 +
 +
在命令行终端下,关闭IPv6支持可以使用{{ic|nmcli}}:
 +
 +
# nmcli connection edit ''connection0''
 +
 +
其中,{{ic|connection0}}是要修改的网络名称。{{ic|nmcli}}运行后进入其命令行,输入如下命令:
 +
 +
nmcli> set ipv6.method ignore
 +
 +
连接到该网络时,NetworkManager不会再配置该网络的IPv6地址。
 +
 +
==== ntpd ====
 +
 +
依照[[Systemd#Drop-in snippets]]{{Broken section link}},修改{{ic|ntpd.service}}的启动方式:
 +
 +
# systemctl edit ntpd.service
 +
 +
这样会产生一个drop-in snippet,替代原有的{{ic|ntpd.service}}来加载ntpd。参数{{ic|-4}}关闭了ntpd的IPv6支持。向drop-in snippet中加入如下内容:
 +
 +
[Service]
 +
ExecStart=
 +
ExecStart=/usr/bin/ntpd -4 -g -u ntp:ntp
 +
 +
第一行清除了之前的{{ic|ExecStart}}配置,接下来的一行将该配置设置为带有{{ic|-4}}参数的ntpd。
 +
 +
== 参见 ==
  
==附加资源==
+
* [https://www.kernel.org/doc/Documentation/networking/ipv6.txt IPv6] - kernel.org documentation
*[http://www.kernel.org/doc/Documentation/networking/ipv6.txt ipv6] - kernel.org 文档库
+
* [http://www.ipsidixit.net/2012/08/09/ipv6-temporary-addresses-and-privacy-extensions/ IPv6 temporary addresses] - a summary about temporary addresses and privacy extensions
 +
* [http://tldp.org/HOWTO/Linux+IPv6-HOWTO/x513.html IPv6 prefixes] - a summary of prefix types
 +
* [http://tldp.org/HOWTO/Linux+IPv6-HOWTO/proc-sys-net-ipv6..html net.ipv6 options] - documentation of kernel parameters

Latest revision as of 09:56, 7 August 2016

翻译状态: 本文是英文页面 IPv6翻译,最后翻译时间:2015-10-24,点击这里可以查看翻译后英文页面的改动。

在Arch Linux中,IPv6是默认开启的。如果你需要找IPv6隧道的资料,请看IPv6 tunnel broker setup

邻居发现

向多播地址ff02::1发送PING可以获得局域网内所有主机的回应。使用时需要注明网卡:

$ ping6 ff02::1%eth0

向多播地址ff02::2发送PING,只有路由器会回应。

在PING时加入选项-I 你的ipv6公网地址,局域网内的主机会以各自的公网地址回应。这时不必注明网卡:

$ ping6 -I 2001:4f8:fff6::21 ff02::1

无状态地址自动配置 (SLAAC)

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

客户端

如果你使用netctl管理网络,那么只需要在网络配置中加入下面这一行:

 IP6=stateless

如果使用NetworkManager,它会自动检测网络情况并配置好IPv6.

请注意:只有IPv6 icmp数据包可以经过网络传输时,SLAAC才可以正常工作。所以在要配置IPv6的计算机上,必须修改防火墙,允许ipv6-icmp数据包进入。如果你使用Simple stateful firewalliptables,你只需要加入:

 -A INPUT -p ipv6-icmp -j ACCEPT

如果你使用了其他防火墙(ufw,shorewall等等),请查阅其文档,允许ipv6-icmp数据包。

网关

网关需要运行一个守护进程,以确保能够将IPv6地址分发给客户端。一般使用radvdofficial 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::/64prefix选项可以重复使用多次,分别记录不同的前缀。

网关必须在所有的方向上允许ipv6-icmp数据包。如果你使用Simple stateful firewalliptables,需要加入如下规则:

 -A INPUT -p ipv6-icmp -j ACCEPT
 -A OUTPUT -p ipv6-icmp -j ACCEPT
 -A FORWARD -p ipv6-icmp -j ACCEPT

使用其他防火墙也需要类似的规则。配置完成后可以开启radvd.service

IPv6隐私扩展

当一个客户端使用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

其中,nic0nicN是你的网卡。all.use_tempaddrdefault.use_tempaddr参数不会对已经配置好的网卡起作用。

重启之后,隐私扩展将会启用。

dhcpcd

dhcpcd从6.4.0版本起就在其默认配置文件中添加了选项slaac private,实现对隐私扩展的支持,可以实现"Stable Private IPv6 Addresses instead of hardware based ones",符合RFC 7217 。(commit)。因此,没有必要修改任何配置,除非你想经常更换地址,而不是在每次连接上新网络时。

NetworkManager

NetworkManager不遵守/etc/sysctl.d/40-ipv6.conf中的配置。可以在重启后运行$ ip -6 addr show interface验证:正常的地址之外,没有状态为scope global temporary的地址。

请查阅NetworkManager#Enable IPv6 Privacy Extensions

注意: 即使看起来开启隐私扩展产生的状态为scope global temporary的IPv6地址从不更新(它在过期后不进入deprecated状态),但已有验证在长时间之后它改变。

systemd-networkd

Systemd-networkd也不遵守/etc/sysctl.d/40-ipv6.conf的配置,需要在配置中设置IPv6PrivacyExtensions选项。

请查阅systemd-networkdsystemd.network(5) man page

静态地址

有些情况下使用静态地址可以增强安全性。使用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')
如果你的ISP没有告诉你IPv6的DNS服务器地址,并且你也没有自己的服务器,你可以从resolv.conf这篇文章中选一个。

IPv6与PPPoE

PPPoE的软件包pppd提供了对PPPoE之上的IPv6的支持(前提是你的ISP和调制解调器支持)。只需要将如下内容加入/etc/ppp/pppoe.conf

 +ipv6

如果你使用netctl,那么就向你的netctl配置文件加入如下内容:

 PPPoEIP6=yes

地址委派 (DHCPv6-PD)

注意: 这个部分是针对自行使用配置网关的内容,不是客户端。如果你使用从市场购得的路由器,请查阅其附带的文档以开启地址委派。

地址委派是一种常见的IPv6部署方式,被许多ISP所采用。具体的做法是将一个地址前缀分配给用户(局域网),即路由器配置为将不同的前缀分配给不同的子网;ISP通过DHCPv6将地址前缀(通常是/56/64)分发出去,DHCP客户端再将前缀分配给局域网。对于一个拥有两个网卡的简单网关来说,它的工作就是将从WAN口(或虚拟接口,比如ppp)获取的前缀分配给局域网。

使用dibbler

Dibbler是一个支持地址委派的DHCPv6客户端及服务器。它在AUR中:dibblerAUR

如果你使用dibbler,修改/etc/dibbler/client.conf

log-mode short
log-level 7
# use the interface connected to your WAN
iface "WAN" {
  ia
  pd
}
小贴士: 查阅手册页dibbler-client(8)以获取更多的信息。

使用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选项。 这也会禁用除WAN接口之外的所有路由器请求。

小贴士: 查阅手册页dhcpcd(8)dhcpcd.conf(5)获得更多信息。

使用WIDE-DHCPv6

WIDE-DHCPv6是原本由KAME计划开发的DHCPv6开源实现。它在AUR中:wide-dhcpv6AUR

如果你使用wide-dhcpv6,修改/etc/wide-dhcpv6/dhcp6c.conf

# use the interface connected to your WAN
interface WAN {
  send ia-pd 0;
};
 
id-assoc pd 0 {
  # use the interface connected to your LAN
  prefix-interface LAN {
    sla-id 1;
    sla-len 8;
  };
};
注意: sla-len应设置为满足(WAN-prefix) + (sla-len) = 64的值。这里示范的情况是针对一个长度/56的前缀,56+8=64。对于前缀长度/64的网络,sla-len应为0

要启用或运行wide-dhcpv6,使用如下命令。把WAN改为连接到ISP的网卡:

# systemctl enable/start dhcp6c@WAN.service
小贴士: 查阅手册页dhcp6c(8)dhcp6c.conf(5)获取更多信息。

IPv6 on Comcast

dhcpcd -4 or dhcpcd -6 worked using a Motorola SURFBoard 6141 and a Realtek RTL8168d/8111d. Either would work, but would not run dual stack: both protocols and addresses on one interface. (The -6 command would not work if -4 ran first, even after resetting the interface. And when it did, it gave the NIC a /128 address.) Try these commands:

# dhclient -4 enp3s0
# dhclient -P -v enp3s0

The -P argument grabs a lease of the IPv6 prefix only. -v writes to stdout what is also written to /var/lib/dhclient/dhclient6.leases:

Bound to *:546
Listening on Socket/enp3s0
Sending on   Socket/enp3s0
PRC: Confirming active lease (INIT-REBOOT).
XMT: Forming Rebind, 0 ms elapsed.
XMT:  X-- IA_PD a1:b2:cd:e2
XMT:  | X-- Requested renew  +3600
XMT:  | X-- Requested rebind +5400
XMT:  | | X-- IAPREFIX 1234:5:6700:890::/64

IAPREFIX is the necessary value. Substitute ::1 before the CIDR slash to make the prefix a real address:

# ip -6 addr add 1234:5:6700:890::1/64 dev enp3s0

禁用IPv6

注意: Arch直接将IPv6支持编译进内核,因此不能禁用对应的内核模块。

Tango-view-fullscreen.pngThis article or section needs expansion.Tango-view-fullscreen.png

Reason: Add reasons why users may want to disable IPv6, such as low-quality DNS servers or firewall rules (Discuss in Talk:IPv6 (简体中文)#)

关闭IPv6支持

警告: 禁用IPv6功能可能导致一些需要其启用的程序无法正常运行。FS#46297

向内核参数加入ipv6.disable=1可以完全关闭IPv6功能,这应该就是你遇到问题时要做的事。查阅Kernel parameters以获取更多信息。

此外,只加入ipv6.disable_ipv6=1内核参数可以保留IPv6功能,但不会向网卡分配IPv6地址。

也可以通过向/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

注意你必须在这里清楚地列出所有不需要分配IPv6地址的网卡,仅仅设置all.disable_ipv6并不会立刻对已经连接的网卡起作用。

另外,如果使用sysctl关闭IPv6,你应该在/etc/hosts中删除所有的IPv6主机:

#<ip-address> <hostname.domain.org> <hostname>
127.0.0.1 localhost.localdomain localhost
#::1 localhost.localdomain localhost

如果忽略这一步,可能会出现连接错误,因为这些主机会解析到IPv6地址,无法连接。

应用程序

在内核中关闭IPv6功能不会阻止应用程序尝试使用IPv6。多数情况下,这样不会有问题,但如果你发现程序无法正常运行,你应该查阅该应用程序的手册页,以找到关闭IPv6的合适方法。

dhcpcd

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

noipv6rs
noipv6

NetworkManager

在图形界面下,关闭NetworkManager的IPv6支持可以以右键单击网络状态图表,依次选择Edit Connections > Wired > Network name > Edit > IPv6 Settings > Method > Ignore/Disabled,然后点击 "Save"。

在命令行终端下,关闭IPv6支持可以使用nmcli:

# nmcli connection edit connection0

其中,connection0是要修改的网络名称。nmcli运行后进入其命令行,输入如下命令:

nmcli> set ipv6.method ignore 

连接到该网络时,NetworkManager不会再配置该网络的IPv6地址。

ntpd

依照Systemd#Drop-in snippets[broken link: invalid section],修改ntpd.service的启动方式:

# 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。

参见