如何在两个虚拟机之间建立桥梁?

如何在两个虚拟机之间建立桥梁?

我曾经virt-install在 CentOS 7 主机上创建两个 CentOS 7 虚拟机。一台虚拟机称为webvm,并在专用网络上托管网站。另一个虚拟机称为datavm,其唯一目的是作为 上托管的 Web 应用程序的虚拟数据库服务器webvm如何设置网络,以便datavm仅允许来自 的数据连接webvm,并且这些数据连接发生在物理服务器框中? 我想确保之间的数据库事务webvm不会datavm跨本地网络传输。

请注意,桥接网络已将主机操作系统链接到每个来宾操作系统。

的局域网 ip和的网络 ipwebvm是。托管的典型 Web 应用程序的连接字符串是: 10.0.0.6datavm10.0.0.5webvm

jdbc:mysql://localhost:3306/somedb?autoReconnect=true

你可以看到localhost指的是webvm.显然,我们需要设置一个新的、具有 10.1.1.x 地址的第二个桥接网络,以便连接字符串变为jdbc:mysql://10.1.1.1:3306/somedb?autoReconnect=true.

无论我们添加什么新的桥接网络代码,都不得与预先存在的桥接网络发生冲突。

datavm那么如何在和之间建立一对一、独占的数据连接呢webvm


正在进行的更新工作:


@derobert 建议采取以下步骤:

1.) Add a second bridge to the host. 
2.) Add a second network interface to webvm, connected to the new host bridge. 
3.) Add a second network interface to datavm, connected to the new host bridge.
4.) Configure the new network interfaces inside each guest.  

为此,我通过在以下位置运行以下命令获得了基线主持人:

[root@localhost ~]# nmcli con show
NAME               UUID                                  TYPE            DEVICE 
bridge-slave-eno1  c36fd051-cacc-4e91-944f-a98f4fee26ff  802-3-ethernet  eno1   
bridge-br0         d472bc86-0f75-4dd5-bfee-5b8208b3fed2  bridge          br0    
System eno1        abf4c85b-57cc-4484-4fa9-b4a71689c359  802-3-ethernet  --     
vnet1              ea985e89-94fb-403c-af33-7daefb378ca5  generic         vnet1  
vnet0              06deb20d-b0b7-4233-8abc-cbb285165082  generic         vnet0  
[root@localhost ~]# 

然后我在里面运行了以下内容webvm:

[root@localhost ~]# nmcli con show
NAME  UUID                                  TYPE            DEVICE 
eth0  71bf7ff1-7574-4364-8c83-5878ed30d028  802-3-ethernet  eth0   
[root@localhost ~]# 

然后我在里面运行了以下内容datavm:

[root@localhost ~]# nmcli con show
NAME  UUID                                  TYPE            DEVICE 
eth0  d976f7ca-ab7f-4fd0-ab2b-6213815bd1a1  802-3-ethernet  eth0   
[root@localhost ~]# 

然后我在HOST上执行了以下命令:

[root@localhost ~]# nmcli con add type bridge ifname br1
Connection 'bridge-br1' (8b9fd6d9-bcb4-4e1c-85ab-55905d08667e) successfully added.
[root@localhost ~]# nmcli con show
NAME               UUID                                  TYPE            DEVICE 
bridge-slave-eno1  c36fd051-cacc-4e91-944f-a98f4fee26ff  802-3-ethernet  eno1   
bridge-br0         d472bc86-0f75-4dd5-bfee-5b8208b3fed2  bridge          br0    
System eno1        abf4c85b-57cc-4484-4fa9-b4a71689c359  802-3-ethernet  --     
bridge-br1         8b9fd6d9-bcb4-4e1c-85ab-55905d08667e  bridge          br1    
vnet1              ea985e89-94fb-403c-af33-7daefb378ca5  generic         vnet1  
vnet0              06deb20d-b0b7-4233-8abc-cbb285165082  generic         vnet0  
[root@localhost ~]# virsh
Welcome to virsh, the virtualization interactive terminal.
virsh # list
 Id    Name                           State
