主机和客户机之间的 IPv6 路由

主机和客户机之间的 IPv6 路由

我目前面临与当前设置有关的问题。我基本上有一个专用服务器,已为其分配了 /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 虚拟机。

相关内容