Centos

通過額外的公共 IP 訪問訪客虛擬機

  • October 12, 2016

我有一個 CentOS 專用伺服器(Hetzner):

IP:aa.bb.cc。16

網關:aa.bb.cc.1 網路

遮罩:255.255.255.255

和附加 IP(安裝了 Debian 的來賓 VM(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 )設置了路由配置。

主機配置:

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  

貓 /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

貓 /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

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

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

訪客配置:

cat /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

對於從訪客 VM 到 Internet 的 Internet 訪問,我添加了一條規則:

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

問題:可以通過訪客 IP aa.bb.cc 從 Internet 訪問訪客 VM。61在路由模式下?當我從外部(網際網路)ping 到 aa.bb.cc 時。61我收到“請求超時”。但是 aa.bb.cc.16(主機)ping 正常。我必須添加什麼規則?

謝謝你。

這是工作解決方案:

貓 /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

貓 /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

訪客配置:

cat /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

首先,有幾點需要明確。

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

所描述的路由器模式幾乎完全沒有意義。它涉及創建一個空的“僅主機”網橋,將您的 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

完成此操作後,使用此網橋作為連接 VM NIC 的設備。如果需要,您可以在網橋本身上放置一個 IP 地址,從而允許主機和來賓之間進行通信。但是,這將在您申請公共訪問的子網上。如果您確實需要主機到來賓通信,我建議通過“預設”NAT 介面或通過在主機和來賓上都具有專用 IP 空間的空橋(這將在虛擬機)。

附帶說明一下,您為管理程序 IP (255.255.255.255) 發布的網路遮罩是 32 位。這將不允許在其網路上使用單個地址,我假設這只是一個錯字。如果不是錯字,您需要使用實際上允許主機的地址空間,即使它只是 31 位網路遮罩。

這涵蓋了一般意義上的事物。希望這些資訊足以讓您做出決定並正確配置。

引用自:https://serverfault.com/questions/807871