可能的解决方案

可能的解决方案

我花了几天时间尝试让它工作,但那里的指南要么模糊要么过时,在这篇文章的底部,我添加了一些我尝试遵循的指南的链接。我在 hetzner 有一台专用机器,我想设置虚拟化我可以创建虚拟机,没有问题,我遇到的问题是网络,在 hetzner 网络上你不能使用简单的桥接,因为它们会将任何额外的子网路由到你的主机主 ip,如果 mac 地址与主机不匹配,它们将不会接受数据包。

我已经弄清楚我需要使用路由网络通过我的 eth0 连接来路由我的子网,我试了一次又一次,但我永远无法让网络工作,我根本无法访问我的 vm,甚至无法访问 dom0,我通常可以从我从 dom0 分配的地址 ssh 进入服务器,我运行了 tcpdump 和 ping 数据包到达 dom0,而它们本来应该到达 domU,但它只是停在那里,而没有到达 domU。

我尝试过的一个解决方案是使用 virtualizor,而且它第一次就起作用了,我的想法是只采用它的配置并在没有控制面板的情况下复制它,因为我不需要控制面板,而为不需要的东西付费似乎对我来说毫无意义,因为我是这台机器及其虚拟机的唯一用户。

我使用的是基于 Debian 的操作系统和 xl 工具,因为我主要使用 Debian Jessie,我希望操作系统在合理的安全更新支持范围内,我也尝试过 Ubuntu 14.04 及以上版本。我认为问题出在接口文件设置上,但我不知道哪里出了问题。

任何帮助将非常感激

基于 LVM 的路由 XEN VM
Hetzner Xen IPv4 子网 + IPv6 子网
在 Hetzner 专用服务器上设置 XEN
在 Hetzner 上设置 Ubuntu 12.04 和 Xen

答案1

Hetzner、OVH 和 Online.net 服务器上的路由模式的虚拟机网络配置是违反直觉的,因为您的网络类似于以下内容:

Host IP:       192.168.0.2
Host Netmask:  255.255.255.0 (/24)
Host Gateway:  192.168.0.1

Guest IP:      10.0.0.1
Guest Netmask: 255.255.255.255 (/32)
Guest Gateway: 192.168.0.1
Guest MAC:     02:00:00:01:02:03

上面的例子仅仅是一个例子,而不是您可以从上述任何托管服务提供商处获得的示例 IP 地址。

啊?什么?你怎么能有一个只有一个 IP 地址的子网(10.0.0.1/32)?没有网关的空间!为什么网关位于一个完全不同的子网(192.168.0.0/24)上?

这些问题导致 Linux 和 Windows 无法通过网络健全性检查,因为它们无法理解网络。它们认为网关无法访问。

Hetzner、OVH 和 Online.net 使用了一些网络技巧,使得网关无论如何都可以访问。

幸运的是,无论是在 Linux 还是 Windows 上,您都可以覆盖健全性检查并设置上述接口配置。


可能的解决方案

静态寻址

这是最容易做到的。您需要在主机上进行的最多配置就是创建桥接。

主持人

Debian/Ubuntu,如果您的管理/Internet 接口是eth0,您可以编辑以拥有如下/etc/network/interfaces桥接器:br0

auto eth0
iface eth0 inet manual

auto br0
iface br0 inet static
        address 192.168.0.2   # Host IP
        netmask 255.255.255.0 # Host Netmask
        gateway 192.168.0.1   # Host Gateway
        metric 0
        bridge_ports eth0
        bridge_stp on
        bridge_fd 0
        bridge_maxwait 0

运行sudo service networking restart以使桥接网络配置生效。

RHEL/CentOS,如果您的管理/Internet 接口是eth0,您可以像这样编辑/etc/sysconfig/network-scripts/ifcfg-eth0以使用桥接:br0

TYPE="Ethernet"
BOOTPROTO="none"
DEVICE="eth0"
ONBOOT="yes"
NM_CONTROLLED="no"
BRIDGE="br0"

然后创建一个新文件/etc/sysconfig/network-scripts/ifcfg-br0来配置桥接器:

DEVICE="br0"
BOOTPROTO="static"
IPADDR="192.168.0.2"    # Host IP
NETMASK="255.255.255.0" # Host Netmask
GATEWAY="192.168.0.1"   # Host Gateway
ONBOOT="yes"
TYPE="Bridge"
NM_CONTROLLED="no"

运行sudo service network restart以使桥接网络配置生效。

如果您仍然连接到您的服务器,那么恭喜您,您已经拥有一个可以正常运行的桥!

虚拟机管理程序

西恩(libxenlight),这是您需要为虚拟接口配置编写的全部内容:

vif=[ 'mac=02:00:00:01:02:03,bridge=br0' ]

