Ubuntu

如何將一系列公共 IP 橋接到 Debian/Ubuntu 上的 KVM 虛擬機

  • July 21, 2012

幾週以來,我一直在嘗試找出正確的網路配置,以便與在我的伺服器上執行的 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-2ubuntu1qemu-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 請求,在路由的情況下,您希望主機了解當它接收到其中一個地址的數據包時,它需要被路由其他地方,不在本地傳遞。

引用自:https://serverfault.com/questions/409451