Centos

如何在兩個虛擬機之間架起一座橋樑?

  • October 17, 2015

我曾經virt-install在 CentOS 7 主機上創建兩個 CentOS 7 虛擬機來賓。一台虛擬機稱為webvm,並在專用網路上託管網站。另一個虛擬機被呼叫datavm,其唯一目的是作為託管在webvm. 如何設置網路以便datavm僅允許來自 的數據連接webvm,並且這些數據連接發生在物理伺服器框中? 我想確保數據庫事務之間webvmdatavm跨本地網路傳輸。

請注意,橋接網路已經將主機作業系統連結到每個來賓作業系統。

is的區域網路ip和is的webvm網路10.0.0.6ip 。來自託管的典型 Web 應用程序的連接字元串是: datavm``10.0.0.5``webvm

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.  

為此,我通過在HOST中執行以下命令獲得了基線:

[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 ~]# 

然後我在主機上實現了以下命令:

[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 # 

然後我分別登錄到每台虛擬機,新的橋接網路連接顯示為 name 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"

在數據 vm 中:

[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失敗(Destination Host Unreachable),ping 10.1.1.2又從data vm失敗(Destination Host Unreachable)。

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 的建議? 請記住,所有數據流量都需要保留在 PHYSICAL BOX 內,因此新網橋必須包含新的 ip 地址,以便 datavm 和 webvm 僅在新網橋中使用。

根據@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。我認為這可能是由於hardwareoruuid論點,但這只是一個猜測。當我恢復ifcfg-*文件以包含@garethTheRed 的編輯以及上面顯示的額外參數時,systemctl restart network然後執行沒有錯誤,但 ping 失敗。

有兩件事可能是造成這種情況的原因:

一個可能的原因是您建構專用網路的方式(使用主機上的網橋)。使用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>

完成上述操作後,您可以編輯每個虛擬機以使用這個新的專用網路(您必須重新啟動虛擬機才能使其生效)。編輯完 VM 配置後,您就可以登錄每個配置並使用相關 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

在另一個 VM ( ) 上執行類似的過程10.1.1.2/30,它應該可以工作。

注意:您可以使用/31,但前提是您將 IP 地址更改為10.1.1.010.1.1.1。這可能會導致問題,因為範圍中的第一個地址通常保留給網路地址,最後一個地址用於廣播。由於您只有兩個帶有 的地址/31,因此您將沒有任何地址可供主機使用。最好堅持使用/30,它為您提供 4 個地址 - 兩個保留地址和兩個用於您的主機。

引用自:https://unix.stackexchange.com/questions/235958