CentOS服务器网络故障通常不是单一原因造成的,而是配置、硬件、路由、防火墙、DNS解析等多个环节中某一环异常导致的连锁反应。运维人员最忌讳的是盲目重启网络服务或直接重启服务器,因为这样会破坏现场,导致无法定位根因。正确做法是先分层排查,从物理链路到内核协议栈,再到应用层服务,逐层确认。
当收到“服务器连不上”的告警后,第一步是确认自己所在的位置和访问路径。如果是通过SSH远程管理,先判断是SSH服务本身挂了,还是整台机器网络不通。可以在本地执行ping命令测试服务器IP是否可达。如果ping不通,不代表服务器一定宕机,因为很多机房或云平台默认禁用ICMP响应。此时应改用其他协议测试,例如telnet目标IP的22端口,或者使用nmap做端口探测。如果22端口通但SSH登录卡住,问题可能出在DNS反向解析或防火墙连接跟踪上。
物理链路与网卡状态检查登录服务器后(通过带外管理、VNC或云控制台),先检查网卡是否处于UP状态。执行以下命令查看所有网卡的状态:
ip link show
如果网卡显示DOWN,先尝试启用它:
ip link set eth0 up
同时检查网线、交换机端口、光模块是否有异常。在物理服务器上,ethtool命令非常有用:
ethtool eth0
输出中的Speed、Duplex、Link detected是关键指标。如果Link detected显示no,说明物理链路不通,需要检查网线或上联交换机端口。如果Speed显示Unknown或10Mb/s,可能是网线质量差、网卡与交换机速率协商失败,可以尝试强制指定速率和双工模式:
ethtool -s eth0 speed 1000 duplex full autoneg off
云服务器没有物理链路问题,但虚拟网卡可能因为宿主机异常或安全组策略导致流量被丢弃,需要结合云平台监控和VNC登录排查。
IP地址与路由表排查网卡UP不代表网络配置正确。执行以下命令查看IP地址是否配置正确:
ip addr show
确认IP地址、子网掩码、广播地址是否与机房或云平台分配的一致。如果IP地址丢失或配置错误,需要修改网卡配置文件。CentOS 7/8的网卡配置文件位于/etc/sysconfig/network-scripts/目录下,文件名通常为ifcfg-eth0或ifcfg-ens33。检查关键字段:
BOOTPROTO=static ONBOOT=yes IPADDR=192.168.1.100 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 DNS1=223.5.5.5
修改后重启网络服务:
systemctl restart network
如果IP配置无误,接下来检查路由表:
ip route show
默认路由是否存在?网关是否可达?如果默认路由缺失,可以手动添加:
ip route add default via 192.168.1.1 dev eth0
同时用arp命令确认网关的MAC地址是否学习到:
arp -n
如果网关的MAC地址显示incomplete,说明二层通信有问题,可能是交换机端口隔离、VLAN配置错误或网关ARP响应被防火墙拦截。
DNS解析故障定位很多“网络不通”的假象其实是DNS解析失败。服务器能ping通IP但无法解析域名,或者SSH登录缓慢、yum更新卡住,都可能是DNS问题。先检查/etc/resolv.conf文件:
cat /etc/resolv.conf
确认nameserver地址是否有效。可以用nslookup或dig命令测试解析:
nslookup baidu.com dig baidu.com @223.5.5.5
如果解析超时,可能是DNS服务器不可达、被防火墙拦截53端口,或者DNS服务器本身故障。可以临时更换DNS服务器测试:
echo "nameserver 119.29.29.29" > /etc/resolv.conf
注意,CentOS 7/8中如果使用了NetworkManager,直接修改resolv.conf可能会被覆盖,需要在网卡配置文件中添加DNS字段并重启网络服务。
防火墙与安全策略检查CentOS默认使用firewalld作为防火墙管理工具,部分老系统使用iptables。防火墙规则配置错误是网络故障的高发原因。先查看firewalld状态:
systemctl status firewalld
如果服务在运行,查看当前生效的规则:
firewall-cmd --list-all
重点检查开放的端口和服务是否包含SSH、HTTP、HTTPS等必要服务。如果发现22端口未开放,可以临时添加:
firewall-cmd --add-port=22/tcp --permanent firewall-cmd --reload
对于iptables,查看规则:
iptables -L -n -v
注意INPUT链的默认策略是否为DROP,以及是否有针对特定端口的REJECT规则。如果规则过于复杂,可以临时清空规则测试:
iptables -F iptables -X iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT
但清空规则前务必确认服务器暴露在公网的风险,测试完成后应立即恢复规则。
内核参数与连接跟踪问题高并发场景下,CentOS服务器的连接跟踪表(conntrack)可能被占满,导致新连接无法建立。表现为部分服务能访问,部分服务超时,ping可能正常但TCP握手失败。检查当前连接跟踪数量:
sysctl net.netfilter.nf_conntrack_count sysctl net.netfilter.nf_conntrack_max
如果count接近max,说明连接跟踪表已满。可以临时调大上限:
sysctl -w net.netfilter.nf_conntrack_max=1048576
同时检查是否有大量TIME_WAIT状态的连接:
ss -s
如果TIME_WAIT过多,可以调整内核参数加速回收:
sysctl -w net.ipv4.tcp_tw_reuse=1 sysctl -w net.ipv4.tcp_tw_recycle=0 sysctl -w net.ipv4.tcp_fin_timeout=30
注意tcp_tw_recycle在NAT环境下可能造成问题,不建议开启。
服务监听状态与端口占用网络层通了之后,如果服务仍然无法访问,需要检查服务本身是否在监听正确的地址和端口。使用ss命令查看监听状态:
ss -tlnp
确认SSH、Nginx、MySQL等服务是否在预期的端口上监听。如果服务只监听127.0.0.1,外部无法访问,需要修改服务配置使其监听0.0.0.0或指定网卡IP。例如Nginx配置中listen 127.0.0.1:80会导致外部无法访问,应改为listen 80或listen 0.0.0.0:80。
另外检查端口是否被其他进程占用:
ss -tlnp | grep :80
如果端口被占用,找到对应进程并决定是否终止:
kill -9 PID
但终止前必须确认该进程不是关键业务。
抓包分析定位深层问题如果以上步骤都无法定位问题,抓包是最直接有效的手段。使用tcpdump在服务器上抓取流量:
tcpdump -i eth0 -nn -s0 -c 100 host 目标IP
观察是否有SYN包发出、是否有SYN-ACK返回。如果只有SYN没有ACK,说明对端或中间设备丢弃了包。如果连SYN都没有,说明本地路由或防火墙拦截了出站流量。抓包还可以分析TCP重传、窗口大小、MSS协商等细节,帮助判断是否因为MTU问题导致大包被丢弃。
MTU问题在云环境和VPN隧道中非常常见。可以通过ping测试大包:
ping -M do -s 1472 目标IP
如果大包ping不通但小包正常,说明路径中存在MTU限制。可以调整网卡MTU:
ip link set dev eth0 mtu 1400
或者开启TCP MSS钳制:
iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu日志与监控辅助定位
系统日志往往记录了网络故障的关键线索。检查/var/log/messages和/var/log/secure:
tail -f /var/log/messages tail -f /var/log/secure
网卡驱动异常、内核网络栈报错、SSH登录失败记录都会出现在这些日志中。如果服务器安装了监控Agent,可以查看历史网络流量、丢包率、连接数等指标,判断故障发生的时间点和趋势。
对于反复出现的网络故障,建议部署简单的监控脚本,定时检测网络连通性并记录日志。例如每分钟ping一次网关,失败时记录时间戳和路由表状态,方便事后分析。
CentOS服务器网络故障排查的核心思路是分层定位:物理层、链路层、网络层、传输层、应用层,每一层都有对应的检查命令和典型故障特征。运维人员应熟练掌握ip、ss、ethtool、tcpdump、firewall-cmd等基础工具,避免一上来就重启服务或重启服务器。只有保留现场、逐层排查,才能快速定位根因并彻底解决问题。