----------------------------------------------------
 2     public4-centos7                running
 4     data-centos7                   running

virsh # attach-interface data-centos7 bridge br1
Interface attached successfully

virsh # attach-interface public4-centos7 bridge br1
Interface attached successfully

virsh # 

然后,我分别登录到每个虚拟机,桥接网络的新连接显示名称为Wired connection 1,如下所示:

在网络虚拟机中:

[root@localhost ~]# nmcli con show
NAME                UUID                                  TYPE            DEVICE 
Wired connection 1  44f1f791-0d86-4587-8a2d-48dfa217ee99  802-3-ethernet  ens7   
eth0                71bf7ff1-7574-4364-8c83-5878ed30d028  802-3-ethernet  eth0   
[root@localhost ~]# nmcli con modify 'Wired connection 1' ipv4.addresses "10.1.1.2"

在数据虚拟机中:

[root@localhost ~]# nmcli con show
NAME                UUID                                  TYPE            DEVICE 
Wired connection 1  448101d7-1f8f-4b78-ad90-7efd5be23b08  802-3-ethernet  ens7   
eth0                d976f7ca-ab7f-4fd0-ab2b-6213815bd1a1  802-3-ethernet  eth0   
[root@localhost ~]# nmcli con modify 'Wired connection 1' ipv4.addresses "10.1.1.1"  

但随后ping 10.1.1.1web vm失败(目标主机不可达),再ping 10.1.1.2data vm也失败(目标主机不可达)。

web vm, 的内容vi /etc/sysconfig/network-scripts/ifcfg-Wired_connection_1为:

HWADDR=52:54:00:8F:3B:14
TYPE=Ethernet
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME="Wired connection 1"
UUID=44f1f791-0d86-4587-8a2d-48dfa217ee99
ONBOOT=yes
IPADDR=10.1.1.2
PREFIX=16
PEERDNS=yes
PEERROUTES=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes

data_vm, 的内容vi /etc/sysconfig/network-scripts/ifcfg-Wired_connection_1为:

HWADDR=52:54:00:1F:FE:27
TYPE=Ethernet
BOOTPROTO=dhcp
IPADDR=10.1.1.1
PREFIX=32
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME="Wired connection 1"
UUID=448101d7-1f8f-4b78-ad90-7efd5be23b08
ONBOOT=yes

我还需要输入什么来完成 @derobert 建议的内容? 请记住,所有数据流量都需要保留在物理盒子内,因此新网桥必须包含 datavm 和 webvm 的新 IP 地址,以便仅在新网桥中使用。

根据 @garethTheRed 的评论,我输入ip routeweb vm得到以下内容:

[root@localhost network-scripts]# ip route
default via 10.0.0.1 dev eth0  proto static  metric 100 
10.0.0.0/24 dev eth0  proto kernel  scope link  src 10.0.0.6  metric 100 
10.1.1.0/30 dev ens7  proto kernel  scope link  src 10.1.1.2 
10.1.1.2/31 dev ens7  proto kernel  scope link  src 10.1.1.2  metric 100 
169.254.0.0/16 dev ens7  scope link  metric 1003 
[root@localhost network-scripts]# 

然后我输入ip routedata vm得到以下内容:

[root@localhost network-scripts]# ip route
default via 10.0.0.1 dev eth0  proto static  metric 100 
10.0.0.0/24 dev eth0  proto kernel  scope link  src 10.0.0.5  metric 100 
10.1.1.0/31 dev ens7  proto kernel  scope link  src 10.1.1.1  metric 100 
10.1.1.0/30 dev ens7  proto kernel  scope link  src 10.1.1.1 
169.254.0.0/16 dev ens7  scope link  metric 1003 
[root@localhost network-scripts]# 

当我尝试时,将ifcfg-*答案中的文件精简为 6 行导致失败systemctl restart network。我认为这可能是由于hardwareuuid争论造成的,但这只是一个猜测。当我恢复ifcfg-*文件以包含 @garethTheRed 的编辑以及上面显示的额外参数时,systemctl restart network然后运行时没有错误,但 ping 失败。

