KVM使用NAT聯網併爲VM配置iptables端口轉發

KVM使用NAT聯網併爲VM配置iptables端口轉發


在前面的文章中,我們介紹KVM的虛擬機(以下簡稱VM)都是通過橋接方式進行聯網的。

本篇文章我們來介紹KVM的VM通過NAT方式進行聯網,並且通過配置IPtables做端口映射,這個也是前幾天一家公司面試我的問題。直接問我KVM如何做端口轉發,當時因爲確實沒有做過這方面的應用,所以就直接回答不知道了。

NAT(網絡地址)方式連接網絡在桌面虛擬化使用是比較多的,比如VMware Workation。使用NAT方式聯網可以節省IP地址。說實話這個對於公網IP地址比較少的公司,也節省了成本。

而KVM默認的網絡連接方式就是NAT,只是我們一直沒有使用。它支持主機與虛擬機的互訪,同時也支持虛擬機訪問互聯網(需要對KVM服務器做配置),但不支持外界訪問虛擬機(不過可以通過KVM服務器配置IPtables端口轉發解決)。

本篇文章主要包括兩個部分:

1、KVM爲VM配置NAT網絡

2、爲VM配置iptables端口轉發

一、KVM爲VM配置NAT網絡

我們可以通過如下命令,查看NAT是否開啓。如下:

virsh net-list

clip_image001

通過上圖,我們可以看到NAT方式已經開啓。而且default是宿主機安裝VM支持模塊的時候自動安裝的。

我們也可以查看,系統中已經存在的網卡。使用ifconfig命令,如下

clip_image002

通過上圖,我們可以看出網卡virbr0就是NAT方式連接網絡時,所使用到的網卡。

除此之外我們還可以通過配置文件,來查看NAT方式的DHCP地址池。該配置文件爲:/etc/libvirt/qemu/networks/default.xml。如下:

clip_image003

通過上圖我們可以看出,目前NAT使用的IP地址池是192.168.122.2-192.168.122.254,網關爲192.168.122.1,子網掩碼爲255.255.255.0。

因爲是和KVM相關的VM(虛擬機),所以我們首先爲VM新建硬盤。今天我們的實驗不使用裸設備,直接使用文件的方式爲虛擬機創建硬盤。這樣有利於虛擬機的遷移,但是性能方面沒有裸設備好。有關VM如何使用裸設備,可以參考我的另外一篇文章《爛泥:KVM使用裸設備配置虛擬機》。

創建VM硬盤,使用如下命令:

qemu-img create -f qcow2 /natdisk/nat.img 20G

clip_image004

硬盤創建完畢後,我們使用如下命令創建VM,如下:

virt-install -n nat -r 2048 –vcpus=1 –os-type=linux –boot cdrom,menu=on -c /iso/CentOS-6.4-i386-minimal.iso –disk path=/natdisk/nat.img,format=qcow2,bus=ide –network network=default –vnc –vnclisten=0.0.0.0 –vncport=5991

clip_image005

注意該條命令中有關網絡的配置–network network=default,我們使用的是默認網絡配置default。這個就是NAT方式。

同時有關硬盤的格式與接口模式也一定要注意:

–disk path=/natdisk/nat.img,format=qcow2,bus=ide

下面開始爲VM安裝系統,如下:

clip_image006

VM系統安裝完畢後,我們進入VM中。默認情況下VM此時使用的DHCP方式獲取IP地址,如果你在安裝系統時未進行網絡配置。我們現在修改VM使用靜態IP地址,如下:

more /etc/sysconfig/network-scripts/ifcfg-eth0

clip_image007

網絡配置完畢後,我們來測試下網絡通信情況。如下:

clip_image008

通過上圖我們發現,此時VM通過NAT網絡獲取的IP地址無法與其他網段的服務器進行通信。是不是我們的NAT配置出錯?還是其他原因?

這個其實不是我們NAT配置出錯,而是要是NAT網絡與其他服務器進行正常通信還需要做其他工作。

