Networking

橋接介面無法訪問 Internet

  • December 10, 2015

我正在嘗試執行 QEMU VM,但它沒有網際網路訪問權限,只能訪問主機和 Docker 網路。

我做了什麼:

  1. 創建了一座橋樑:brctl addbr virbr0;
  2. 打開它:ip link set up dev virbr0;
  3. 分配一個IP ip addr add 192.168.66.1/24:;
  4. 更新了 QEMU 配置echo "allow virbr0" >> /etc/qemu/bridge.conf
  5. 執行虛擬安裝:
virt-install \
 --name centos67 \
 --memory 1024 \
 --vcpus=1,maxvcpus=2 \
 --cpu host \
 --cdrom $HOME/Downloads/CentOS-6.7-x86_64-minimal.iso \
 --disk size=4,format=raw \
 --network bridge=virbr0

然後我啟動了一個救援映像並配置了一個網路:

IP:192.168.66.2/24

網關:192.168.66.1

僅此而已,此時我只能訪問主機和 Docker 網路,但無法訪問 Internet(因此 ping 8.8.8.8 失敗)。

以下是一些主機實用程序的輸出,可能有助於幫助我解決此問題:

$ brctl showstp virbr0
virbr0
bridge id              8000.fef8a25ccef1
designated root        8000.fef8a25ccef1
root port                 0                    path cost                  0
max age                  19.99                 bridge max age            19.99
hello time                1.99                 bridge hello time          1.99
forward delay            14.99                 bridge forward delay      14.99
ageing time             299.99
hello timer               0.00                 tcn timer                  0.00
topology change timer     0.00                 gc timer                 167.03
flags


tap0 (1)
port id                8001                    state                forwarding
designated root        8000.fef8a25ccef1       path cost                100
designated bridge      8000.fef8a25ccef1       message age timer          0.00
designated port        8001                    forward delay timer       12.95
designated cost           0                    hold timer                 0.00
flags

$ ip route
default via 192.168.232.2 dev envmw  proto static  metric 100
192.168.5.0/24 dev docker0  proto kernel  scope link  src 192.168.5.1
192.168.66.0/24 dev virbr0  proto kernel  scope link  src 192.168.66.1
192.168.232.0/24 dev envmw  proto kernel  scope link  src 192.168.232.100  metric 100
212.25.224.10 via 192.168.232.2 dev envmw  proto static  metric 100

$ iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
DOCKER     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             255.255.255.255

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain DOCKER (1 references)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             a01.dev.lo  tcp dpt:pxc-splr-ft
ACCEPT     tcp  --  anywhere             a01.dev.lo  tcp dpt:pxc-spvr-ft
ACCEPT     tcp  --  anywhere             a01.dev.lo  tcp dpt:newoak

看起來我錯過了一些配置步驟,但我不知道是哪一個。我試圖Google一個解決方案,但沒有找到任何解決方案。

為了使它工作,我必須啟用 NAT。

$ iptables -t nat -A POSTROUTING -o envmw -j MASQUERADE
$ iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
$ iptables -A FORWARD -i virbr0 -o envmw -j ACCEPT

您尚未向envmw網橋添加物理介面 ( )。您還需要將該介面設置為沒有 IP 地址的混雜模式:

brctl addif virbr0 envmw
ip addr add 0/0 dev envmw
ip addr del 192.168.66.1/24 dev envmw
ip link set envmw promisc on

從遠端會話執行這些命令是個壞主意,因為它會更改介面配置。這反過來將斷開任何遠端流量 - 包括遠端會話。

引用自:https://unix.stackexchange.com/questions/248504