- 前言
- 为什么要写这本书
- 读者对象
- 如何阅读本书
- 勘误和支持
- 致谢
- 第一部分 安全运维篇
- 第 1 章 Linux 服务器安全运维
- 第 2 章 Linux 网络安全运维
- 第 3 章 数据安全工具 DRBD、extundelete
- 第二部分 运维故障排查篇
- 第 4 章 Linux 系统运维故障排查思路
- 第 5 章 Linux 故障排查案例实战
- 第三部分 自动化运维篇
- 第 6 章 轻量级运维利器 pssh、pdsh 和 mussh
- 第 7 章 分布式监控系统 Ganglia
- 第 8 章 基于 nagios 的分布式监控报警平台 Centreon
- 第 9 章 通过 Ganglia 与 Centreon 构建智能化监控报警平台
- 第四部分 集群架构篇
- 第 10 章 高性能 Web 服务器 Nginx
- 第 11 章 高性能集群软件 Keepalived
- 第 12 章 千万级高并发负载均衡软件 HAProxy
- 第 13 章 构建高性能的 MySQL 集群系统
- 第 14 章 高性能负载均衡集群软件 HAProxy
4.4 Linux 下常见网络故障的处理思路
据统计,Linux 系统下产生的故障有 60%来自网络方面,40%来自系统本身,可见熟练解决 Linux 下的网络故障,对 Linux 运维工作有着巨大的帮助。
解决 Linux 网络问题的顺序应该是首先从 Linux 操作系统自身的底层网络开始,然后逐步向外扩展,由点及面。下面给出解决网络问题的一般流程。
1)网络硬件问题,可以通过检查网线、网卡、集线器、路由器、交换机等是否正常来确认是否由硬件问题造成网络故障。
2)检查网卡能否正常工作,可以从网卡驱动是否正常加载、网卡 IP 设置是否正确、系统路由是否设置正确等三个方面进行确认。
3)检查局域网主机之间联机是否正常,可以通过 ping 自身 IP、ping 局域网其他主机 IP、ping 网关地址等方式来确认。
4)检查 DNS 是否设定正确,可以从 Linux 的 DNS 客户端配置文件/etc/resolv.conf、本地主机文件/etc/hosts 进行确认。
5)服务是否正常打开,可以通过 telnet 或 netstat 命令检测服务是否开启。
6)检查访问权限是否打开,可以从本机 iptables 防火墙、Linux 内核强制访问控制策略 SELinux 两方面入手。
接下来就针对上面给出的解决网络问题的一般思路,详细展开讲述。
4.4.1 检查网络硬件问题
检查网络故障,首先要排除的是网络硬件设备是否存在问题,比如网线、网卡、集线器、路由器、交换机等是否正常,这些是网络正常运行的基本条件,如果发现某些设备出现故障,只需更换硬件即可解决问题。
4.4.2 检查网卡是否正常工作
(1)检查网卡是否正常加载
通过 lsmod、ifconfig 命令可以判断网卡是否正常加载,如果通过 ifconfig 可以显示网络接口(eth0、eth1 等)的配置信息,表示系统已经找到网卡驱动程序,检测到网络设备,网卡加载正常。
(2)检查网卡 IP 设置是否正确
接下来就要检查网卡的软件设定,比如 IP 是否配置、配置是否正确、确保 IP 的配置和局域网其他服务器的配置没有冲突。
(3)检查系统路由表信息是否正确
检查系统路由表状态是处理网络问题的一种很重要方法,下面通过一个简单的例子来阐述这个问题。
假如某台服务器有两块网卡,eth0 的 IP 地址为 10.10.1.239,网关为 10.10.1.254,eth1 的 IP 地址为 192.168.200.30,网关为 192.168.200.1,eth0 通过映射的方式对外提供 SSH 连接服务,而 eth1 仅供局域网主机之间共享数据使用。现在的问题是,外界无法通过 SSH 服务远程登录到此系统,而网卡加载没有问题,网卡 IP 设置也没问题,接下来看看此系统的路由设置:
[root@webserver ~]# route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 10.10.1.0 * 255.255.255.0 U 0 0 0 eth0 192.168.200.0 * 255.255.255.0 U 0 0 0 eth1 default 192.168.200.1 0.0.0.0 UG 0 0 0 eth1
到这里,问题已经基本排查出来了。
从 route 的输出可知,这个服务器的默认路由是 192.168.200.1,绑定在 eth1 网卡上,而 192.168.200 段的 IP 仅仅供局域网主机之间共享数据使用,没有对外连接的访问权限,因而,外界无法连接到 Linux 系统,也是理所当然的事情了。
定位了问题,解决方法很简单,删除 192 段的默认路由,在 eth0 网卡上添加 10 段的默认路由即可,具体操作如下:
[root@webserver ~]# route delete default [root@webserver ~]# route add default gw 10.10.1.254
此时外界就可以通过 SSH 服务远程连接到 Linux 系统了。
4.4.3 检查 DNS 解析文件是否设置正确
在 Linux 系统中,有两个文件用来指定系统到哪里寻找相关域名解析的库:分别是文件/etc/host.conf 和/etc/nsswitch.conf。/etc/host.conf 文件用于指定系统如何解析主机名,Linux 通过域名解析库来获得主机名对应的 IP 地址。下面是 CentOS 系统安装后默认的/etc/host.conf 内容:
order hosts,bind
其中,order 指定主机名查询顺序,这里表示首先查找/etc/hosts 文件对应的解析,如果没有找到对应的解析,接下来就根据/etc/resolve.conf 指定的域名服务器进行解析。
/etc/nsswitch.conf 文件是由 SUN 公司开发的,用于管理系统中多个配置文件查询的顺序。由于 nsswich.conf 提供了更多的资源控制方式,因此它现在已经基本取代了 hosts.conf。虽然 Linux 系统中默认这两个文档都存在,但实际上起作用的是 nsswitch.conf 文件。
nsswitch.conf 文件每行的配置都以一个关键字开头,后跟冒号,紧接着是空白,然后是一系列方法的列表。
例如这段信息:
hosts: files dns
表示系统首先查询/etc/hosts 文件,如果没有找到对应的解析,就会去 DNS 配置文件指定的 DNS 服务器上进行解析。
清楚了 Linux 下域名解析的原理和过程,就可以根据这两个文件的设定,确定解析的顺序,从而判断域名解析可能出现的问题。
4.4.4 检查服务是否正常打开
在一个应用出现故障时,必须要检查的就是服务本身,比如服务是否开启,配置是否正确等。检查服务是否正确打开分为两步,第一步是查看服务的端口是否打开。
例如,我们不能用 root 用户 SSH 登录 10.10.80.89 这台 Linux 服务器,首先检查 sshd 服务的 22 端口是否打开:
[root@localhostinit.d]# telnet 10.10.80.89 22 SSH-2.0-OpenSSH_4.3
这个输出表示 10.10.80.89 的 22 端口对外开放,或者说 sshd 服务处于打开状态。如果没有任何输出,可能是服务没有启动,或者服务端口被屏蔽。
也可以在服务器上通过 netstat 命令检查 22 端口是否打开:
[root@localhostxinetd.d]# netstat -ntl tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN tcp 0 0 :::80 :::* LISTEN tcp 0 0 :::22 :::* LISTEN
可以看到,22 端口在服务器上是打开的,同时,在服务器上打开的还有 3306、80 端口。
接着进行第二步检查,既然服务已经打开,就可能是 sshd 服务配置的问题,检查 sshd 服务端配置文件/etc/ssh/sshd_config,发现有下面一行信息:
PermitRootLogin no
由此可知是 SSH 服务端配置文件限制了 root 用户不能登录系统,如果需要 root 用户登录系统,只需更改为如下即可:
PermitRootLogin yes
到这里为止,我们通过对端口和服务配置文件的层层检查,最终找到了问题的根源。需要说明的是,这里的重点不是讲述如何让 root 登录 Linux 系统,而是要通过这个例子让读者学会处理类似问题的思路和方法。
4.4.5 检查访问权限是否打开
1.检查系统防火墙 iptables 的状态
当某些服务不能访问时,一定要检查是否被 Linux 本机防火墙 iptables 屏蔽了,可以通过“iptables -L”命令查看 iptables 的配置策略。例如不能访问某台 Linux 服务器提供的 WWW 服务,通过检查系统网络、域名解析都正常,并且服务也能正常启动,然后检查服务器的 iptables 策略配置,信息如下:
[root@localhost ~]# iptables -L -n Chain INPUT (policy DROP) targetprot opt source destination Chain FORWARD (policy ACCEPT ) targetprot opt source destination Chain OUTPUT (policy DROP ) targetprot opt source destination
从上面的输出可知,这台 Linux 服务器仅仅设置了预设策略,而致命的是将 INPUT 链和 OUTPUT 链都设置为 DROP,也就是所有外部数据不能进入服务器,服务器数据也不能出去,这样的设置相当于没有网络。
为了能访问这台服务器提供的 WWW 服务,增加两条策略即可:
[root@localhost ~]# iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT [root@localhost ~]# iptables -A OUTPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
这样一来,网络上的其他人就能够访问这台 Linux 服务器的 WWW 服务了。
2.检查 SELinux 是否打开
SELinux 是个系统级的安全防护工具,它可以最大限度地保证 Linux 系统的安全,但是 SELinux 有时也会给 Linux 下软件的运行带来一些问题,这些问题大部分是由于对 SELinux 不了解造成的。为了迅速定位问题,最简单的方法是先关闭 SELinux,然后测试软件运行是否正常,这不是个好方法,但是对于判断问题往往是很有用的。SELinux 是个很好的安全访问控制软件,可是对于还不能熟练运用 SELinux 访问控制策略的读者,还是建议将它暂时关闭,等到对 Linux 有了更深入的认识后,再开启 SELinux 不失为一个明智的策略。
4.4.6 检查局域网主机之间联机是否正常
通过上面 5 步的检查,Linux 系统自身的问题已经基本排除,接下来需要扩展到 Linux 主机之外的网络环境,要检查网络之间的连通是否存在故障,可以先通过 ping 命令测试局域网主机之间的连通性,然后 ping 网关,检测主机到网关的通信是否正常。
例如下面这台服务器,在这台主机上 ping 网关,输出信息如下:
[root@localhost ~]# ping 10.10.80.1 PING 10.10.80.1 (10.10.80.1) 56(84) bytes of data. 64 bytes from 10.10.80.1: icmp_seq=1 ttl=64 time=2231 ms 64 bytes from 10.10.80.1: icmp_seq=2 ttl=64 time=2292 ms 64 bytes from 10.10.80.1: icmp_seq=3 ttl=64 time=2140 ms 64 bytes from 10.10.80.1: icmp_seq=4 ttl=64 time=1910 ms
很明显,这台主机到网关的延时很长,然后继续测试局域网中的其他主机到这台服务器的 ping 状态,延时也非常长,此时基本可以判断出这台服务器的网络连接存在问题,最后更换网线后,ping 延时恢复到正常状态了,只有 0.02ms 左右。
至此,我们对排查网络故障的常见方法和思路进行了简单介绍,其实任何网络故障的出现都是有原因的,只要根据上面给出的解决问题思路逐一排查,99%的问题都能得到很好解决。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论