vagrant 網絡

vagrant 網絡

爲了連接vagrant創建的環境,他提供了一些高級的網絡選項例如:端口轉發、連接到公用網絡,或者創建一個私有的網絡。高級的網絡選項用來創建一個在不同的虛擬機間工作的抽象層。這也就是說你可以用你的vagrantfile來運行在Virtualbox虛擬機同時你也可以合理的期望這個vagrantfile在vmware虛擬機下也能運行。首先應當賭一下基本應用內容,然後讀下面的針對特定網絡功能的指導。

網絡的基本應用

vagrant提供了很多用來把你的客戶機連接到網絡的選項。但是很重要的一點,就像很多網絡配置一樣,他有一個標準的模式。

配置

所有的網絡配置都是在vagrantfile的config.vm.network方法裏面。例如下面的這些配置,頂一下一些轉發端口

 

Vagrant.configure("2") do |config|
  # ...
  config.vm.network "forwarded_port", guest: 80, host: 8080
end

每一個網絡類型都有一個標識符,例如上面例子中:forwarded_port。下面是一組可以針對每個網絡類型不同的配置參數。轉發端口的情況下,需要兩個數字參數。客戶機端口,以及客戶機可以連接的主機端口。

多網絡

多網絡配置可以通過定義多個config.vm.network在一個vagrantfile中來實現。更確切的說,對於不同的提供者,網絡的配置可以不同。一般來說,命令指定啓用網絡的順序。

網絡開啓

網絡會自動配置和開啓,當在vagrantfile中定義了,運行vagrant up或者運行vagrant reload的過程中

轉發端口

網絡標識符:forwarded_port

vagrant轉發端口允許連接主機的一個端口,讓所有的數據都轉發到客戶機端口上,不管是TCP還是UDP協議。例如:如果客戶機運行一個網絡服務監聽程序在80端口上,你可以把他映射到你主機的8080端口上。這樣你就可以在瀏覽器中輸入localhost:8080來瀏覽網頁,所有的網絡數據都會被轉發到客戶機。

定義轉發端口

轉發端口的配置需要兩個參數,客戶機端口和主機端口

 

Vagrant.configure("2") do |config|
  config.vm.network "forwarded_port", guest: 80, host: 8080
end

這個配置將會通過主機的8080端口訪問客戶機的80端口。

對於大多數的提供者來說,轉發端口默認綁定到所有接口。這也就是說網絡上的其他設備也可以連接轉發端口。如果你想限制連接可以看guest_ip和host_ip部分。

參考選項

這是轉發端口的所有選項列表。

  • guest(int)--你希望暴露給主機的端口,可以是任何端口
  • guest_ip(string)--綁定到轉發端口的客戶IP,如果這個沒有設置,這個端口可以轉到任何一個IP接口。默認爲空
  • host(int)--用來連接客戶機端口的主機端口。這個數值必須大於1024,除非vagrant作爲root用戶運行。
  • host_ip(string)--你打算綁定轉發端口的主機IP。如果沒有指定,這個可以綁定到任何一個IP地址,默認爲空。
  • protocol(string)--或者是TCP或者是UDP.這個選項指定了准許通過轉發端口的協議。默認是TCP

轉發端口協議

默認情況下,任何定義的端口只會轉發TCP協議。作爲可選的第三個選項,爲了傳輸UDP包,你可以指定 protocal:'udp'。如果一個端口需要監聽這2種協議,你必須定義這個端口協議2次,每次指定一個協議。就像下面這樣

 

Vagrant.configure("2") do |config|
  config.vm.network "forwarded_port", guest: 2003, host: 12003, protocol: "tcp"
  config.vm.network "forwarded_port", guest: 2003, host: 12003, protocol: "udp"
end

端口衝突和糾正

當運行多個vagrant機器的時候,經常會遇到定義一個轉發端口,互相沖突。vagrant包括內建的機制會自動檢測和糾正這種情況。端口衝突檢測總是這樣做的。vagrant通常不會允許你定義一個主機已經接收和連接的轉發端口。

對於每個轉發端口都必須手動啓用端口衝突自動校正,因爲當它發生的時候,往往是出人意料的。並且還會導致vagrant用戶認爲這個端口沒有被轉發。啓動端口校正很簡單:

 

Vagrant.configure("2") do |config|
  config.vm.network "forwarded_port", guest: 80, host: 8080,
    auto_correct: true
end

最後的:auto_correct參數設置爲true,告訴vagrant自動糾正任何衝突。當運行vagrant up和vagrant reload的時候,vagrant會打印衝突檢測和自動糾正的信息,這樣你就可以注意和糾正信息。

私有網絡

網絡標誌符:private_network

vagrant私有網絡允許你連接你的客戶機,通過不是公共Internet網絡訪問的IP地址。也就是說,你的機器獲得一個私有地址空間。在同一個私有網絡中的多臺機器可以互相通信。

DHCP

應用私有網絡的最簡單的方式是,通過DHCP來分發IP地址。

 

Vagrant.configure("2") do |config|
  config.vm.network "private_network", type: "dhcp"
end

這將會從保留的地址空間中,自動的分配IP地址。這個可以IP可以通過用vagrant ssh命令來SSH連接到這臺機器,或者用合適的命令來獲取這個IP地址,例如ifconfig。

