NAT(網絡地址轉換模式)
使用NAT模式,就是讓虛擬系統借助NAT(網絡地址轉換)功能,通過宿主機器所在的網絡來訪問公網。也就是說,使用NAT模式可以實現在虛擬系統里訪問互聯網。很顯然,如果你只有一個外網地址,此種方式很合適。
KVM虛擬機Nat方式上網:
virsh net-list
查看當前活躍的網絡,可以看到一個default網絡,這個就是一個默認的Nat網絡了。
virsh net-dumpxml default
可以查看該網絡的詳細配置如下:
<network>
<name>default</name>
<uuid>75dbebde-fc15-4350-8a06-f1432f9e6d30</uuid>
<forward mode='nat'>
<nat>
<port start='1024' end='65535'/>
</nat>
</forward>
<bridge name='virbr0' stp='on' delay='0' />
<mac address='52:54:00:bc:f2:65'/>
<ip address='192.168.122.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.122.2' end='192.168.122.254' />
</dhcp>
</ip>
</network>
可以看到該網絡搭建在一個網橋virbr0上,這個網橋在安裝並啟動libvirt的時候自動生成。然后在客戶機的XML配置文件中添加標簽interface內容如下:
<interface type='network'> <mac address='52:54:00:c7:18:b5'/> <source network='default'/> <model type='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </interface>
則可以讓客戶機用nat方式來上網了,經驗證,客戶機可以獲取到122網段,2到254之間的一個ip地址。
我們可以直接編輯修改default網絡的配置:
virsh net-edit default
也可以直接將default網絡干掉,然后再重新定義:
virsh net-undefine default
重新創建一個default.xml文件,自定義其中的內容,可以指定某個mac地址對應某個ip,指定某個ip段。例如下面的內容,name對應的是客戶機的名字。
<network>
<name>default</name>
<uuid>dc69ff61-6445-4376-b940-8714a3922bf7</uuid>
<forward mode='nat'/>
<bridge name='virbr0' stp='on' delay='0' />
<mac address='52:54:00:81:14:18'/>
<ip address='192.168.122.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.122.2' end='192.168.122.254' />
<host mac='00:25:90:eb:4b:bb' name='guest1' ip='192.168.5.13' />
<host mac='00:25:90:eb:34:2c' name='guest2' ip='192.168.7.206' />
<host mac='00:25:90:eb:e5:de' name='guest3' ip='192.168.7.207' />
<host mac='00:25:90:eb:7e:11' name='guest4' ip='192.168.7.208' />
<host mac='00:25:90:eb:b2:11' name='guest5' ip='192.168.7.209' />
</dhcp>
</ip>
</network>
然后用命令:
virsh net-define default.xml virsh net-start default
啟用一個客戶機,檢查網絡時候可用。
端口轉發
下面均為介紹iptables相關內容,如果願意使用rinetd或者其他的工具,或者使用橋接模式的,可以不用看了。
如果需要遠程管理我們可以使用自帶的vnc,但如果認為vnc不如系統自帶的3389或ssh方便,我們可將NAT網絡內的端口轉發出來。
操作完上面第三步內開啟轉發的功能后,進行如下操作。
注:第四步已經將防火牆關閉,現在是在關閉防火牆的環境下操作,如果要開啟防火牆,請自行檢查iptables規則是否與防火牆沖突。
下面兩條規則為將宿主機的2009端口,自動轉發到虛機的3389端口。
iptables -t nat -A PREROUTING -p tcp --dport 2009 -j DNAT --to-destination 192.168.122.101:3389 iptables -t nat -A POSTROUTING -p tcp --dport 2009 -d 192.168.122.101 -j SNAT --to 192.168.122.1
開啟轉發后一直不通,因為對iptables不熟,這個坑了我2天,網上查詢資料后,終於解決。因為默有兩條拒絕規則,刪除即可。
首先將規則列出:
iptables -nL -v --line-numbers -t filter
會有兩條如下規則:
4 7 420 REJECT all — * virbr0 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable 5 0 0 REJECT all — virbr0 * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
然后刪除這兩條規則,刪除兩次第四條即可,因為刪除第四條后,第五條又變成第四條了。
iptables -D FORWARD 4 -t filter #刪除編號為4的FORWARD規則
然后進行保存並重啟iptables服務:
service iptables save #保存規則
service iptables resart #重啟服務
轉發端口即可工作了。
下面要有一個大坑介紹。
我們上面已經了“save”保存了,但宿主機重啟后,iptables自行恢復,屏蔽規則也恢復了,端口轉發又無法工作了。
因為在centos7下,需要把配置寫入文件,然后開機后再從配置文件讀取才可以。目前只找到這個方法。
iptables-save > /etc/sysconfig/iptables #文件路徑可自行指定。
在 /etc/rc.local內加入如下內容;
iptables-restore < /etc/sysconfig/iptables
service iptables save
service iptables restart
好了,現在全部搞定了!!
另外由於宿主機映射到外網的端口是由網管分配,附一條轉發本地ssh端口的iptables規則。
-A PREROUTING -p tcp -m tcp --dport 3000 -j REDIRECT --to-ports 22
