通过额外的公共IP访问访客虚拟机

我有一个CentOS专用服务器(Hetzner):
IP:aa.bb.cc. 16
网关:aa.bb.cc.1
networking掩码:255.255.255.255

和额外的IP(安装了Debian的guest虚拟机(libvirt)):
IP:aa.bb.cc. 61
网关:aa.bb.cc.1
networking掩码:255.255.255.192

我使用Hetzner文档( https://wiki.hetzner.de/index.php/Netzkonfiguration_CentOS/en#Routed_.28brouter.29 )设置了路由configuration。

主机configuration:
cat /etc/sysctl.conf

net.ipv4.conf.all.rp_filter=1 net.ipv4.icmp_echo_ignore_broadcasts=1 net.ipv4.ip_forward=1 net.ipv6.conf.all.forwarding=1 net.ipv4.conf.default.proxy_arp=1 net.ipv4.conf.all.send_redirects=0 net.ipv4.conf.eth0.send_redirects=0 net.ipv4.conf.br0.send_redirects=0 net.ipv4.conf.default.send_redirects=0 net.bridge.bridge-nf-call-ip6tables = 0 net.bridge.bridge-nf-call-iptables = 0 net.bridge.bridge-nf-call-arptables = 0 

cat / etc / sysconfig / network-scripts / ifcfg-eth0

 DEVICE=eth0 ONBOOT=yes HWADDR=XX:XX:XX:XX:XX:XX BOOTPROTO=none IPADDR=aa.bb.cc.16 NETMASK=255.255.255.255 SCOPE="peer aa.bb.cc.1" IPV6INIT=yes IPV6ADDR=2a01:4f8:yyy:yyyy::2/128 IPV6_DEFAULTGW=fe80::1 IPV6_DEFAULTDEV=eth0 

cat / etc / sysconfig / network-scripts / ifcfg-br0

 DEVICE=br0 ONBOOT=yes TYPE="Bridge" BOOTPROTO=static IPADDR=aa.bb.cc.16 NETMASK=255.255.255.255 IPV6INIT=yes IPV6ADDR=2a01:4f8:yyy:yyyy::2/64 STP=off DELAY=0 

cat / etc / sysconfig / network-scripts / route-br0

 ADDRESS0=aa.bb.cc.61 NETMASK0=255.255.255.255 

访客configuration:
猫/ etc / network / interfaces

 auto lo iface lo inet loopback auto eth0 iface eth0 inet static address aa.bb.cc.61 netmask 255.255.255.255 pointopoint aa.bb.cc.16 gateway aa.bb.cc.16 dns-nameservers 212.133.98.98 212.133.99.99 212.133.100.100 iface eth0 inet6 static address 2a01:4f8:yyy:yyyy::4 netmask 64 address 2a01:4f8:yyy:yyyy::2 

从访客虚拟机到互联网的互联网访问我已经添加了一个规则:

 iptables -t nat -A POSTROUTING -o eth0 -s aa.bb.cc.61 -j SNAT --to-source aa.bb.cc.16 

问题:可以通过访客IP aa.bb.cc从互联网访问访客虚拟机。 61在路由模式? 当我从外面(互联网)ping到aa.bb.cc. 61我收到'Request timed out'。 但aa.bb.cc.16(主机)ping确定。 我必须添加什么规则?

谢谢。

首先,需要明确一些事情。

您正在使用的指南是指“路由器模式”和“桥接模式”。

所描述的路由器模式几乎是毫无意义的。 它涉及创build一个空的“仅主机”桥接器,将虚拟机连接到该虚拟机,然后将IP级别的stream量从该网桥路由到出站接口。 这忽略了libvirt可以创build自己的NAT虚拟接口(具有可选路由,DHCP和DNS)并将VM接口连接到该接口的事实。 实际上,libvirt默认创build并启用了这个networking。 它被称为“默认”networking。

在你的情况下,你有两个子网(我假设是在单独的第二层域 – 几乎所有情况下都是如此)。 一个地址将被用来访问你的pipe理程序“aa.bb.cc.16 / 32”(这是一个无效的子网 – 稍后更多)这个地址可以直接放在一个接口上。

然后你在另一个子网上有第二个IP(aa.bb.cc.61 / 26)。 该地址需要在guest虚拟机内的VM接口上。 这可以直接使用网桥来完成,虽然您发布的指南最初为“路由模式”提供了不好的解决scheme,但直接使用的网桥的build议configuration实际上是正确的做法。 但是,它也提供了一个完全不正确的configuration。

以下networkingconfiguration适用于所述网桥,只要您更新值以反映您的scheme:

 # /etc/sysconfig/network-scripts/ifcfg-eth0 # device: eth0 DEVICE=eth0 BOOTPROTO=static ONBOOT=yes BRIDGE=br0 # /etc/sysconfig/network-scripts/ifcfg-br0 DEVICE=br0 TYPE="Bridge" BOOTPROTO=static ONBOOT=yes 

完成此操作后,将此网桥用作连接虚拟机网卡的设备。 如果需要的话,你可以在桥上放置一个IP地址,允许主机和来宾之间的通信。 但是,这将在您要求公开访问的子网上。 如果你确实需要主机到客户端的通信,我会build议通过“默认”的NAT接口,或通过一个空的网桥与主机和来宾私人IP空间(这将创build总共两个网卡VM)。

顺便提一下,您为pipe理程序IP(255.255.255.255)发布的networking掩码是32位。 这不会允许在其networking上的一个地址,我认为这只是一个错字。 如果不是拼写错误,则需要使用实际允许主机的地址空间,即使它只是一个31位的networking掩码。

这涵盖了一般意义上的东西。 希望这些信息足以让你作出正确的决定和configuration。

这里是工作解决scheme:

cat / etc / sysconfig / network-scripts / ifcfg-eth0

 DEVICE=eth0 ONBOOT=yes HWADDR=XX:XX:XX:XX:XX:XX BOOTPROTO=none IPADDR=aa.bb.cc.16 NETMASK=255.255.255.255 SCOPE="peer aa.bb.cc.1" BRIDGE=br0 

cat / etc / sysconfig / network-scripts / ifcfg-br0

 DEVICE=br0 TYPE=Bridge BOOTPROTO=static IPADDR=aa.bb.cc.16 NETMASK=255.255.255.255 SCOPE="peer aa.bb.cc.1" ONBOOT=yes DELAY=0 

mv / etc / sysconfig / network-scripts / route-eth0 / etc / sysconfig / network-scripts / route-br0 cat cat / etc / sysconfig / network-scripts / route-br0

 ### Hetzner Online GmbH - installimage # routing for eth0 ADDRESS0=0.0.0.0 NETMASK0=0.0.0.0 GATEWAY0=aa.bb.cc.1 

访客configuration:
猫/ etc / network / interfaces

 auto lo iface lo inet loopback auto eth0 iface eth0 inet static address aa.bb.cc.61 netmask 255.255.255.255 pointopoint aa.bb.cc.16 gateway aa.bb.cc.16 dns-nameservers 212.133.98.98 212.133.99.99 212.133.100.100 hwaddress ether 00:01:02:ab:cd:de # MAC Address for additional IP