kvm虛擬化管理平臺WebVirtMgr部署-完整記錄(3)

散盡浮華發表於2016-08-09

 

繼下面三篇文章完成了kvm虛擬化管理平臺webvirtmgr環境的部署安裝:
kvm虛擬化管理平臺WebVirtMgr部署-虛擬化環境安裝-完整記錄(0)
kvm虛擬化管理平臺WebVirtMgr部署-完整記錄(1)
kvm虛擬化管理平臺WebVirtMgr部署-完整記錄(2)

一般情況下,虛擬機器(下面稱vm)跟宿主機通過網橋方式進行通訊,只要宿主機能聯網,那麼vm也就能順利聯網。

然而,我的測試環境下的網路環境比較特殊:
沒有內網交換機設定,也就是說內網沒有閘道器,宿主機預設的閘道器是外網地址的。
如下,宿主機開啟了兩個網路卡:em1(外網),em2(內網,加入到網橋br0中)

[root@openstack ~]# ip addr           #檢視宿主機的網路卡配置情況
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: em1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether 44:a8:42:21:a6:00 brd ff:ff:ff:ff:ff:ff
inet 103.10.86.17/26 brd 111.101.186.163 scope global em1
inet6 fe80::46a8:42ff:fe21:a600/64 scope link
valid_lft forever preferred_lft forever
3: em2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether 44:a8:42:21:a6:01 brd ff:ff:ff:ff:ff:ff
inet6 fe80::46a8:42ff:fe21:a601/64 scope link
valid_lft forever preferred_lft forever
4: em3: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
link/ether 44:a8:42:21:a6:02 brd ff:ff:ff:ff:ff:ff
5: em4: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
link/ether 44:a8:42:21:a6:03 brd ff:ff:ff:ff:ff:ff
6: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
link/ether 44:a8:42:21:a6:01 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.17/24 brd 192.168.1.255 scope global br0
inet6 fe80::46a8:42ff:fe21:a601/64 scope link
valid_lft forever preferred_lft forever
8: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 500
link/ether fe:54:00:08:cf:9a brd ff:ff:ff:ff:ff:ff
inet6 fe80::fc54:ff:fe08:cf9a/64 scope link
valid_lft forever preferred_lft forever

[root@openstack ~]# route -n    #檢視路由,預設路由閘道器是外網的
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
103.10.86.0 0.0.0.0 255.255.255.192 U 0 0 0 em1
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 br0
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 em1
169.254.0.0 0.0.0.0 255.255.0.0 U 1006 0 0 br0
0.0.0.0 111.101.186.1 0.0.0.0 UG 0 0 0 em1

由於內網閘道器不存在,並且vm和宿主機之間採用的是bridge橋接模式,所以vm不能通過橋接模式自行聯網了。

要想使安裝後的vm聯網,還需要我們手動進行些特殊配置:
1)宿主機部署squid代理環境,即vm對外的訪問請求通過宿主機squid代理出去。
2)vm對內的訪問請求通過宿主機iptables的nat轉發進來或者nginx反向代理(proxy_pass)進來。

---------------------------------------------------------------------------------------------------------
下面說的是http方式的squid代理;
如果是https的squid代理,可以參考我的另一篇技術部落格內容:squid代理http和https方式上網的操作記錄
---------------------------------------------------------------------------------------------------------

宿主機的squid代理部署記錄

yum命令直接線上安裝squid
[root@openstack ~]#yum install squid

安裝完成後,修改squid.conf 檔案中的內容,修改之前可以先備份該檔案
[root@openstack ~]# cd /etc/squid/
[root@openstack squid]#cp squid.conf squid.conf_bak
[root@openstack squid]#vim squid.conf
1.找到檔案中的 http_access deny all,將其修改為http_access allow all,表示所有使用者都可以訪問這個代理,
2.找到http_port 3128 ,將其修改為http_port 192.168.1.17:3128,這裡的IP及埠是squid的代理IP(這裡也就是宿主機的ip)及埠,

然後執行下面命令,進行squid啟動前測試
[root@openstack squid]# squid -k parse
2016/08/09 13:35:04| Processing Configuration File: /etc/squid/squid.conf (depth 0)
2016/08/09 13:35:04| Processing: acl manager proto cache_object
..............
..............
2016/08/09 13:35:04| Processing: refresh_pattern . 0 20% 4320
2016/08/09 13:35:04| Initializing https proxy context