現在切換到KVM服務器,開啓KVM服務器的IP轉發功能。編輯/etc/stsctl.conf文件,把其中的net.ipv4.ip_forward = 0修爲net.ipv4.ip_forward = 1,如下:

vi /etc/sysctl.conf

clip_image009

或者使用如下命令:

echo 1 >/proc/sys/net/ipv4/ip_forward

不過這種方法是暫時的,系統重啓後消失。要使其永久生效,建議使用直接修改/etc/stsctl.conf文件的方法。

/etc/stsctl.conf文件修該完畢後,我們要使用sysctl –p使其生效。如下

clip_image010

以上配置完畢後,我們還要開啓KVM服務器的IPtables的轉發功能,使用如下命令:

iptables -t nat -A POSTROUTING -o br0 -j MASQUERADE

clip_image011

注意該命令中的網卡時br0,而不是eth0。

此時,我們再切換VM中測試的網絡通信情況。如下:

clip_image012

通過上圖我們可以很明顯的看到,目前VM可以與服務器以及外網正常通信。

以上就是KVM爲VM配置NAT網絡的整個過程。下面我們開始爲VM配置端口。

二、爲VM配置iptables端口轉發

爲什麼要爲VM配置iptables端口轉發呢?這個是因爲有些業務是在公網的,有時候爲了資金考慮不得不盡量節省公網IP的個數。比如現在我想管理KVM中的VM,通過SSH方式。但是KVM服務器對外只有一個公網IP,而且KVM服務器是在IDC機房中。

如果要達到我上述的要求,只能在KVM服務器爲VM配置IPtables端口轉發。

現在我們還以上述VM爲例,目前該KVM的公網IP爲192.168.1.102,VM的IP爲192.168.122.173,現在我要求通過訪問KVM的8022端口訪問VM的22端口。

要想達到上述功能,我們需要在KVM服務器上設置如下IPtables規則:

iptables -t nat -A PREROUTING -d 192.168.1.102 -p tcp -m tcp –dport 8022 -j DNAT –to-destination 192.168.122.173:22

iptables -t nat -A POSTROUTING -s 192.168.122.0/255.255.255.0 -d 192.168.122.173 -p tcp -m tcp –dport 22 -j SNAT –to-source 192.168.122.1

clip_image013

注意這兩條IPtables規則:

第一條規則很好理解,就是把所有訪問192.168.1.102:8022的請求轉發到192.168.122.173:22的端口上。

第二條規則我的理解是,把所有來自192.168.122.0/255.255.255.0網段訪問192.168.122.173:22的數據全部通過192.168.122.1這個網關轉發出去。

現在我們來實際效果,如下:

ifconfig eth0|grep “inet addr”|awk ‘{print $2}’|cut -d: -f2

ssh -p 8022 [email protected]

clip_image014

通過上圖我們可以看出,我們通過192.168.1.213這臺服務器使用ssh通過8022端口登錄到IP爲192.168.122.173的VM。

很明顯這個已經達到我們的要求。

在這只是一個例子,其實我們也完全可以在VM192.168.122.173上搭建一個web,然後通過KVM的IPtables端口轉發下,公網就可以訪問了。下面再來個例子,如下:

iptables -t nat -A PREROUTING -d 192.168.1.102 -p tcp -m tcp –dport 8023 -j DNAT –to-destination 192.168.122.173:80

iptables -t nat -A POSTROUTING -s 192.168.122.0/255.255.255.0 -d 192.168.122.173 -p tcp -m tcp –dport 80 -j SNAT –to-source 192.168.122.1

clip_image015

clip_image016

clip_image017

以上這個例子是通過192.168.102:8023訪問VM92.168.122.173的web服務器。

爲了在下次重啓KVM服務器後,這些IPtables規則繼續使用。我們要把這些規則保存下,使用如下命令:

/etc/init.d/iptables save

more /etc/sysconfig/iptables

clip_image001[4]

至此我們有關KVM的NAT方式網絡連接以及爲VM配置IPtables端口講解完畢。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章