Linux服务器上常见网络相关问题的故障排除
如果您看到这篇博文,很可能您的 Linux 服务器遇到了某种网络问题。虽然并非有意为之,但有时网络配置错误会导致一些不良后果。
原因可能很简单,比如一个恼人的语法错误,一条防火墙规则可能过于有效地阻止了流量(或者一条配置错误的防火墙规则),或者在极少数情况下——一根不稳定的网线,一旦更换,服务器就可以再次访问。
这些情况都很容易解决,但有一点可以肯定——故障排除是确定根本原因的方法。
关于如何排查Linux服务器上的网络相关问题的实用技巧:
由于服务器通常无法通过 SSH 访问,您需要熟悉带外控制台访问方式:如果您使用的是独立服务器,则需要访问 IPMI 控制台;如果您使用的是 VPS 服务,则需要访问 VNC 控制台。这两种方式的设计初衷都是为了在远程 SSH 访问不可用时,让您能够诊断问题。
第一步:
通过上述任一方法访问服务器后,请尝试输入以下命令检查是否可以访问 Google 的公共 DNS 服务器:
ping 8.8.8.8
当服务器无法连接到此目的地时,这清楚地表明网络配置存在问题。
第二步:
现在,是时候深入了解网络配置了!
首先,尝试通过 ping 命令(从您的本地计算机)ping 服务器的主 IP 和网关——这将确定您的服务器是否具有任何形式的网络连接。
ping {你的服务器主IP地址}
如果您能够成功 ping 通服务器的网关 IP,这是一个好消息,表明网络路由正确,可以开始进一步的故障排除!
登录后,您可以通过执行以下命令查看服务器的网络路由:
路线 -n
这将向您展示网络流量如何到达您的服务器,并证明流量确实到达了您服务器的网关 IP(这是件好事!)。
如果由于某种原因,您发现从本地计算机终端 ping 主服务器 IP 地址失败,则表明主 IP 地址所路由的特定接口存在连接问题。
专业提示:您需要确保网络接口(例如“eth0”)已启用——为此,您可以运行以下命令来检查所有已配置的接口:
IP地址
此命令输出服务器上所有已配置和可用的网络接口,并提供两种相对状态之一:“UP”或“DOWN”。
如果您发现分配给您正在排查故障的 IP 地址的接口显示“DOWN”状态,您可以通过发出以下命令将其打开(并使其“UP”):
ifdown {接口名称} /* 关闭一个接口 */
ifup {接口名称} /* 启动一个接口 */
例如:ifup eth0 /* 启动接口“eth0” */
如果上述命令由于某种原因无法正常工作,很可能是因为您正在排查故障的接口不在 ifdown(和 ifup)脚本能够检测到的状态。在这种情况下,请尝试使用强制标志:
ifdown –force {接口名称}
ifup {接口名称}
执行此命令时,将显示错误信息,指出脚本为何未按预期(及成功)运行——最可能的原因是配置文件中存在语法错误:
对于使用CentOS 和 RHEL 服务器的用户,可以通过执行以下命令查看配置文件:
cat /etc/sysconfig/network-scripts/ifcfg-{接口名称}
/* 将接口名称替换为您分配的 IP 接口名称 */
如果您的接口已启动且未显示任何错误,但您仍然无法 ping 通该接口,则需要进一步排查故障。为了避免过于简单,请确保您正在排查故障的 IP 地址确实是 RackNerd 分配给您的地址——如果您对此有任何疑问,请联系 RackNerd 支持团队。
对于使用Ubuntu 和 Debian 服务器的用户,可以通过执行以下命令查看配置文件:
cat /etc/network/interfaces
请注意,对于运行 Ubuntu 18.04 LTS 及更高版本 Ubuntu 和 Debian 服务器的客户端,此命令略有不同,如下所示:
cat /etc/netplan/file.yml
此时,如果您运行的是基于 CentOS 或 RedHat 的服务器,您应该会看到类似于以下内容的网络接口配置:
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes
HWADDR=”00:00:c3:b5:f2:af”
IPADDR=”XXXXXX”
NETMASK=”XXXXXX”
DHCPV6C=”no”
IPV6_AUTOCONF=”no”
IPV6INIT=”yes”
IPV6ADDR=”XXXXXX”
GATEWAY=”XXXXXX”
IPV6_DEFAULTGW=”XXXXXX”
同样,如果您使用的是基于 Ubuntu 的服务器(版本低于 18.04 LTS),则您的配置文件可能如下所示:
自动配置 eth0
接口 eth0 inet 静态
地址 10.0.0.1
子网掩码 255.255.255.0
网关 10.0.0.254
如果您使用的是基于 Ubuntu 18.04 LTS(或更高版本)的服务器,您将看到类似如下的输出:
网络:
版本:2
渲染器:networkd
以太网:
enp3s0:
地址:
– 10.10.10.2/24
网关4:10.10.10.1
名称服务器:
地址:[10.10.10.1, 1.1.1.1]
需要说明的是:您看到的某些配置条目可能会有所不同,具体取决于相应的 IP 地址分配是配置为 DHCP 还是静态配置。
在基于 CentOS 和 RedHat 的安装中,这与BOOTPROTO有关。在 Ubuntu 和 Debian 的安装中,这与inet static有关。
需要注意的是,GRUB 配置文件决定了服务器重启期间设备是否需要处于“UP”状态。在 CentOS 和 Red Hat 系统中,这与ONBOOT相关。在 Ubuntu 和 Debian 系统中,这通常表示为auto。
补充说明(对于运行 Ubuntu 服务器版本高于 18.04 的用户):您的网络配置由systemd服务(而不是Network Manager)管理——在这种情况下,重启时要加载的网络计划直接在您的 grub 配置文件中指定。
完成更改后,您现在可以执行以下命令来重启网络服务:
在 Ubuntu 和 Debian 18.04 LTS 版本之前的系统中:
服务重启网络
在安装了 Ubuntu 18.04 LTS 以上版本的服务器上:
网络计划应用
在基于 CentOS 和 RedHat 的服务器上:
服务重启网络
或者:
ifdown {接口名称}
ifup {接口名称}
专业提示:如果您通过 SSH 登录服务器,请避免执行网络重启操作(以及 ifup 和 ifdown 脚本) 。如果网络配置存在错误,则可能会(而且很可能会)中断您当前的 SSH 会话。
补充提示:您可以通过以下日志文件了解网络相关错误信息,您可以访问这些日志文件(与操作系统版本无关):
/var/log/messages(使用相应的接口进行 grep 搜索)
dmesg(使用相应的接口进行 grep 搜索)例如: grep eth0 /var/log/messages
grep eth0 dmesg
如果上述方法无效,则需要探索和排查其他可能的情况:
常见情况:防火墙规则配置错误可能导致连接被阻止。
您可以使用以下工具来检查与服务器的连接被阻止的位置:
在 Ubuntu 系统上安装(请将公网 IP 地址替换为您的服务器 IP 地址):
mtr {public_IP}
在 Debian 系统上安装(将公网 IP 地址替换为您的服务器 IP 地址):
traceroute {public_IP}
在基于 CentOS 和 RedHat 的服务器上(将公网 IP 地址替换为您服务器的 IP 地址):
traceroute {公网 IP}
选择,
跟踪路径 {公网 IP}
这些命令将通过网络发送到指定目标,并显示每个响应节点的延迟。如果跟踪未到达服务器的 IP 地址或网关,则可能表明服务器上运行着防火墙(阻止了连接)。
要诊断是否属于这种情况,您可以通过在 Linux 系统中运行以下命令来验证 iptables 规则:
iptables -L -n
有时,服务器防火墙会阻止 ICMP 协议,导致服务器无法响应 ping 请求。此外,某些策略可能更加严格,会阻止常规连接和/或特定 IP 地址。要确定问题是否与防火墙规则有关,您可以尝试停止防火墙(iptables 或 UFW)——很多时候,这样做就能让您如愿连接到服务器(因此问题确实与防火墙规则有关)。
故障排除的第一步是暂时停止防火墙,以确定它是否是问题的根本原因。
要在基于 CentOS 或 RedHat 的服务器上停止 iptables:
停止 iptables 服务
要在基于 Ubuntu 或 Debian 的服务器上停止 UFW:
ufw 禁用
关闭防火墙后,检查服务器是否恢复 ping 通。如果恢复正常,则在重新启用 iptables 或 ufw 之前,需要检查防火墙规则。