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

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

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

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

我已经根据 Hetzner 文档设置了路由配置(https://wiki.hetzner.de/index.php/Netzkonfiguration_CentOS/en#Routed_.28brouter.29)。

主机配置:
猫/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  

猫/等/系统配置/网络脚本/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

猫/等/系统配置/网络脚本/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

来宾配置:
猫/等/网络/接口

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我收到“请求超时”信息。但 aa.bb.cc.16(主机)ping 成功。我必须添加什么规则?

谢谢。

答案1

首先,需要明确几件事。

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

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

就您而言,您有两个子网(我假设它们位于不同的第 2 层域中 - 几乎所有情况都是如此)。一个地址将用于访问您的虚拟机管理程序“aa.bb.cc.16/32”(这是一个无效子网 - 稍后会详细介绍)此地址可以直接放置在接口上。

然后,您在另一个子网上有了第二个 IP(aa.bb.cc.61/26)。此地址需要进入客户机内的 VM 接口。这可以直接使用桥接器完成,虽然您发布的指南最初为“路由模式”提供了糟糕的解决方案,但直接使用桥接器的建议配置实际上是正确的做法。但是,它也提供了完全错误的配置。

以下网络配置将适用于所述桥接器,只要您更新值来反映您的场景:

# /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 地址,以允许主机和客户机之间进行通信。但是,这将位于您用于公共访问的子网上。如果您确实需要主机到客户机的通信,我建议通过“默认”NAT 接口或通过在主机和客户机上都有私有 IP 空间的空网桥(这将在虚拟机上创建两个网卡)使用私有第 2 层域。

顺便提一下,您为虚拟机管理程序 IP (255.255.255.255) 发布的子网掩码是 32 位。这将不允许在其网络上使用单个地址,我假设这只是一个拼写错误。如果不是拼写错误,您需要使用一个实际上允许主机的地址空间,即使它只是一个 31 位子网掩码。

这涵盖了一般意义上的内容。希望这些信息足以让您做出决定并正确配置。

答案2

这是可行的解决方案:

猫/等/系统配置/网络脚本/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

猫/等/系统配置/网络脚本/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 猫 猫/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

来宾配置:
猫/等/网络/接口

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

相关内容