网络接口/dhcp 问题 ubuntu 与 kvm 和网桥

网络接口/dhcp 问题 ubuntu 与 kvm 和网桥

我有一个运行 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
      • 将其策略设置为ACCEPTiptables -P FORWARD ACCEPT)。
      • 确保您没有在任何其他表中进行过滤(您不应该这样做,因为这不是它们的目的)。
    • 如果桥接流量对于 arptables 可见(即net.bridge.bridge-nf-call-arptables= 1),则需要对表中的IN和链(实际上是唯一的表)执行与上述类似的操作。OUTfilter
    • 再次对 进行类似操作ebtables。无需检查某个 sysctl 是否已设置,它始终与桥接流量相关。

    我省略了最后两个步骤的详细信息,因为您的系统不太可能在那里进行任何配置。您甚至可能没有在系统上安装它们,在这种情况下,您可以跳过这些步骤。

  • 确保你没有ARP 代理。你可能不需要它(例如,对于与这个问题完全无关的事情)并且可能不会这样做,所以只是sudo sysctl net.ipv4.conf.all.proxy_arp=0。如果你正在桥接,你不应该为这样一个简单的示例代理 ARP。

据我所知,没有“NAT 转发”这样的东西。您指的是普通的 IP 转发吗(与以太网桥接也不是一回事)?您指的是端口转发吗?仅转发 bootps (67) 和 bootpc (68) 端口(分别由 DHCP 服务器和客户端使用)并对其他所有内容进行 NAT 是一种非常奇怪的设置,会使调试变得困难。

相关内容