如何诊断Linux系统上的互联网访问失败?

如何诊断Linux系统上的互联网访问失败?

我有一个VM正在运行的Xen虚拟机。虚拟机运行了几个月,网络突然中断了。

             Dom0                           DomU

.-------.  bridge  .-------. virtual link .------.
| eth0  |----------| vif55 |-------x------| eth0 |
'-------'          '-------'       |      '------'
                                   |
Seems to be broken somewhere here /

不过,我仍然可以xm consoleDom0并访问VM

我想了解问题的根源。我确信的是,如果我重新启动,VM一切都会恢复正常(我知道这一点,因为这不是第一次发生)...

以下是我目前所做的:

来自 DomU

xm console domu
$ sudo su
$ ifconfig

网络连接看起来没问题。IP 没问题,但以下任一命令都会失败:

$ ping dom0
$ ping 8.8.8.8

我得到的错误是:

$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
ping: sendmsg: No buffer space available
^C
--- 8.8.8.8 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 24002ms

我的fail2ban看上去没坏:

$ tail -n2 fail2ban.log
2015-07-31 19:41:52,851 fail2ban.actions[1854]: WARNING [ssh] Ban 218.65.30.61
2015-07-31 19:51:53,618 fail2ban.actions[1854]: WARNING [ssh] Unban 218.65.30.61

$ iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
fail2ban-apache  tcp  --  anywhere             anywhere             multiport dports http,https
fail2ban-ssh  tcp  --  anywhere             anywhere             multiport dports ssh

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain fail2ban-apache (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere

Chain fail2ban-ssh (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere

给出的可用磁盘空间看起来df还可以。

来自 Dom0

正在VM运行:

$xmlist | grep domu
domu                                   55  4096     4     -b---- 670393.8

它连接到vif55

$iptables -L | grep domu
ACCEPT     all  --  domu            anywhere            PHYSDEV match --physdev-in vif55.0

可用vif55的有:

$ ifconfig | grep vif55.0
vif55.0   Link encap:Ethernet  HWaddr fe:ff:ff:ff:ff:ff
          inet6 addr: xxxx::fcff:ffff:xxxx:ffff/64 Scope:Link
          UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  Metric:1
          RX packets:60965324 errors:0 dropped:0 overruns:0 frame:0
          TX packets:130097868 errors:0 dropped:22 overruns:0 carrier:0
          collisions:0 txqueuelen:32
          RX bytes:3441407339 (3.2 GiB)  TX bytes:161037189 (153.5 MiB)

连接vif55到网桥:

$ brctl show
bridge name     bridge id               STP enabled     interfaces
eth0            8000.10604ba1432a       no              peth0
                                                        vif1.0
                                                        vif10.0
                                                        vif11.0
                                                        vif48.0
                                                        vif51.0
                                                        vif55.0
                                                        vif56.0
                                                        vif57.0
                                                        vif58.0
                                                        vif59.0
                                                        vif60.0
                                                        vif9.0

答案1

解开这个谜团的关键在于您从ping:获得的错误消息sendmsg: No buffer space available。这意味着数据包不只是在某处被丢弃,它们实际上在某处被“堵塞”了。在物理机中,这表明内核驱动程序和/或硬件存在错误;同样,在虚拟机中,这意味着您在某处找到了低级错误的网络代码。

首先,确保你的补丁是最新的,尤其是在主机上。如果你正在运行一个非常老版本的操作系统,现在可能是时候升级它了——Xen 已经有了很多多年来已修复的错误。

暂时,通过增加 sysctl 来解决此问题net.core.wmem_max。但是,这不是“修复”,只是一种解决方法;大概更大的缓冲区空间最终会再次填满,您将回到现在的状态。

您没有指定如何运行客户机。如果它是完全虚拟化的,则您使用的模拟 NIC 中可能存在错误;virtio 是您的最佳选择,但如果您已经在使用它,请尝试使用e1000

相关内容