我目前面临与当前设置有关的问题。我基本上有一个专用服务器,已为其分配了 /64 IPv6 子网 (2a01:4f8:221:1e81::/64)。主机上的连接工作正常,因为我可以从那里 ping ipv6.google.com。
此外,这是配置:
root@void ~ # ifconfig vmbr0
vmbr0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.250.0.1 netmask 255.255.0.0 broadcast 10.250.255.255
inet6 2a01:4f8:221:1e81:1:ffff:ffff:ffff prefixlen 80 scopeid 0x0<global>
inet6 2a01:4f8:221:1e81:212:ffff:ffff:ffff prefixlen 80 scopeid 0x0<global>
inet6 2a01:4f8:221:1e81:253:ffff:ffff:ffff prefixlen 80 scopeid 0x0<global>
inet6 2a01:4f8:221:1e81:251:ffff:ffff:ffff prefixlen 80 scopeid 0x0<global>
inet6 fe80::70a5:a1ff:fed6:8c0 prefixlen 64 scopeid 0x20<link>
ether 4a:5a:df:ab:a8:bc txqueuelen 1000 (Ethernet)
RX packets 949686094 bytes 162428268530 (151.2 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 285868499 bytes 143826674082 (133.9 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
root@void ~ #
路由表:
root@void ~ # ip -6 route show
2a01:4f8:221:1e81:1::/80 dev vmbr0 proto kernel metric 256 pref medium
2a01:4f8:221:1e81:212::/80 dev vmbr0 proto kernel metric 256 pref medium
2a01:4f8:221:1e81:251::/80 dev vmbr0 proto kernel metric 256 pref medium
2a01:4f8:221:1e81:253::/80 dev vmbr0 proto kernel metric 256 pref medium
2a01:4f8:221:1e81::/64 dev eth0 proto kernel metric 256 pref medium
fe80::/64 dev eth0 proto kernel metric 256 pref medium
fe80::/64 dev vmbr0 proto kernel metric 256 pref medium
default via fe80::1 dev eth0 metric 1024 pref medium
root@void ~ #
当我 ssh 进入虚拟机并配置网络时,问题就出现了。在此示例中,我有以下配置:
hypnotize@irc:~$ cat /etc/network/interfaces | tail -n4
iface eth0 inet6 static
address 2a01:4f8:101:3172:251::3
netmask 80
gateway 2a01:4f8:101.3172:251:ffff:ffff:ffff
hypnotize@irc:~$
因此,ifconfig 看起来像:
hypnotize@irc:~$ sudo ifconfig
[sudo] password for hypnotize:
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.250.3.6 netmask 255.255.0.0 broadcast 10.250.255.255
inet6 fe80::9474:f1ff:fe6f:4bc3 prefixlen 64 scopeid 0x20<link>
inet6 2a01:4f8:101:3172:251::3 prefixlen 80 scopeid 0x0<global>
ether 96:74:f1:6f:4b:c3 txqueuelen 1000 (Ethernet)
RX packets 177 bytes 16270 (15.8 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 161 bytes 18477 (18.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 0 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
hypnotize@irc:~$
当路由表出现时:
hypnotize@irc:~$ ip -6 route show
2a01:4f8:101:3172:251::/80 dev eth0 proto kernel metric 256
fe80::/64 dev eth0 proto kernel metric 256
hypnotize@irc:~$
不幸的是,当我尝试 ping6 时,它显示“连接:网络无法访问”。我有net.ipv6.conf.全部转发已启用。
您发现我的配置有错误吗?提前致谢
我已更正了打字错误,现在内容是:
root@irc:/home/hypnotize# ping6 ipv6.google.com
PING ipv6.google.com(fra16s20-in-x0e.1e100.net (2a00:1450:4001:821::200e)) 56 data bytes
From 2a01:4f8:101:3172:251::3 (2a01:4f8:101:3172:251::3) icmp_seq=1 Destination unreachable: Address unreachable
From 2a01:4f8:101:3172:251::3 (2a01:4f8:101:3172:251::3) icmp_seq=2 Destination unreachable: Address unreachable
From 2a01:4f8:101:3172:251::3 (2a01:4f8:101:3172:251::3) icmp_seq=3 Destination unreachable: Address unreachable
^C
--- ipv6.google.com ping statistics ---
5 packets transmitted, 0 received, +3 errors, 100% packet loss, time 4032ms
root@irc:/home/hypnotize#
此外,路由表现在看起来更好了,至少它有一个默认条目:
root@irc:/home/hypnotize# ip -6 route show
2a01:4f8:101:3172:251::/80 dev eth0 proto kernel metric 256
fe80::/64 dev eth0 proto kernel metric 256
default via 2a01:4f8:101:3172:251:ffff:ffff:ffff dev eth0 metric 1024
root@irc:/home/hypnotize#
答案1
与许多企业一样,Hetzner 在其网络交换机上运行交换机端口安全性,这意味着只有授权的 MAC 地址才能与网络通信。这意味着服务器中 NIC 的硬件地址可以通信,但虚拟机的虚拟 MAC 地址不能。因此,无法将您的虚拟机直接桥接到外界。(如果您订购了额外的 IPv4 地址,那么 Hetzner 将允许您为每个地址生成虚拟 MAC 地址,您可以将这些地址分配给您的虚拟机,这将使此设置正常工作,但如果您没有额外的 IPv4 地址或不想购买它们,那么您就无法这样做。)
我在 Hetzner 上有一个 KVM 虚拟机主机,其中的虚拟机大多只能通过 IPv6 访问,这就是我的设置方式。
我没有直接桥接到主机 NIC,而是为每个 /80 创建虚拟网络,并将虚拟机分配给这些虚拟网络。然后,主机将在主机 NIC 和虚拟网络之间进行路由,这些虚拟网络不是桥接的(第 2 层),而是路由的(第 3 层)。
因此主机配置为:
IPV6ADDR="2a01:4f8:150:43ea::2/64"
IPV6_DEFAULTGW="fe80::1"
libvirt 虚拟网络配置为 /80 网络。Virt-manager 无法处理创建 /80 网络,因此您需要自己编写 XML。以下是示例:
<network>
<name>v6net1</name>
<forward mode='route'/>
<bridge name='v6net1' stp='on' delay='0'/>
<domain name='v6net1'/>
<ip address='192.168.101.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.101.128' end='192.168.101.254'/>
</dhcp>
</ip>
<ip family='ipv6' address='2a01:4f8:150:43ea:1::1' prefix='80'>
<dhcp>
<range start='2a01:4f8:150:43ea:1::1000' end='2a01:4f8:150:43ea:1::ffff'/>
</dhcp>
</ip>
</network>
现在,所有虚拟机的 NIC 都已添加到 v6net1 网络,并从 DHCPv6 获取此 /80 中的地址。不过,如果您愿意,也可以手动分配它们。这将创建一个网桥 v6net1,但主机 NIC 不是网桥的一部分。因此,流量在虚拟机和外界之间路由,离开主机时,流量具有主机的 MAC 地址。
这不包括全局 IPv4 连接,例如伪装或端口转发。我在 libvirt 之外的防火墙中单独处理此问题,并且不使用 libvirt 的 NAT 功能。如果您只想要一个简单的 NAT,以便虚拟机可以连接到 IPv4 主机,并且不需要传入流量,请使用<forward mode='nat'>
。您也可以完全省略 IPv4 设置,以获得纯 IPv6 虚拟机。