天天看點

kvm 網絡配置之nat、使用者模式

接上篇,kvm的網絡配置,參考書本:《kvm虛拟化技術 實作以及原了解析》

2. nat模式

nat模式自動擷取ip需要dhcp服務,nat功能本身需要ip僞裝,既然是一個網絡,是以還需要虛拟網橋功能,是以需要的軟體如下:

dhcp功能:dnsmasq

ip僞裝:iptables

虛拟網橋:bridge-utils

實作:

    (1)yum install dnsmasq iptables bridge-utils -y#如果iptables是為核心的netfilter子產品提供規則,如果核心不支援nat子產品,還需要重新編譯核心

    (2)提供為客戶機建立nat用的qemu-ifup-nat腳本和關閉的腳本qemu-ifdown-nat模式

qemu-ifup-nat腳本如下:

<code>#!/bin/bash</code>

<code>#</code>

<code>BRIDGE=virbr0</code>

<code>NETWORK=192.168.7.0</code><code>#設定nat的網段</code>

<code>NETMASK=255.255.255.0</code>

<code>GATEWAY=192.168.7.1</code><code>#網關</code>

<code>DHCPRANGE=192.168.7.2,192.168.7.30</code><code>#位址池</code>

<code>function</code> <code>check_bridge()</code><code>#檢測虛拟網橋是否存在</code>

<code>{       </code>

<code>        </code><code>if</code> <code>brctl show |</code><code>grep</code> <code>-q </code><code>"^$BRIDGE"</code> <code>;</code><code>then</code>

<code>                </code><code>return</code> <code>1</code>

<code>        </code><code>else</code>

<code>                </code><code>return</code> <code>0</code>

<code>        </code><code>fi</code>

<code>}</code>

<code>function</code> <code>create_bridge()</code><code>#建立虛拟網橋</code>

