我花了几天时间尝试让它工作,但那里的指南要么模糊要么过时,在这篇文章的底部,我添加了一些我尝试遵循的指南的链接。我在 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 domU
、virsh console domU
或连接到客户的 VNC 会话(如果适用))。
客人
接下来是比较难的部分。如何覆盖网络健全性检查因操作系统而异。我将介绍Debian/Ubuntu,RHEL/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)”,然后点击“属性”。填写如下字段:
当您单击“确定”时,您会收到以下警告:
单击“确定”确认您仍然要使用该网关。
几秒钟后,您应该能够通过 访客 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.1
172.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.2
172.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/32
、10.0.0.2/32
等等),因为 OpenStack 不支持 Hetzner、OVH 和 Online.net 开箱即用的虚拟机不寻常的网络结构。这仍然是一个未解决的问题。
其他资源
- OVH:如何配置主机以桥接虚拟化分布?
- 超级用户:我给出的另一个关于桥接网络的答案,还涵盖一对多 NAT