通過額外的公共 IP 訪問訪客虛擬機
我有一個 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 位網路遮罩。
這涵蓋了一般意義上的事物。希望這些資訊足以讓您做出決定並正確配置。