请注意,这02:00:00:01:02:03是 Hetzner、OVH 或 Online.net 为访客网络提供的 MAC 地址,也是br0我们刚刚在上面配置的桥接器。

如果你使用虚拟器,在<devices>标签里面,添加这个接口:

<interface type='bridge'>
  <mac address='02:00:00:01:02:03'/>
  <source bridge='br0'/>
</interface>

一旦为该虚拟接口配置了正确的 MAC 地址和桥接器,就可以启动您的客户机并连接到其控制台(xl console domUvirsh console domU或连接到客户的 VNC 会话(如果适用))。

客人

接下来是比较难的部分。如何覆盖网络健全性检查因操作系统而异。我将介绍Debian/UbuntuRHEL/CentOS, 和微软Windows NT

Debian/Ubuntu如果调用该接口eth0,则写入/etc/network/interfaces

auto eth0
iface eth0 inet static
        address 10.0.0.1    # Guest IP
        broadcast 10.0.0.1  # Guest IP
        netmask 255.255.255.255
        gateway 192.168.0.1 # Guest Gateway, a.k.a. Host Gateway
        post-up route add 192.168.0.1 dev eth0
        post-up route add default gw 192.168.0.1
        pre-down route del 192.168.0.1 dev eth0
        pre-down route del default gw 192.168.0.1

post-up和iproute2命令post-down告诉操作系统无论如何都要应用网关,即使它位于不同的子网上。

运行后sudo service networking restart,您现在应该能够通过 Guest IP 访问您的客户机10.0.0.1

RHEL/CentOS如果调用该接口eth0,则写入/etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE="eth0"
BOOTPROTO="none"
ONBOOT="yes"
USERCTL="no"
PEERDNS="yes"
TYPE="Ethernet"
NETMASK="255.255.255.255"
IPADDR="10.0.0.1"          # Guest IP
GATEWAY="192.168.0.1"      # Guest Gateway, a.k.a. Host Gateway
ARP="yes"
HWADDR="02:00:00:01:02:03" # Guest MAC

然后,将以下内容写入/etc/sysconfig/network-scripts/route-eth0

192.168.0.1 dev eth0
default via 192.168.0.1 dev eth0

该文件告诉 iproute2 无论如何都要应用网关,即使它位于不同的子网上。

运行后sudo service network restart,您现在应该能够通过 Guest IP 访问您的客户机10.0.0.1

微软Windows NT,进入控制面板中的网络连接,右键点击接口,点击“属性”。在“网络”选项卡下,选择“Internet 协议版本 4 (TCP/IPv4)”,然后点击“属性”。填写如下字段:

Internet 协议版本 4 (TCP/IPv4) 属性

当您单击“确定”时,您会收到以下警告:

Microsoft TCP/IP:警告 - 默认网关不在 IP 地址和子网掩码定义的同一网段(子网)上。是否要保存此配置?

单击“确定”确认您仍然要使用该网关。

几秒钟后,您应该能够通过 访客 IP 联系到您的访客10.0.0.1

DHCP 动态寻址

不幸的是,这是不可能的。即使您以某种方式拦截了访客的 DHCPDISCOVER,也没有 DHCP 服务器会为您分配10.0.0.1/32网关并告诉您网关是192.168.0.1。而且没有 DHCP 客户端会接受这种奇怪的配置。

您需要一个结构合理且子网内有网关的网络来设置 DHCP。唯一的方法是创建一个私有网络 ( ),并通过网关 ( )172.16.0.0/12在客户机的私有 IP 地址 ( 172.16.0.2) 和其公共 IP 地址 ( ) 之间进行网络地址转换。10.0.0.1172.16.0.1

专用网络和 NAT

虽然我已经验证了上述所有步骤,但我从未成功创建过一对一/基础将私有 IP NAT 为公有 IP。部分原因是构建网络需要做很多工作。

你的网络可能看起来像这样:

Guest Public IP:  10.0.0.1
Guest Private IP: 172.16.0.2
Guest Netmask:    255.240.0.0 (/12)
Guest Gateway:    172.16.0.1

然后,主机将通过访客网关转发访客公共 IP10.0.0.1和访客私有 IP之间的流量。172.16.0.2172.16.0.1

OpenStack(哪个通过 libvirt 支持 Xen)可以通过其网络抽象提供此 NAT 设置以及私有子网 DHCP 服务器,OpenStack Neutron,但设置OpenStack本身却相当麻烦。

我能够安装单节点 OpenStack 并为 Nova 实例/来宾/服务器运行 Neutron 私有网络,但我无法弄清楚如何将私有 IP 地址 ( 172.16.0.0/12) NAT 为外部网络 IP 地址(10.0.0.1/3210.0.0.2/32等等),因为 OpenStack 不支持 Hetzner、OVH 和 Online.net 开箱即用的虚拟机不寻常的网络结构。这仍然是一个未解决的问题。


其他资源

相关内容