我有一个运行 12.10 的 ubuntu 系统
我正在使用 KVM,并为虚拟机配置了一个桥接器,该桥接器使用 nat 转发。我遇到了连接定期断开的问题,有时会持续几天,有时几分钟。
我已经禁用桥接器来解决这个问题但是它仍然在发生,我尝试进行手动 dhcp 发布和更新,这有时有效,它为我获取了一个新的 ip 并且我再次离开但是我注意到当我运行ifconfig
或在 kvm 连接设置中时我的 ip 没有更新。
/etc/接口
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
#auto br0
#iface br0 inet dhcp
# bridge_ports eth0
# bridge_stp off
# bridge_fd 0
# bridge_maxwait 0
是否配置
eth0 Link encap:Ethernet HWaddr 38:60:77:aa:aa:aa
inet addr:10.0.0.137 Bcast:10.0.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:52068 errors:0 dropped:0 overruns:0 frame:0
TX packets:10900 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:12322071 (12.3 MB) TX bytes:2494188 (2.4 MB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:2651 errors:0 dropped:0 overruns:0 frame:0
TX packets:2651 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:402096 (402.0 KB) TX bytes:402096 (402.0 KB)
virbr0 Link encap:Ethernet HWaddr f6:94:09:8f:7b:b5
inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
sudo dhcpclient-r-v
Internet Systems Consortium DHCP Client 4.2.4
Copyright 2004-2012 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Listening on LPF/virbr0/f6:94:09:8f:7b:b5
Sending on LPF/virbr0/f6:94:09:8f:7b:b5
Listening on LPF/eth0/38:60:77:aa:aa:aa
Sending on LPF/eth0/38:60:77:aa:aa:aa
Sending on Socket/fallback
DHCPRELEASE on eth0 to 10.0.0.254 port 67
sudo dhcpclient-v
Internet Systems Consortium DHCP Client 4.2.4
Copyright 2004-2012 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Listening on LPF/virbr0/f6:94:09:8f:7b:b5
Sending on LPF/virbr0/f6:94:09:8f:7b:b5
Sending on Socket/fallback
DHCPDISCOVER on virbr0 to 255.255.255.255 port 67 interval 3
DHCPDISCOVER on virbr0 to 255.255.255.255 port 67 interval 5
DHCPDISCOVER on virbr0 to 255.255.255.255 port 67 interval 9
DHCPDISCOVER on virbr0 to 255.255.255.255 port 67 interval 15
目前我知道的唯一恢复此状态的方法是拔掉网线并重新启动
更新
当连接断开时,我可以在sudo dhclient -v
不先丢弃地址的情况下成功运行。
dhclient-v
Internet Systems Consortium DHCP Client 4.2.4
Copyright 2004-2012 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Listening on LPF/virbr0/96:a2:d6:f5:30:fc
Sending on LPF/virbr0/96:a2:d6:f5:30:fc
Listening on LPF/eth0/38:60:77:aa:aa:aa
Sending on LPF/eth0/38:60:77:aa:aa:aa
Sending on Socket/fallback
DHCPDISCOVER on virbr0 to 255.255.255.255 port 67 interval 3
DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 3
DHCPREQUEST of 10.0.0.129 on eth0 to 255.255.255.255 port 67
DHCPOFFER of 10.0.0.129 from 10.0.0.254
DHCPACK of 10.0.0.129 from 10.0.0.254
bound to 10.0.0.129 -- renewal in 5716 seconds.
在这里我可以看到我正在被租用,10.0.0.129
但 ifconfig 仍然显示10.0.0.137
eth0 Link encap:Ethernet HWaddr 38:60:77:82:a8:61
inet addr:10.0.0.137 Bcast:10.0.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:312183 errors:0 dropped:0 overruns:0 frame:0
TX packets:85529 errors:0 dropped:1 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:80808972 (80.8 MB) TX bytes:20479979 (20.4 MB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:3910 errors:0 dropped:0 overruns:0 frame:0
TX packets:3910 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:461047 (461.0 KB) TX bytes:461047 (461.0 KB)
virbr0 Link encap:Ethernet HWaddr 96:a2:d6:f5:30:fc
inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
答案1
我真的很惊讶没有人提到这个显而易见的答案——
放弃 DHCP 并使用静态 IP 寻址。您可以继续使用 NAT 等,只是不要从 DHCP 池分配 IP,而是在同一个子网中,一切都应该可靠且可预测地工作。
要启用静态 IP 寻址,您只需更改
自动 eth0 iface eth0 inet dhcp
到
自动 eth0 地址 XXXX iface eth0 inet 静态 网络掩码 255.255.255.0 网关 XXXY
确保网关是 KVM 分配的地址(如果您执行 /sbin/route -n,它将显示默认网关 - 即要使用的 IP 地址)。
答案2
黑暗中的射击:
ethX 不应该 DHCP 任何东西。
从基于 Proxmox 的机器上,我得到的 ifconfig 结果(vmbr0 桥接到 eth1(唯一真实连接的 NIC,因为它是 gbit))是:
eth0 Link encap:Ethernet HWaddr 00:30:67:4f:48:57
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Interrupt:27 Base address:0x4000
eth1 Link encap:Ethernet HWaddr 54:e6:fc:80:06:9b
inet6 addr: fe80::56e6:fcff:fe80:69b/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:209503 errors:0 dropped:0 overruns:0 frame:0
TX packets:22361 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:46807271 (44.6 MiB) TX bytes:1558940 (1.4 MiB)
Interrupt:16 Base address:0x8000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:24031 errors:0 dropped:0 overruns:0 frame:0
TX packets:24031 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:2462584 (2.3 MiB) TX bytes:2462584 (2.3 MiB)
venet0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet6 addr: fe80::1/128 Scope:Link
UP BROADCAST POINTOPOINT RUNNING NOARP MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:3 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
vmbr0 Link encap:Ethernet HWaddr 54:e6:fc:80:06:9b
inet addr:192.168.1.4 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::56e6:fcff:fe80:69b/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:196981 errors:0 dropped:0 overruns:0 frame:0
TX packets:10585 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:43275844 (41.2 MiB) TX bytes:784636 (766.2 KiB)
这是我目前得到的最好的东西。
答案3
另一个暗中尝试:
你可以尝试禁用IPv6在网络管理器中控制:将其从方法:“自动”设置为方法“忽略”
这曾经帮我解决了这类问题。
如果不起作用,你应该检查一下
tail -f /var/log/syslog
当连接丢失并重新连接时
通过检查 networkmanager 的 tcpdump 可以获得另一个提示
答案4
如果您使用网桥将虚拟机连接到与 eth0 相同的网络,则通常不需要进行任何 NAT。您只需执行以下五个步骤:
- 配置虚拟机管理程序以使用适当的桥接接口。KVM 只是内核提供的东西。虚拟机管理程序可以使用它来实现虚拟机。如果虚拟机管理程序设置为使用
virbr0
但您配置了br0
,那么您当然会遇到问题。这似乎virbr0
是您的虚拟机管理程序自动设置的,因此此时您只需确保您的虚拟机使用该接口(我认为已经完成)并且eth0
已将其添加到其中(即sudo brctl addif virbr0 eth0
) - 确保所有相关链接都已打开(即
sudo ip link set dev eth0 up; sudo ip link set dev virbr0 up
)。首选ip
来自iproute2
软件包;ifconfig
来自net-tools
软件包早已弃用,尽管对于如此基本的东西它仍然有效。 - 在内核中启用 IP 转发(即
sysctl net.ipv4.ip_forward=1
) 设置防火墙以允许桥接流量。如果您不是特别挑剔或担心有人向您的虚拟机发送任意流量,您可以执行以下操作以允许任何流量通过:
- 如果桥接流量对于 iptables 可见(即
net.bridge.bridge-nf-call-iptables
= 1):- 冲洗表过滤器中的
iptables
FORWARD
链条( )。iptables -F FORWARD
- 将其策略设置为
ACCEPT
(iptables -P FORWARD ACCEPT
)。 - 确保您没有在任何其他表中进行过滤(您不应该这样做,因为这不是它们的目的)。
- 冲洗表过滤器中的
- 如果桥接流量对于 arptables 可见(即
net.bridge.bridge-nf-call-arptables
= 1),则需要对表中的IN
和链(实际上是唯一的表)执行与上述类似的操作。OUT
filter
- 再次对 进行类似操作
ebtables
。无需检查某个 sysctl 是否已设置,它始终与桥接流量相关。
我省略了最后两个步骤的详细信息,因为您的系统不太可能在那里进行任何配置。您甚至可能没有在系统上安装它们,在这种情况下,您可以跳过这些步骤。
- 如果桥接流量对于 iptables 可见(即
确保你没有ARP 代理。你可能不需要它(例如,对于与这个问题完全无关的事情)并且可能不会这样做,所以只是
sudo sysctl net.ipv4.conf.all.proxy_arp=0
。如果你正在桥接,你不应该为这样一个简单的示例代理 ARP。
据我所知,没有“NAT 转发”这样的东西。您指的是普通的 IP 转发吗(与以太网桥接也不是一回事)?您指的是端口转发吗?仅转发 bootps (67) 和 bootpc (68) 端口(分别由 DHCP 服务器和客户端使用)并对其他所有内容进行 NAT 是一种非常奇怪的设置,会使调试变得困难。