[root@openstack squid]# squid -z
2016/08/09 13:35:12| Creating Swap Directories

[root@openstack squid]# /etc/init.d/squid start
Starting squid: . [ OK ]

[root@openstack squid]# netstat -nltp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
.............
tcp 0 0 192.168.1.17:3128 0.0.0.0:* LISTEN 71848/(squid)
.............

--------------------------------------------------------------------------------------
如果宿主機開啟了iptables防火牆規則,則還需要在/etc/sysconfig/iptables裡新增下面一行:
-A INPUT -s 192.168.1.0/24 -p tcp -m state --state NEW -m tcp --dport 3128 -j ACCEPT
然後重啟iptables服務
[root@openstack ~]# /etc/init.d/iptables restart

虛擬機器VM上進行squid代理配置
只需要在系統環境變數配置檔案/etc/profile裡新增下面一行即可(在檔案底部新增)
[root@vmserver001 ~]# vim /etc/profile
.......
export http_proxy=http://192.168.1.17:3128
[root@vmserver001 ~]#source /etc/profile #使上面的配置生效

測試虛擬機器是否能對外訪問:
[root@vmserver001 ~]# curl http://www.baidu.com #能正常對外訪問
[root@vmserver001 ~]#yum list #yum能正常線上使用
[root@vmserver001 ~]#wget http://my.oschina.net/mingpeng/blog/293744 #能正常線上下載
--------------------------------------------------------------------------------------

虛擬機器對內的訪問請求通過宿主機iptables的nat埠轉發實現:

比如:
宿主機:外網ip-111.101.186.163,內網ip-192.168.1.17
虛擬機器1:ip-192.168.1.150 
虛擬機器2:ip-192.168.1.151
虛擬機器3:ip-192.168.1.152

要求通過訪問宿主機的8088、8089、8090埠,分別nat轉發到虛擬機器1、虛擬機器2、虛擬機器3的80埠

虛擬機器的操作
1)關閉防火牆iptables
#/etc/init.d/iptables stop
#chkconfig iptables off
然後修改/etc/sysconfig/selinux裡的“SELINUX=disabled"
#setenforce 0
#getenforce
#reboot

2)將三臺虛擬機器的閘道器指向宿主機的內網地址 (這一點很重要!)
#vim /etc/sysconfig/network-script/ifcfg-eth0
.....
GATEWAY=192.168.1.17

#/etc/init.d/network restart

宿主機的操作
先開啟宿主機的IP轉發功能:
[root@openstack ~]# echo 1 > /proc/sys/net/ipv4/ip_forward

設定nat轉發規則

[root@kvmserver ~]# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.7 on Tue Aug 16 09:48:24 2016
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [449:63333]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT

-A INPUT -p tcp -m state --state NEW -m tcp --dport 6080 -j ACCEPT                     //6080埠為vnc服務埠,一定也要開啟
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8088 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8089 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8090 -j ACCEPT
-A INPUT -s 192.168.1.0/24 -p tcp -m state --state NEW -m tcp --dport 3128 -j ACCEPT
#-A INPUT -j REJECT --reject-with icmp-host-prohibited                                              //這兩行註釋掉,不然nat埠轉發的時候會有問題!
#-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Tue Aug 16 09:48:24 2016
# Generated by iptables-save v1.4.7 on Tue Aug 16 09:48:24 2016
*nat
:PREROUTING ACCEPT [9:32464]
:POSTROUTING ACCEPT [9:8580]
:OUTPUT ACCEPT [9:8580]
-A PREROUTING -p tcp -m tcp --dport 8088 -j DNAT --to-destination 192.168.1.150:80        //注意,DNAT規則一定要都放在SNAT規則之上!
-A PREROUTING -p tcp -m tcp --dport 8089 -j DNAT --to-destination 192.168.1.151:80
-A PREROUTING -p tcp -m tcp --dport 8090 -j DNAT --to-destination 192.168.1.152:80
-A POSTROUTING -d 192.168.1.150 -p tcp -m tcp --sport 80 -j SNAT --to-source 192.168.1.17
-A POSTROUTING -d 192.168.1.151 -p tcp -m tcp --sport 80 -j SNAT --to-source 192.168.1.17
-A POSTROUTING -d 192.168.1.152 -p tcp -m tcp --sport 80 -j SNAT --to-source 192.168.1.17
COMMIT
# Completed on Tue Aug 16 09:48:24 2016