答案1

造成这种情况的原因可能有两点:

一种可能的原因是您构建专用网络的方式(使用主机上的网桥)。使用 来配置它会更安全、更容易virt-manager。如果您的主机仅支持 CLI,请将其安装在远程桌面/笔记本电脑上,并通过 SSH 连接到主机。

安装后,连接到虚拟机管理程序,右键单击列表中的名称并选择“详细信息”。在“虚拟网络”选项卡上,您可以通过单击“+”按钮(左下方)添加新网络。该向导将引导您完成整个过程,但请确保取消选中 IPv4 和 IPv6 地址的选项(您不需要它们,因为它是点对点链接)并选择“专用网络”单选按钮。继续执行向导并退出。

如果您是一个顽固的只使用命令行的人,那么可以使用virsh net-define命令行界面执行上述操作。创建一个 XML 文件,如下例所示(virbr2是未使用的桥名称 - 用于brctl show列出您的桥名称):

<network>
    <name>private</name>
    <bridge name="virbr2" />
</network>

然后使用以下命令导入它:

# virsh net-define <XML filename>

完成上述操作后,您可以编辑每个虚拟机以使用这个新的专用网络(您必须重新启动虚拟机才能生效)。编辑完虚拟机配置后,您就可以登录每个虚拟机并使用相关 IP 详细信息(来自您的 OP)配置操作系统。但是,请先阅读...

其次,两个虚拟机之间没有指向新接口的路由。另一种情况是因为您配置了带有前缀的 IP 地址/32

编辑连接时使用格式a.b.c.d/p设置前缀;否则,如果没有前缀,它将默认为/32

# nmcli con edit "Wired connection 1"
nmcli> set ipv4.addresses 10.1.1.1/30
nmcli> save
nmcli> quit
# systemctl restart network

手动配置网络也可以:

NM_CONTROLLED=no
TYPE=Ethernet
BOOTPROTO=none
ONBOOT=yes
IPADDR=10.1.1.1
PREFIX=30

在另一个虚拟机 ( ) 上执行类似的过程10.1.1.2/30,它应该可以工作。

注意:/31只有将 IP 地址更改为10.1.1.0和时,您才可以使用 but 10.1.1.1。这可能会导致问题,因为范围中的第一个地址通常保留用于网络地址,最后一个地址用于广播。由于您只有两个带有 的地址/31,因此您将没有任何地址可供主机使用。最好坚持使用/30,它为您提供 4 个地址 - 两个保留,两个用于您的主机。

答案2

您知道如果您将它们连接到另一个网桥,您将必须为它们提供不同子网上的另一个 IP 地址,对吧?最好只设置防火墙规则以仅接受来自一台计算机的流量并坚持使用默认网桥。

否则,您需要virt-manager配置虚拟机网络设置并将其设置为使用您指定的接口而不是默认的自动管理网桥,并手动编辑 /etc/network/interfaces 以创建专用于此目的的网桥接口。

这是我为 Xen 手动配置的网桥:

auto xenbr0
iface xenbr0 inet static
        bridge_ports em2
        address 10.1.1.8
        netmask 255.255.255.0
        network 10.1.1.0
        broadcast 10.1.1.255
        gateway 10.1.1.1
        # dns-* options are implemented by the resolvconf package, if installed
        dns-nameservers 8.8.8.8

答案3

您可以通过多种方式实现此目的,但是听起来您需要第二个桥接接口与第二个网络,仅用于服务器间数据流。

可以将其想象为每台服务器都有两个 NIC,一个用于一般访问,另一个用于它们之间的访问。对此网络使用不同的 IP 地址范围,它们应该能够相互通信,而不会发生任何异常情况。

如果您无法设置新桥并想要更简单的设置,请尝试仅向使用不同 IP 地址范围的现有 NIC 添加子接口。如果只是 LAN 流量,我就会这么做。

祝你好运!

相关内容