如何將一系列公共 IP 橋接到 Debian/Ubuntu 上的 KVM 虛擬機
幾週以來,我一直在嘗試找出正確的網路配置,以便與在我的伺服器上執行的 KVM 虛擬機共享一系列公共 IP,
但到目前為止運氣不佳在友好的 ServerFault 社區的幫助下,我設法使它工作。您可以在下面找到我的工作設置:我的 ISP 將所有流量路由到
192.168.8.118
(因此它需要是 eth0 的主 IP),但我必須自行192.168.239.160/28
處理。這是
/etc/network/interfaces
在主機上:# Loopback device: auto lo iface lo inet loopback # device: eth0 auto eth0 iface eth0 inet static address 192.168.8.118 broadcast 192.168.8.127 netmask 255.255.255.224 gateway 192.168.8.97 pointopoint 192.168.8.97 # This device acts as gateway for the bridge, so provide a route. up ip route add 192.168.8.118/32 dev eth0 scope host # device: br0 auto br0 iface br0 inet static bridge_stp off bridge_maxwait 0 bridge_fd 0 address 192.168.239.174 broadcast 192.168.239.175 netmask 255.255.255.240 gateway 192.168.8.118 # Create and destroy the bridge automatically. pre-up brctl addbr br0 post-down brctl delbr br0 # Our additional IPs are allocated on the bridge. up ip route add to 192.168.239.160/28 dev br0 scope host
我已經配置了這樣的虛擬機:
sudo ubuntu-vm-builder kvm precise \ --domain pippin \ --dest pippin \ --hostname pippin.hobbiton.arnor \ --flavour virtual \ --mem 8196 \ --user mikl \ --pass hest \ --bridge=br0 \ --ip 192.168.239.162 \ --mask 255.255.255.240 \ --net 192.168.239.160 \ --bcast 192.168.239.175 \ --gw 192.168.239.174 \ --dns 8.8.8.8 \ --components main,universe \ --addpkg git \ --addpkg openssh-server \ --addpkg vim-nox \ --addpkg zsh \ --libvirt qemu:///system ;
如果我檢查虛擬機的 XML 定義,它的網路介面定義如下:
<interface type='bridge'> <mac address='52:54:00:b1:e9:52'/> <source bridge='br0'/> <model type='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </interface>
當我(重新)啟動虛擬機時,
/var/log/syslog
收到這些行:Jul 20 03:13:02 olin kernel: [ 4084.652906] device vnet0 entered promiscuous mode Jul 20 03:13:02 olin kernel: [ 4084.686388] br0: port 2(vnet0) entering forwarding state Jul 20 03:13:02 olin kernel: [ 4084.686394] br0: port 2(vnet0) entering forwarding state
我的伺服器正在執行 Ubuntu 12.04 64 位,核心為 3.2.0-26-generic(來自 Ubuntu)。我正在跑步
libvirt-bin 0.9.8-2ubuntu1
和qemu-kvm 1.0+noroms-0ubuntu13
。主機上的 iptables 目前設置為允許所有流量(以消除它作為問題來源),並且我已啟用 ipv4 和 ipv6 流量的轉發。
當我從主機通過 SSH 登錄來賓時,來賓作業系統內沒有網際網路連接。客人的
/etc/network/interfaces
樣子是這樣的:auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 192.168.239.162 netmask 255.255.255.240 network 192.168.239.160 broadcast 192.168.239.175 gateway 192.168.239.174 # dns-* options are implemented by the resolvconf package, if installed dns-nameservers 8.8.8.8 dns-search pippin
現在它可以工作了
上面的配置大綱實際上可以按我的意願工作。如果您想查看我之前的嘗試,請參閱編輯歷史記錄。
如果要進行橋接,則無需在主機上配置與 VM 的 IP 地址相關的任何內容。只需將它們配置為連接到網橋,並以通常的方式在每個 VM 中配置 IP。橋接在乙太網層將網路連接在一起,IP 地址無關緊要;從您的 ISP 的角度來看,您似乎有幾台電腦插入一個直接連接到 ISP 的交換機。
但是,如果您的 ISP將流量路由到主機的 .118 地址,則您需要將 VM 主機配置為充當路由器並轉發 VM 的流量。為此,請
bridge_ports eth0
從您的介面文件中刪除該行ip route add to 192.168.239.160/28 dev br0
, 和echo 1 > /proc/sys/net/ipv4/ip_forward
. 在虛擬機中,您需要將 192.168.8.118 配置為預設網關,並添加一條表示 192.168.8.118 可通過eth0
. (那是虛擬機的eth0
,它連接到主機的br0
。)在這兩種情況下,您都不應該將虛擬機的地址直接添加到
br0
介面中。在橋接的情況下,您希望虛擬機而不是主機響應這些地址的 ARP 請求,在路由的情況下,您希望主機了解當它接收到其中一個地址的數據包時,它需要被路由其他地方,不在本地傳遞。