然後重啟iptables,使之生效!
[root@openstack ~]#service iptables restart

******************************
或者在終端命令列操作:
[root@openstack ~]#iptables -t nat -A PREROUTING -p tcp -m tcp --dport 8088 -j DNAT --to-destination 192.168.1.150:80
[root@openstack ~]#iptables -t nat -A POSTROUTING -d 192.168.1.150 -p tcp -m tcp --sport 80 -j SNAT --to-source 192.168.1.17
[root@openstack ~]#iptables -t filter -A INPUT -p tcp -m state --state NEW -m tcp --dport 8088 -j ACCEPT

[root@openstack ~]#iptables -t nat -A PREROUTING -p tcp -m tcp --dport 8089 -j DNAT --to-destination 192.168.1.151:80
[root@openstack ~]#iptables -t nat -A POSTROUTING -d 192.168.1.151 -p tcp -m tcp --sport 80 -j SNAT --to-source 192.168.1.17
[root@openstack ~]#iptables -t filter -A INPUT -p tcp -m state --state NEW -m tcp --dport 8089 -j ACCEPT

[root@openstack ~]#iptables -t nat -A PREROUTING -p tcp -m tcp --dport 8090 -j DNAT --to-destination 192.168.1.152:80
[root@openstack ~]#iptables -t nat -A POSTROUTING -d 192.168.1.152 -p tcp -m tcp --sport 80 -j SNAT --to-source 192.168.1.17
[root@openstack ~]#iptables -t filter -A INPUT -p tcp -m state --state NEW -m tcp --dport 8090 -j ACCEPT

儲存規則,然後重啟iptables
[root@openstack ~]#service iptables save

[root@openstack ~]#service iptables restart

#終端命令列裡新增規則後,要先save儲存,然後重啟~

#/etc/sysconfig/iptables檔案裡新增規則後,要restart重啟使之生效~

#檢視設定的規則
[root@openstack ~]#iptables -L #檢視filter表的規則
[root@openstack ~]#iptables -L -t nat #檢視nat表的規則

**********************
注意:
nat埠轉發設定成功後,記得在/etc/sysconfig/iptables檔案裡註釋掉下面兩行!不然nat轉發會有問題!一般如上面在nat轉發規則設定好並save和restart防火牆之後就會自動在/etc/sysconfig/iptables檔案裡刪除掉下面兩行內容了。
#-A INPUT -j REJECT --reject-with icmp-host-prohibited
#-A FORWARD -j REJECT --reject-with icmp-host-prohibited

*********************************************************************************************

同樣的,如果是其他埠的nat轉發,比如想訪問虛擬機器1的資料接3306埠。
可以設定:宿主機63306->虛擬機器3306

宿主機操作:
[root@openstack ~]#iptables -t nat -A PREROUTING -p tcp -m tcp --dport 63306 -j DNAT --to-destination 192.168.1.150:3306
[root@openstack ~]#iptables -t nat -A POSTROUTING -d 192.168.1.150 -p tcp -m tcp --dport 3306 -j SNAT --to-source 192.168.1.17
[root@openstack ~]#iptables -t filter -A INPUT -p tcp -m state --state NEW -m tcp --dport 63306 -j ACCEPT #防火牆放行63306埠
[root@openstack ~]#/etc/init.d/iptables save

[root@openstack ~]#/etc/init.d/iptables restart

虛擬機器需要提前在mysql裡授權給宿主機

*********************************************************************************************

*********************************************************************************************

注意:

如上面訪問宿主機8080埠轉發到虛擬機器的80埠,除了上面使用iptables的nat轉發規則實現,也可以使用nginx的proxy_pass反向代理實現。

在宿主機的nginx配置如下:

[root@bastion-IDC ~]# cat /Data/app/nginx/conf/vhosts/80-vm.conf
server {
listen 8088;
server_name localhost;
location / {
root /opt/;
index index.html index.htm;
proxy_pass http://192.168.1.150/;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
}

}

重啟nginx服務,iptables開放8080埠

這樣,訪問宿主機8080,即http://111.101.186.163:8080顯示結果就是http://192.168.1.150的結果

*********************************************** 

除了用nginx反向代理,還可以使用haproxy反向代理(在其他篇章中有介紹)

相關文章