QEMU-KVM建立虛擬機器自動指定IP的配置

來源:互聯網
上載者:User

在使用qemu建立虛擬機器的過程中是無法指定IP地址的,可是在實際應用中,我們是需要虛擬機器擁有IP地址的,並且不是人為去虛擬機器作業系統上配置。在qemu虛擬機器技術文檔(http://qemu.weilnetz.de/qemu-doc.html#pcsys_005fmonitor)裡搗鼓了好久,發現在給虛擬機器建立虛擬網卡時可以指定MAC地址,頓時眼前大亮:如果可以給一個虛擬機器網卡唯一指定一個MAC地址,那麼我就可以通過配置DHCP來實現MAC地址與IP地址之間的唯一映射,這樣指定MAC地址,也就相當於指定了IP地址。現在的問題就是如何配置DHCP伺服器的問題了。

DHCP的配置

本人所使用的伺服器是Red Hat Enterprise Linux 6.2,DHCP的安裝這裡就不介紹了,網上大把大把的,這裡只說明下檢測伺服器上是否安裝了DHCP的命令:

rpm -qa | grep dhcp
上述命令如果有輸出,就說明伺服器上已經安裝了DHCP。

DHCP服務的設定檔預設為:在/etc/dhcp/dhcpd.conf(好像linux早期的版本DHCP設定檔是在/etc/dhcpd.conf,所以這裡要注意)。DHCP是通過其設定檔啟動的,如果設定檔中的所有配置正確,就能正常啟動DHCP服務。如果是新手,建議直接使用DHCP安裝檔案裡包含的設定檔,並在其基礎上進行修改,這樣可以避免很多不必要的錯誤,我當時就是自己按照網上的一些例子來寫設定檔,結果讓我吃了不少苦頭。使用如下命令拷貝設定檔的模版:

cd /etc/dhcp/cp /usr/share/doc/dhcp-3.0pl1/dhcpd.conf.sample dhcpd.conf //複製設定檔範本vim /etc/dhcp/dhcpd.conf //使用vi修改/etc/dhcpd.conf
配置的目的就是要將MAC地址與某些特定的IP綁定起來,為了更好理解DHCP,如下列出了DHCP的工作原理:

假設多部電腦在同一個網域當中,也就是說,DHCP Server與它的Clients都在同一個網段之內,可以透過軟體廣播的方式來達到相互溝通的狀態。那麼Client藉由DHCP Server得到的IP的程式為:

1、若Client端電腦設定使用DHCP協議以取得網路參數時,則Client端電腦在開機的時候,或者是重新啟動網卡的時候,會自動地發出DHCP Client的需求給網域中的每部電腦;這個時候,由於發出的訊息希望每部電腦都可以接受,所以該訊息除了網卡的硬體地址(MAC)無法改變外,需要將該訊息的來源軟體設定為0.0.0.0,而目的地址則為255.255.255.255(linux會自動化佈建)。網域中的其它沒有提供DHCP服務的電腦,收到這個封包之後會自動地將該封包丟棄而不回應。

2、DHCP主機響應訊息:如果是DHCP主機收到這個Client的DHCP需求時,那麼DHCP主機首先會針對該次需求的訊息所攜帶的MAC和DHCP主機本身的設定值去比對,如果DHCP主機的設定有針對該MAC做靜態IP(每次都給予一個固定的IP)的提供時,則提供Client端相關的固定IP於相關的網路參數;而如果該訊息的MAC並不在DHCP主機的設定之內時,則DHCP主機會選取目前網域內沒有使用的IP(這個IP與設定值有關)來發放給client端使用。

3、Client端接受來自DHCP主機的網路參數,並設定Client自己的網路環境:當Client端接受響應的訊息之後,首先會以ARP封包在網域內發出訊息,以確定來自DHCP主機發放的IP並沒有被佔用。如果該IP已經被佔用了,那麼Client對於這次的DHCP資訊將不接受,而將再次向網域內發出DHCP的需求廣播封包;若該IP沒有被佔用,則client可以接受DHCP主機所給的網路的參數,那麼這些參數將會被使用於client端的網路設定當中,同時,Client端也會對DHCP主機發出確認封包,告訴server這次的需求已經被確認,而server也會將該資訊記錄下來。

4、Client端結束該IP的使用權:當Client開始使用這個DHCP發放的IP之後,有幾個情況可能會失去這個IP的使用權:Client端離線(不論是關閉網路介面、重新開機、關機等行為,皆算是離線狀態,這個時候server端就會將該IP回收,並放到server自己的備用區中,等待未來使用);Client端租約到期(DHCP server端發放的IP有其使用的期限,Client使用這個IP到達期限規定的期限,Client使用這個IP到達期限規定的時間,就需要將IP還回去,這個時候就會造成斷線,而client也可以再向DHCP主機要求再次分配IP地址)。

如下是我根據DHCP的設定檔模版寫的一個設定檔,其中實現了將MAC地址:66:66:66:66:66:0b與IP地址:192.168.0.88之間的綁定。可根據自己的需要實現更多MAC地址與IP之間的綁定。

# dhcpd.conf## Sample configuration file for ISC dhcpd## Use this to enble / disable dynamic dns updates globally.ddns-update-style none;ignore client-updates;# If this DHCP server is the official DHCP server for the local# network, the authoritative directive should be uncommented.#authoritative;# Use this to send dhcp log messages to a different log file (you also# have to hack syslog.conf to complete the redirection).#log-facility local7;# No service will be given on this subnet, but declaring it helps the # DHCP server to understand the network topology.# This is a very basic subnet declaration.# A slightly different configuration for an internal subnet.subnet 192.168.0.0 netmask 255.255.255.0 {  range 192.168.0.30 192.168.0.39;  option domain-name-servers 192.168.0.31;  option domain-name "wan.hust.china";  option routers 192.168.0.1;  option broadcast-address 192.168.0.255;  default-lease-time 21600;  max-lease-time 43200;  host pc001 {  hardware ethernet 66:66:66:66:66:0b;  fixed-address 192.168.0.88;  }}
啟動DHCP服務的命令如下所示:

service dhcpd start    #啟動DHCP服務service dhcpd status  #查看DHCP狀態
如果想要開始自啟動DHCP服務,可以使用如下命令:

chkconfig --level 345 dhcpd on 
至此DHCP配置完成。

QEMU-KVM虛擬機器建立設定

現在就可以通過在建立虛擬機器時指定MAC地址來間接指定IP地址了:

/usr/local/qemu-kemari-v0.2.14/bin/qemu-system-x86_64 -m 1024 /images/test2.img -net nic,mac=66:66:66:66:66:0b -net tap,ifname=tap1,script=/etc/qemu-ifup,downscript=no -vnc :6 -enable-kvm
開啟虛擬機器查看虛擬機器的網卡資訊,就可以看到虛擬機器的IP地址已配置好了。

這裡要注意:當兩台虛擬機器都指定同一個與特定IP綁定的MAC地址時,DHCP並不報錯,而是給兩台虛擬機器都分配這個特定的IP。下面是我在網上找到的一些文章,來解釋同一個網段內可以有兩台電腦擁有相同的IP和MAC地址:其實是可以的,你完全可以把兩台電腦的IP 和MAC改成一樣,不但可以上網而且還沒IP衝突。這種方法不但可以突破路由封鎖用在ADSL共用上網,而且還可以用在IEEE802.1X認證上網的環境中,但是前提必須要用相同的帳號來撥接(前提證明伺服器沒設驗證帳號的重複性),我的機子是通過學校校園網接入internet的,用戶端採用802.1x認證用戶端軟體“STAR Supplicant撥號軟體”來撥接,在我們學校裡可以將兩台機子的IP和MAC改成一樣然後用相同的一個帳號來達到共用上網的目的,不過在我們學校只可以在同一個宿舍的兩台機子才可以共用上網,因為我們學校的伺服器不單止驗證帳號,ip,MAC而且還驗證接入伺服器IP(NAS IP),和接入伺服器連接埠(NAS port),不同的宿舍接在學校交換器不同的連接埠,所以只限於同一個宿舍用這種法共用上網。
  至於為什麼不會引起IP衝突而且還能上網,這是因為 ARP工作的缺陷,系統之所以會發現網上有相的IP的而提示“IP衝突”,是因為系統在啟動時,TCP/IP中的ARP會廣播一個免費ARP(free arp)請求包到網段上,這個ARP(free arp)包包含自己的IP和MAC,如果網段上有機子回應了這個包,這台發廣播的機子就會認為區域網路有別的機子使用和自己相同的IP,
  例如:PC A和PC B的IP和MAC完全一樣,PC A的系統啟動時會廣播一個包含自己IP和MAC的免費ARP(free arp)請求包到網段上,如果PC B回應了這個請求,PC A會認為自己的IP和網路上的IP有衝突並發出提示(這就是為什麼IP衝突一般發生系統剛啟動完成時),問題是PC B根本不會回應這個請求包,這是因為這個請求包的IP和MAC和PC B自己的完全一樣,而PC B會認為是自己發的包,所以不會回應,既然不會回應自然不會發生IP衝突了。
  好了,讓我來解釋下一個問題,就是兩台機子的IP和MAC一樣到底會不會導致不能上網:
既然可以,那麼網路上的硬體裝置是怎樣區份這些資料到底是哪台機的呢??大家都知道區域網路內是用硬體地址來通迅的,區域網路的二層裝置(如交換器)維護著一張地址表,地址表記錄著本裝置每個連接埠所對應的MAC(註:不是連接埠的MAC,而是連接埠所連裝置的MAC),裝置要經過地址學習狀態才能知道這些連接埠所對應的MAC,當一個幀經過裝置的某介連接埠時,裝置會檢查該幀源地址和目的地址,然後再對照自己的地址表,看地址表中是否存在該源地址的對應項,若不存在則連接埠會變為“地址學習狀態”,將該地址儲存在地址表中組成一個新的表項,如果PCA和PCB都連在同一個交換器上,則交換器經過“地址學習狀態”後,地址表中存在兩個相同的地址項,不過它們所對應的連接埠是不同的,當交換器在外部接收到一個目的地址為該地址(PCA和PCB相同的MAC地址)的幀時,則會檢查地址表,檢查地址表後會發現存在兩個相同地址的表項,於是交換器會將該幀轉寄到這兩個表項所對應的連接埠,(至於交換器是用組播的方式還是說用一個幀發兩遍的方式轉寄給這兩個連接埠我就不太清楚了)。
  路由器也一樣,不同是的路由器的地址表是路由表,存放的是IP而不是硬體地址。
  串連這兩個連接埠的PCA和PCB都會收到同樣的幀,既然會收到同樣的幀,那麼電腦怎樣才知道哪些幀才是自己想要的呢?這取決於工作在TCP/ip上層協議,雖然網卡是接收了這個幀,但是上層的協議進行進一步的分用,也可以說成是過濾,當TCP/IP的網路介面層(也叫鏈路層)收到一個幀,會檢查幀頭中的框架類型,如果是ARP類型的就交給ARP協議去處理,如果是RARP類型就會交給RARP協議處理,如果是IP類型會去掉幀頭並把這個幀傳給上一層(即網路層來處理),網路層會根據包頭(去掉幀頭就叫IP包了)中的協議類型來分用,如是TCMP類型就交給ICMP協議處理,如果是IGMP類型就交給IGMP協議處理,如果是TCP或UDP就把包頭去掉並交給上一層(即傳輸層)來片理 ,去掉IP包頭後就叫做報文分段了(傳輸層的單位),同樣傳輸層也會對報文分段的頭部進行檢查從而進行進一步的分用,如果是TCP類型的交給TCP協議處理,如果是UDP類型就交給UDP協議處理,TCP或UDP會根據報文分段的頭部中的“目的連接埠號碼”來交給應用程式層(交給應用程式層前會把報文分段的頭部去掉),然後應用程式層的使用者進程會根據該“連接埠號碼”來決是否接收這個資料,例如QQ某個進程開啟了UDP 1324這個連接埠,傳輸層的UDP協議會把所有接收到的且“目的連接埠號碼”為1324的報文分段交給QQ的這個進程, 這樣就完成接收資料的整個過程。雖然兩台電腦都會接收到不是屬於自己的資料幀,但是在把幀交給上層協議片理時有可能會被丟充,就如應用程式層的QQ進程不會接到除“目的連接埠號碼”為1324以外的其它資料包,因為這些資料在應用程式層前已經被丟棄。

在同一個區域網路內理論上是允許相同MAC地址存在的。為什麼使用相同的MAC地址的PC都能在同一網段內運行呢?首先,我們要明確的是,區域網路內的通訊是以幀為基礎的,也就是我們通常說的MAC地址,而不是IP地址。其次,路由器(特指平時我們家庭用的那種路由,如tplink等)或交換器(如cisco)在區域網路內是根據mac-table進行資料的交換。而且這些表都有特定的生存期,不是靜態。現在假設,有兩台PC(PC1和PC2)的MAC地址相同,分別接在路由器(或交換器)的兩個連接埠(port1,port2)上,pc1首先發起串連魔獸遊戲的伺服器的請求,那麼在路由器(或交換器)上就會在mac-table添加PC1的mac地址到port1上,當魔獸遊戲的伺服器反應請求後,路由器也會把資訊轉寄到port1上給PC1.同理,當PC2也要登陸魔獸遊戲伺服器時,過程也一樣。但是,路由器的mac-table是動態,當pc1請求串連並且被路由器記錄這個mac地址對應的連接埠為port1時,pc2突然發起串連魔獸伺服器的請求,那麼路由器的mac-table就會更改次MAC地址的對應連接埠,把這個mac地址的連接埠改為port2,那麼pc1的響應訊息就會直接發給PC2,造成pc1不能上網。當然,發生這種情況比較少,因為,請求響應都是在幾秒甚至幾十毫秒內完成的。
所以這也解釋了,為什麼其中一台PC接收大量資料時,另一台會斷網的原因啦。





聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.