繼下面三篇文章完成了kvm虛擬化管理平臺webvirtmgr環境的部署安裝:
kvm虛擬化管理平臺WebVirtMgr部署-虛擬化環境安裝-完整記錄(0)
kvm虛擬化管理平臺WebVirtMgr部署-完整記錄(1)
kvm虛擬化管理平臺WebVirtMgr部署-完整記錄(2)
通常狀況下,虛擬機(下面稱vm)跟宿主機經過網橋方式進行通訊,只要宿主機能聯網,那麼vm也就能順利聯網。html
然而,個人測試環境下的網絡環境比較特殊:
沒有內網交換機設置,也就是說內網沒有網關,宿主機默認的網關是外網地址的。
以下,宿主機開啓了兩個網卡:em1(外網),em2(內網,加入到網橋br0中)mysql
[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 foreverlinux
[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 em1nginx
因爲內網網關不存在,而且vm和宿主機之間採用的是bridge橋接模式,因此vm不能經過橋接模式自行聯網了。web
要想使安裝後的vm聯網,還須要咱們手動進行些特殊配置:
1)宿主機部署squid代理環境,即vm對外的訪問請求經過宿主機squid代理出去。
2)vm對內的訪問請求經過宿主機iptables的nat轉發進來或者nginx反向代理(proxy_pass)進來。sql
---------------------------------------------------------------------------------------------------------
下面說的是http方式的squid代理;
若是是https的squid代理,能夠參考個人另外一篇技術博客內容:squid代理http和https方式上網的操做記錄
---------------------------------------------------------------------------------------------------------vim
宿主機的squid代理部署記錄網絡
yum命令直接在線安裝squid
[root@openstack ~]#yum install squidapp
安裝完成後,修改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)及端口,curl
而後執行下面命令,進行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
要求經過訪問宿主機的808八、808九、8090端口,分別nat轉發到虛擬機一、虛擬機二、虛擬機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反向代理(在其餘篇章中有介紹)