linux网络服务功能非常强大,在linux上可以部署Web Server、DNS Server、Mail Server、Db server、Ftp server等等,但是也由此产生了很多网络问题,据统计,在linux系统下产生的故障,有60%来自网络方面,40%来自系统本身,可见熟练解决linux下故障,对于熟练掌握linux有着巨大的帮助。
解决linux网络问题的顺序应该是首先从Linux操作系统自身的底层网络开始,然后逐步有点及面的向外扩展,网络问题的一般解决流程为:
网络硬件传输问题,可以通过检查网线是否正常,网卡、集线器、路由器、交换机等是否正常来确认是否由硬件问题造成网络故障。
检查网卡是否能正常工作,可以从网卡是否正常加载、网卡IP设置是否正确、系统路由是否设置正确3个方面进行检查确认。
检查DNS是否设定正确,可以从linux的DNS客户端配置文件/etc/resolv.conf,本地主机文件/etc/hosts进行检查确认。
服务是否正常打开,可以通过telnet或者netstat命令的方式检测服务是否开启。
访问权限是否打开,可以从本机iptables防火墙、linux内核强制访问控制策略selinux两方面入手,进行检查确认。
局域网主机之间联机是否正常; 可以通过ping自身IP,ping局域网其它主机IP,ping网关地址来确认局域网是否连接正常。
接下来,我们就针对上面给出的解决网络问题的一般思路,详细展开讲述。
1. 检查网络硬件传输问题
检查网络故障,首先要排除的是网络硬件设备是否存在问题,比如网线是否正常,网卡、集线器、路由器、交换机等是否正常,这些是网络正常运行的基本条件,如果发现某些设备出现故障,只需更换硬件即可解决问题。
2.检查网卡是否能正常工作
(1)检查网卡是否正常加载
通过lsmod、ifconfig命令可以判断网卡是否正常加载,如果通过ifconfig可以显示网络接口(eth0、eth1等等)的配置信息,表示系统已经认到了网卡驱动程序,检测到了网络设备,网卡加载正常。
(2)检查网卡IP设置是否正确
接下来就要检查网卡的软件设定,比如IP是否配置,配置是否正确,确保IP的配置和局域网其它计算机配置没有冲突。
(3)检查系统路由表信息是否正确
最后就是要检查系统的路由表设置是否正确,如果一个linux系统有两块网卡,同时两块网卡设置的IP不在一个网段,要特别注意系统路由表的设置。
例如下面这个系统的网络接口信息:
[root@webserver ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:12:3F:FF:65:24
inet addr:10.10.1.239 Bcast:10.10.1.255 Mask:255.255.255.0
inet6 addr: fe80::212:3fff:feff:6524/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:20632289 errors:0 dropped:0 overruns:0 frame:0
TX packets:20223702 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:793608426 (756.8 MiB) TX bytes:2567481473 (2.3 GiB)
Interrupt:201
eth1 Link encap:Ethernet HWaddr 00:12:3F:FF:65:25
inet addr:192.168.200.30 Bcast:192.168.200.255 Mask:255.255.255.0
inet6 addr: fe80::212:3fff:feff:6525/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:15496910 errors:0 dropped:0 overruns:0 frame:0
TX packets:8028739 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1048038084 (999.4 MiB) TX bytes:3195989266 (2.9 GiB)
Interrupt:209
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:508961 errors:0 dropped:0 overruns:0 frame:0
TX packets:508961 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:574086961 (547.4 MiB) TX bytes:574086961 (547.4 MiB)
从上面输出可知,本系统有两块网卡,分别配置不同网段的IP地址,假定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的输出可知,linux的缺省路由是192.168.200.1,而192.168.200段的IP仅仅供局域网主机之间共享数据使用,没有连接出去的访问权限,因而,外界无法连接到linux系统,也是理所当然的事情了。
定位了问题,解决方法很简单,删除192段的缺省路由,然后增加10段的缺省路由即可:
[root@webserver ~]# route delete default
[root@webserver ~]#route add default gw 10.10.1.254
此时外界就可以通过ssh服务远程连接到linux系统了。
3.检查DNS解析文件是否设置正确
在Linux系统中,有两个文件用来指定系统到哪里寻找相关域名解析的库。分别是文件/etc/host.conf和/etc/nsswitch.conf。
/etc/host.conf文件指定系统如何解析主机名,Linux通过域名解析库来获得主机名对应的IP地址。下面是RedHat Linux安装后缺省的/etc/host.conf内容:
order hosts,bind
其中,order指定主机名查询顺序,这里表示首先查找/etc/hosts文件对应的解析,如果没有找到对应的解析,接着就根据/etc/resolve.conf指定的域名服务器进行解析。
/etc/nsswitch.conf文件是由SUN公司开发的,用于管理系统中多个配置文件查询的顺序,由于nsswich.conf提供了更多的资源控制方式,nsswich.conf文件现在已经基本取代了hosts.conf,虽然LINUX系统中默认这两个文档都存在,但实际上起作用的是nsswitch.conf文件。
nsswitch.conf文件每行的配置都以一个关键字开头,后跟冒号,紧接着是空白,然后是一系列方法的列表。
例如这段信息:
hosts: files dns
表示系统首先查询主机库文件,如果没有找到对应的解析,接着会去DNS配置文件指定的DNS服务器进行解析。
清楚了linux下域名解析的原理和过程,我们就可以根据这两个文件的设定,确定解析的顺序,从而判断出域名解析可能出现的问题。
4.检查服务是否正常打开
在一个应用出现故障时,必须要检查的就是服务本身,比如服务是否开启,配置是否正确等等,检查服务是否正确打开,分为两步,第一步是查看服务的端口是否打开:
例如,我们不能用root用户ssh登录到192.168.60.133这台linux服务器,首先检查sshd服务的22端口是否打开:
[root@localhost init.d]# telnet 192.168.60.133 22
SSH-2.0-OpenSSH_4.3
这个输出表示192.168.60.133的22端口对外开放,或者可以说sshd服务是处于打开状态。如果没有任何输出,可能是服务没有启动,或者服务端口被屏蔽。
也可以在服务器上通过netstat命令检查22端口是否打开:
[root@localhost xinetd.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系统,而是要通过这个例子让读者学会处理类似问题的思路和方法。
5.检查访问权限是否打开
(1)检查系统防火墙iptables的状态
当某些服务不能访问时,一定要检查是否被linux本机防火墙iptables屏蔽了,可以通过iptables -L指令查看iptables的配置策略,例如我们不能访问某台linux服务器提供的www服务,通过检查,系统网络、域名解析都正常,并且服务也正常启动,然后检查了服务器的iptables策略配置,信息如下:
[root@localhost ~]# iptables -L -n
Chain INPUT (policy DROP)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy DROP)
target prot 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
这样以来,internet上的其他人就能访问我们的www服务了。
(2)检查selinux是否打开
在前面的章节,我们已经讲述过selinux的含义和功能,它可以最大限度地保证Linux系统的安全,但是selinux有时也会给linux下软件的运行带来一些问题,这些问题大部分是对selinux不了解造成的,为了迅速定位问题,最简单的方法是先关闭selinux,然后测试软件运行是否正常,这不是个好方法,但是对于判断问题往往是很有用的,selinux是个很好的安全访问控制软件,可是如果你还不能熟练运用selinux访问控制策略的话,还是建议将它暂时关闭,等到对linux有了更深入的认识后,再开启selinux不失为一个明智的策略。
6.检查局域网主机之间联机是否正常
通过上面5步的检查,linux系统自身的问题已经基本排除,接下来需要扩展到linux主机之外的网络环境,检查网络之间的连通是否存在故障,可以先通过ping命令测试局域网主机之间的连通性,然后ping网关,检测主机到网关的通信是否正常。
任何网络故障的出现,都是有原因的,只要我们根据上面给出的解决问题流程,逐一排查,99%的问题都能得到很好的解决。
服务器租用/服务器托管ICT一站式综合服务提供商 - 亿通网联!
转载请注明:亿通网联http://www.etomlink.com/