<code>{</code>

<code>        </code><code>brctl addbr $BRIDGE </code>

<code>        </code><code>brctl stp $BRIDGE on</code>

<code>        </code><code>brctl setfd $BRIDGE 0</code><code>#設定網橋轉發延遲</code>

<code>        </code><code>ifconfig</code> <code>$BRIDGE $GATEWAY netmask $NETMASK up</code>

<code>function</code> <code>enable_ip_forward()</code><code>#開啟資料包轉發</code>

<code>        </code><code>echo</code> <code>1 &gt; </code><code>/proc/sys/net/ipv4/ip_forward</code>

<code>function</code> <code>add_filter_rules()</code><code>#nat功能,即出去的包修改源位址,masquerade表示iptables自己會探測自己的ip,不用手動指定</code>

<code>        </code><code>iptables -t nat -A POSTROUTING -s $NETWORK/$NETMASK ! -d  $NETWORK/$NETMASK -j MASQUERADE</code>

<code>function</code> <code>start_dnsmasq()</code><code>#開啟dnsmasq功能,即dhcp功能,這裡使用最簡單的寫法,更多參數參考dnsmasq --help</code>

<code>        </code><code>ps</code> <code>-ef |</code><code>grep</code> <code>dnsmasq |</code><code>grep</code>  <code>-</code><code>v</code> <code>grep</code> <code>&amp;&gt; </code><code>/dev/null</code>

<code>        </code><code>if</code> <code>[ $? -</code><code>eq</code> <code>0 ];</code><code>then</code>

<code>        </code><code>dnsmasq   --listen-address=$GATEWAY  --dhcp-range=$DHCPRANGE</code>

<code>function</code> <code>setup_bridge_nat()</code><code>#啟動所有功能</code>

<code>check_bridge $BRIDGE</code>

<code>if</code> <code>[ $? -</code><code>eq</code> <code>0 ];</code><code>then</code>

<code>create_bridge</code>

<code>fi</code>

<code>enable_ip_forward</code>

<code>add_filter_rules </code>

<code>start_dnsmasq  </code>

<code>if</code> <code>[ -n $1 ];</code><code>then</code>

<code>setup_bridge_nat</code><code>#真正的程式開始的地方,其實是引用上面的函數</code>

<code>ifconfig</code> <code>$1 0.0.0.0 up</code><code>#$1被虛拟成網橋,是以本身不需要ip,但是要啟用</code>

<code>brctl addif $BRIDGE $1</code><code>#把$1綁定到虛拟網橋</code>

<code>else</code>

<code>exit</code> <code>1</code>

qemu-ifdown-nat腳本如下:

<code>ip link </code><code>set</code> <code>$1 down</code>

<code>brctl delif $BRIDGE $1</code>

<code>brctl delbr $BRIDGE</code>

<code>iptables -t nat -F</code>

<code>exit</code> <code>0</code>

    (3)啟動客戶機

    首先給予腳本執行權限: chmod +x  /etc/qemu*

    qemu-system-x86_64  -m 4096 -smp 8 -net nic -net tap,ifname=tap1,script=/etc/qemu-ifup-nat,downscript=/etc/qemu-ifdown-nat  kvm_vhost/redhat6.qcow2  -daemonize

    (4) 檢視結果

    客戶機:ip a檢視是否擷取到了192.168.7.0段的位址,并測試是否能與外網ip通信

<a href="http://s5.51cto.com/wyfs02/M02/8A/D4/wKioL1g9LgbBL1lKAABFWhjvQUQ391.png-wh_500x0-wm_3-wmp_4-s_3822579014.png" target="_blank"></a>

    主控端:ip a可以看到有個虛拟網口virbr0,并且ip位址為192.168.7.1

    (5)如果想讓客戶機提供的某些服務,外網可以通路,那麼可以在主控端加這麼一條規則

    iptables -t nat  -I PREROUTING -p tcp --dport 80 -j DNAT --to 192.168.7.2:80

    # 這裡假設提供web服務,且用戶端擷取到的ip為192.168.7.2

3.qemu内部的使用者模式網絡

預設情況下,qemu-kvm啟動客戶機的時候使用slirp實作tcp/ip協定棧,并虛拟出一套nat網絡,它使用簡單易用,獨立性好,但是不能跟主控端和外部網絡直接通信

指令:

    qemu-system-x86_64 -net user[,option][,option][,...]

        vlan=n : 将使用者模式網絡棧連接配接到編号為n的vlan中,預設0

        name=NAME :網絡别名

        net=addr[/mask]:設定客戶機可以看到的ip位址,預設10.0.2.0/24

        host=addr:指定客戶機可見主控端的位址

        restrict=y|yes|no|n:如果此選項被打開,那麼客戶機會被隔離,即客戶機無法與外界通信,預設no

        hostname=name :設定在主控端dhcp伺服器中儲存的客戶機主機名

        dhcpstart=addr :設定配置設定給客戶機的第一個ip

        dns=addr:指定虛拟dns的位址

        tftp=dir:激活qemu内嵌的tftp伺服器

        hostfwd=[tcp/udp]:[hostaddr]:hostport-[guestaddr]:guestport :将通路主控端的hostport端口tcp/udp連結重定向到客戶機的guestport端口上,可以多次使用

        guestfwd=[tcp]:server:port-dev,将客戶機中通路ip位址為server的端口連接配接轉發到主控端的dev這個字元裝置上

        bootfile=file:讓file檔案成為客戶機可以使用的bootp啟動鏡像檔案,它與tftp選項聯合使用,可以實作從網絡啟動客戶機的功能

        smb=dir[,smbserver=addr]:激活samba功能

例子:

        qemu-system-x86_64 -m 4096 -smp 8 -net nic -net user,tftp=/root/tftp,hostfwd=tcp::5022-:22 redhat6.qcow2

        這裡我們把主控端的5022端口轉發到客戶機的22端口,結果如下:

<a href="http://s1.51cto.com/wyfs02/M01/8A/D4/wKioL1g9LlnAws1-AABuNRJ6S-Y278.png-wh_500x0-wm_3-wmp_4-s_740611133.png" target="_blank"></a>

本文轉自biao007h51CTO部落格,原文連結:http://blog.51cto.com/linzb/1877755 ,如需轉載請自行聯系原作者

繼續閱讀