我在ubuntu 16.04上使用KVM。我无法从VM内部ping到Internet(没有来自VM内部的Internet连接)。到目前为止我的调试步骤:
在VM内部我运行了traceroute 216.58.218.110
traceroute to 216.58.218.110 (216.58.218.110), 30 hops max, 46 byte packets
1 192.168.122.1 (192.168.122.1) 0.141 ms 0.272 ms 0.180 ms
2 192.168.122.1 (192.168.122.1) 0.387 ms 0.033 ms 0.200 ms
在我的主机操作系统中,我运行了ifconfig
virbr0 Link encap:Ethernet HWaddr fe:54:00:0f:d3:58
inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:46792 errors:0 dropped:0 overruns:0 frame:0
TX packets:3325 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2379378 (2.3 MB) TX bytes:166020 (166.0 KB)
这意味着数据包正从容器转发到virbr0。
接下来,我运行brctl show
以查看virbr0连接到哪个接口。
bridge name bridge id STP enabled interfaces
br0 8000.000000000000 no
br1 8000.000000000000 no
docker0 8000.024226c559f9 no
virbr0 8000.fe54000fd358 yes vnet0
virbr1 8000.52540059b8dd yes virbr1-nic
vnet1
我检查ifconfig
是否存在
vnet0 Link encap:Ethernet HWaddr fe:54:00:0f:d3:58
inet6 addr: fe80::fc54:ff:fe0f:d358/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:205 errors:0 dropped:0 overruns:0 frame:0
TX packets:565 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:14280 (14.2 KB) TX bytes:31810 (31.8 KB)
如果数据包越过vnet0,我的理解是它应该到达网关IP。为了检查网关IP是什么,我运行了route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.40.1.254 0.0.0.0 UG 0 0 0 eno1
10.0.0.0 10.18.44.1 255.0.0.0 UG 0 0 0 br0
10.18.44.0 0.0.0.0 255.255.255.192 U 0 0 0 br0
10.40.0.0 0.0.0.0 255.255.254.0 U 0 0 0 eno1
161.26.0.0 10.18.44.1 255.255.0.0 UG 0 0 0 br0
169.254.169.254 10.40.1.254 255.255.255.255 UGH 0 0 0 eno1
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.42.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr1
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
208.43.222.48 0.0.0.0 255.255.255.248 U 0 0 0 br1
最后我从主机操作系统运行traceroute 216.58.218.110
。这给出了以下输出:
traceroute to 216.58.218.110 (216.58.218.110), 30 hops max, 60 byte packets
1 10.40.1.254 (10.40.1.254) 0.094 ms 0.064 ms 0.046 ms
2 srx3600-vl208-gw.net.tacc.utexas.edu (129.114.108.254) 0.529 ms 0.499 ms 0.495 ms
3 ex9214-vl654-gw.net.tacc.utexas.edu (129.114.0.185) 0.882 ms 0.847 ms 0.849 ms
4 mx480-vl667-gw.net.tacc.utexas.edu (129.114.0.165) 0.860 ms 0.860 ms 0.848 ms
5 hstn-txbb-core-et-1-1-0-703.tx-bb.net (192.124.228.97) 5.742 ms 5.716 ms 5.854 ms
6 74.200.189.29 (74.200.189.29) 10.619 ms 10.724 ms 10.918 ms
7 74.200.189.251 (74.200.189.251) 26.455 ms 10.817 ms 10.800 ms
8 72.14.215.83 (72.14.215.83) 10.828 ms 10.744 ms 10.808 ms
9 108.170.240.129 (108.170.240.129) 10.990 ms
这意味着没有防火墙/代理阻止访问互联网。有人可以帮帮我吗?我不知道为什么数据包在到达virbr0后没有到达网关。
谢谢!
答案 0 :(得分:0)
经过大量调试后,我能够识别并修复2个问题:
/etc/resolv.conf
中使用名称服务器来解析域名。相反,我必须在dns-nameservers
中修改br0的/etc/network/interfaces
字段。具体来说,将dns-nameservers
中/etc/network/interfaces
之后的IP替换为主机操作系统/etc/resolv.conf
中的名称服务器。这些更改解决了这个问题。希望这可以帮助其他任何面临类似问题的人。