靜態IP

你也可以指定一個靜態的IP地址。這樣就可以通過這個靜態的IP地址,連接到你的vagrant機器中。配置靜態IP地址的vagrantfile如下:

 

Vagrant.configure("2") do |config|
  config.vm.network "private_network", ip: "192.168.50.4"
end

在配置的時候需要注意,這個靜態的IP地址沒有和同一個網絡的其他IP地址衝突。

如果你能夠選擇你想要的IP地址,應該從保留的私有地址空間中選擇。這些地址將會被保證不會公共轉發,對於大多數的路由也會阻斷外部網絡發送給他們的信息。

對於大多數的操作系統來說,增加靜態IP地址的配置選項,通過設置默認的網關和MTU是可行的。

IPV6

你也可以指定一個靜態的IPV6的地址。對於DHCP是不支持IPV6的。用IPV6只需要指定一個地址就可以了。

 

Vagrant.configure("2") do |config|
  config.vm.network "private_network", ip: "fde4:8dba:82e1::c4"
end

這個將會指定一個IP到這個機器。整個/64子網是保留的。確認使用保留本地空間的IPV6地址。你也可以修改前綴長度通過改變netmask選項

Vagrant.configure("2") do |config|
  config.vm.network "private_network",
    ip: "fde4:8dba:82e1::c4",
    netmask: "96"
end

只有vagrant 1.7.5之後的版本,才支持IPV6私有網絡,並且不是每個提供者都支持。

禁止自動配置

如果你想手工配置網絡接口,你可以通過指定auto_config參數來禁用vagrant自動配置的特性。

 

Vagrant.configure("2") do |config|
  config.vm.network "private_network", ip: "192.168.50.4",
    auto_config: false
end

如果在設置auto_config之前,你已經啓動了vagrant環境。它最初放置的文件將在那裏停留。你必須手動刪除掉它,然後重新創建機器。

不同的操作系統創建的文件路徑不同。例如,對於Linux版本,他的路徑是/etc/network/interfaces.通常你應該查看網絡接口配置的通用位置。

公共網絡

網絡標識符:public_network

vagrant的公共網絡,比起私有網絡的私有性差一點。對於不同的提供者具體的含義也是不同的。公共網絡的意思是,當私有網絡不允許別的機器連接到你的機器,而公共網絡可以。

DHCP

最簡單的用公共網絡的是通過DHCP分配公共IP地址。這種情況下配置很簡單。

 

Vagrant.configure("2") do |config|
  config.vm.network "public_network"
end

當用DHCP的時候,這個可以IP可以通過用vagrant ssh命令來SSH連接到這臺機器,或者用合適的命令來獲取這個IP地址,例如ifconfig。

用DHCP指定默認路由

一些情況下需要DHCP指定原封不動的路由,這種情況下就需要通過use_dhcp_assigned_default_route選項

Vagrant.configure("2") do |config|
  config.vm.network "public_network",
    use_dhcp_assigned_default_route: true
end

靜態IP

根據你的設置,你可能希望手工設定網橋接口的IP地址。只需要在網絡定製中增加:IP分項。

 

config.vm.network "public_network", ip: "192.168.0.17"

默認網絡接口

如果超過一個網絡接口在主機中可用。vagrant會讓你選擇那個接口虛擬機需要橋接。默認的可以通過:bridge分句來設定。

 

config.vm.network "public_network", bridge: "en1: Wi-Fi (AirPort)"

期望的標識符字符串必須準確的匹配可以獲取的接口名字。如果能夠找到。vagrant會從一個列表中讓你選擇一個。

config.vm.network "public_network", bridge: [
  "en1: Wi-Fi (AirPort)",
  "en6: Broadcom NetXtreme Gigabit Ethernet Controller",
]

禁用自動配置

如果你想手工配置,可以禁用自動配置通過指定auto_config

 

Vagrant.configure("2") do |config|
  config.vm.network "public_network", auto_config: false
end

這樣的話shell提供者就會被用來配置接口IP

 

Vagrant.configure("2") do |config|
  config.vm.network "public_network", auto_config: false

  # manual ip
  config.vm.provision "shell",
    run: "always",
    inline: "ifconfig eth1 192.168.0.17 netmask 255.255.255.0 up"

  # manual ipv6
  config.vm.provision "shell",
    run: "always",
    inline: "ifconfig eth1 inet6 add fc00::17/7"
end

默認路由

根據你的設置,你可能希望手工覆蓋默認路由配置。如果你想從別的網絡通過公共網絡訪問vagrant盒子,這是需要配置的。爲了完成這個,你可以用一個提供者腳本。

 

  config.vm.network "public_network", ip: "192.168.0.17"

  # default router
  config.vm.provision "shell",
    run: "always",
    inline: "route add default gw 192.168.0.1"

  # default router ipv6
  config.vm.provision "shell",
    run: "always",
    inline: "route -A inet6 add default gw fc00::1 eth1"

  # delete default gw on eth0
  config.vm.provision "shell",
    run: "always",
    inline: "eval `route -n | awk '{ if ($8 ==\"eth0\" && $2 != \"0.0.0.0\") print \"route del default gw \" $2; }'`"

上面的配置有點複雜。可能需要客戶系統指定。但是我們在這裏粗略的介紹,因爲這是個公共的問題。

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