1、网络慢的原因:网络问题经常以两种形式出现。第一种是来自远程服务器的慢速响应,第二种是完全失去连接。网络慢的根源主要有网卡的双工和速度的不兼容、网络拥塞、不良的路由、线缆问题、电阻或电波干扰、远端服务器负载过重、DNS配置不当。连接丢失的根源主要有电源问题、远端的服务器或程序被关掉。
2、进行基本的线缆和连接测试:你的服务器只有在网卡的连接指示灯亮的时候才可以和其他设备进行通信。这个指示灯表明服务器和交换机或路由器的连接是正常的。在大多数情况下,网络不通是因为用了错误的线缆所致。有两种线缆,即直通线和交叉线。一定要确保你使用了正确的线缆。其他的一些原因包括线缆坏了、服务器连接的交换机或路由器停掉了、线缆没有插好等。如果你有外网,投资买一个电池驱动的线缆测试仪是非常值得的。市面上一些好的模型可以告诉你线缆坏的大概位置以及用的线缆是否过长。
3、测试你的网卡(NIC):在排障的过程中,从命令行监视你网卡的状态是一个很好的习惯。主要的命令如下:
(1)查看你激活的网卡:ifconfig命令不加任何参数会显示你系统上活动的网卡。那些没有激活的网卡将不会被显示。注意,那些被激活但没有连接的网卡也会被显示。
(2)查看所有的网卡:ifconfig -a会显示所有的网卡设备,不管他们是否被激活。那些没有被系统管理员激活或没有使用的网卡将不会显示ip地址这一行,同时UP这个词也不会在第二行的输出中显示。
(3)DHCP的考虑:注意DHCP客户端在与DHCP服务器通信之前,会自动地把网卡的IP配置为169.254.x.x(主要是Windows的客户端会这么做)。当与DHCP服务器的通信建立后,它们会把IP地址重新配置为从DHCP服务器那获取的值。可见,一个最终具有IP地址169.254.x.x的网卡表明与DHCP服务器通信失败,这时要检查你的线缆、路由和DHCP服务器的配置,以修复这个问题。
(4)测试连接的状态:mii-tool和ethtool这两个命令会提供一个连接状态和双工设置的报告。mii-tool不加任何参数会提供一个简短的报告。当加上-v这个参数时,因为它提供了关于网卡是否支持全自动等更详细的信息,这在解决网络速度和双工等排障的过程中非常有用。ethtool命令相对mii-tool命令提供了更详细的信息,尤其是mii-tool可能将来在linux中不再得到支持的情况下,ethtool应该成为你的不二选择。
(5)查看网卡的错误信息:错误是网络慢的常见标志,这可能是由不合适的网卡配置和带宽的过度利用造成的。只要在可能的情况下这都应该得到纠正。超过0.5%的错误率会导致显著的缓慢。ifconfig命令显示内容如下:
eth0 Link encap:Ethernet HWaddr 00:21:86:5a:a6:56
inet addr:192.168.0.207 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::221:86ff:fe5a:a656/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:28570 errors:0 dropped:0 overruns:0 frame:0
TX packets:27052 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:22209604 (21.1 MB) TX bytes:5918517 (5.6 MB)
Base address:0x1840 Memory:fe000000-fe020000
第一行:网卡类型、MAC地址;
第二行:网卡的IP地址、广播地址、子网掩码;
第三行:网卡的IPv6地址;
第四行:网卡的最大传输单元、度量值(这里为跳数),按照惯例,度量值供某些操作系统所用,用于计算一条路由的成本;
第五至八行:RX和TX分别表示接收和传送的数据包。这里显示了错误(error)、超载(overrun)、载波错误(carrier)、丢失(dropped)的包数量。如果你的网卡已经完成配置却还是无法与其它设备通信,那么从RX和TX的显示数据上可以简单地分析一下故障原因。在这种情况下,如果你看到接收和传送的包的数量(packets)增加,那有可能是系统的IP地址出现了混乱;如果你看到大量的错误(errors)和冲突(Collisions),那么这很有可能是网络的传输介质出了问题,例如网线不通或hub损坏。
第九行:网卡的中断基地址和I/O地址,这是非常重要的硬件配置信息。如果您的网卡是PCI 的,那么Linux在引导时有可能会自动配置这些信息(也很有可能会让您手工配置)。
ethtool命令当加上-S参数时提供了更详细的信息。netstat命令是有非常多用途的命令,当加上-i参数时可以提供一个网络接口的简短报告。这在系统缺少mii-tool和ethtool工具时是非常有用的。
(6)以太网帧错误的可能原因:
帧冲突:当网卡在探测自己(通过发送帧)的同时,LAN上的另一个台服务器尝试数据通信,就会导致帧冲突。冲突是以太网操作中希望有的部分,但通常在所有发送的帧中发生冲突的不会超过0.1%。高的帧错误率更有可能是因为有缺陷的网卡或线缆导致的。帧冲突有单一冲突(帧在发生一次冲突之后再次发送时成功)、多次冲突(帧在传送成功之前发生多次冲突)。
CRC校验错误:帧传送出去了,但是在中途被损坏了,这通常是线缆的电噪音导致的。确保你使用了正确类型的线缆、线缆没有损坏、连接器连接牢固。
FIFO和超载错误:由于硬件的老化或本身能力的限制,使得网卡把数据递交到内存缓冲区中的速度跟不上数据传输到网卡的速度,这会导致流量超载,从而引发帧错误。
帧长错误:接收到帧长度小于或大于以太网标准。在不兼容的双工模式设置下这种情况出现地比较频繁。
载波错误:由于网卡丢失了与hub或switch的连接而导致。检查一下有缺陷的线缆或接口。
4、查看MAC地址:当丢失连接时,查看一下服务器的ARP表可以帮你确定远程服务器的网卡是否响应你的Linux主机的任何类型的流量。在这个级别上丢失连接,主要的原因有服务器断开了与本网络的连接、线缆问题、网卡没有激活或者服务器关闭、远程服务器运行了防火墙软件(例如iptables,可用service iptables stop来关闭它)或Windows XP内建防火墙。这种情况下,你可以查看MAC地址。可能服务器正在运行正确的软件,但希望的连接在同一个网络内的客户端没有出现。可以登录到服务器,用ifconfig -a查看到网卡的MAC地址和IP地址信息。arp -a命令可以显示服务器ARP表中的MAC地址,以及其他直接连接到网络的服务器。
5、用ping测试网络的连通性:ping向目标地址发送ICMP echo包,请求它回送ICMP echo-reply响应包。如果没有ping通,可能原因有不存在这个IP地址的服务器、服务器被配置为不响应ping、网络路径上有防火墙或路由器阻止ICMP通信流、不正确的路由、源设备或目标设备有不正确的IP地址或子网掩码。检查本地和远程服务器、以及它们之间的所有服务器的路由表和子网掩码。不正确路由的一种常见情形就是仅仅能ping通本地网络上的服务器,而其他的服务器则不行。使用traceroute来查看路径是否正确。
在ping时,如果你收到一条"Destination Host Unreachable"的消息,这是你本网的服务器或路由器发送的,它知道目标IP地址位于一个有效的网络中,但目标服务器没有给出响应。如果你是ping一个直接连接在本地网络上的主机,则可能的原因有客户端或服务器被关闭或者断开了与网络的连接、你的网卡没有设置正确的双工模式(可用用mii-tool来检查一下)、你用错误的线缆类型把你的Linux主机连接到了网络(有两种基本的线缆,即直通线和交叉线)、在无线网的情况下你的SSID或加密密码不正确等。如果你是ping一个远程网络上的主机,则可能的原因是你的网络设备在路由表中没有一个到目标网络的路由,这样本网络设备会自动回送一个ICMP响应(响应类型为3),从而触发了这样的消息,这个消息可能是"Destination Host Unreachable",或者"Destination Network Unreachable"。
6、用telnet测试网络的连通性:telnet默认在tcp 23号端口上进行连接,但你可以使用其他的tcp端口,只要在目标IP地址后指定这个端口即可,比如telnet 192.168.1.100 22。telnet可以用来测试到远程PC或服务器的连通性、测试服务器自己的连通性(只要连接到loopback地址即可,如果装了防火墙,则连接你希望的TCP端口时可能会被阻止)、测试同一网络上的另一台服务器到目标服务器的连通性,这可以排除防火墙的影响。
telnet连接被拒绝:可能你测试的应用程序在远程服务器没有启动,或者有防火墙阻止并拒绝连接。
telnet连接超时或挂起:目标网络上的远程服务器不存在或已关闭、防火墙阻止连接从而导致超时(而不是迅速地拒绝)。
7、用curl和wget测试Web站点:只使用浏览器来测试Web站点的性能有时并不能分析出Web服务器慢的根源。许多有用的HTTP错误码通常不会在浏览器中显示,这使得的诊断变得很困难。一个更好的工具组合是用telnet测试你的站点的tcp 80号端口,并结合Linux curl和wget HTTP工具来传输数据。TCP响应时间快而curl和wget响应时间慢,通常意味着这不是网络的问题,而是因为Web服务器或任何产生Web页面的程序或数据库的配置有问题,导致站点浏览非常慢。
curl就像一个基于文本的Web浏览器,你可选择查看Web页面的头部和HTTP状态码(使用-I选项),或者查看Web页面的整个HTML源代码(使用-i选项),两者都可以提供一个关于服务器性能的测试。比如curl -I www.sina.com,当返回200 OK的状态码时,初步表明Web服务器工作正常。wget可以用来递归地下载一个站点的Web页面(包括站点的整个目录结构)到本地用户主目录。通常不使用递归下载,而是使用一个时间戳(即-N选项),你不仅能Web站点的index页面的HTML内容,还可以看到下载速率、文件大小、精确的下载开始和结束时间。这提供了一个获取服务器性能快照的简单方法。比如wget -N www.csdn.net。
8、用netstat确定问题根源:-an选项列出机器上激活的所有TCP,UDP连接,这可以帮助你确定网络慢是不是因为高的运输量所致。许多TCP连接被创建为永久的连接,HTTP连接则不同,因为它会在Web服务器预定义的time_wait时间超时后被关闭,因此注意这些短生存期的连接是一个好主意。你可以用sudo netstat -an | grep tcp | egrep -i 'established|time_wait' | wc -l来统计出已建立的短生成期的TCP连接个数。
9、iptables防火墙:很多时候服务连接问题的一个意想不到的根源就是iptables防火墙。在RedHat/Fedora中iptables默认已安装,并且通常只允许有限范围内的流量通过。如果网络出现问题,通常要看一下iptables的配置。你可以通过/etc/init.d/iptables脚本来启动、重启或关闭iptables防火墙。可以用service iptables status来查询iptables是否正在运行。
10、用traceroute测试网络的连通性:Windows下对应的命令为tracert。它显示你的服务器和目标服务器之间的经过的所有路由器跳,这可以帮助你确定两端之间的路由是否正确。traceroute使用UDP协议。
返回的消息码含义:
* * *:超过了5秒的响应时间。可能的原因有路径上有路由器不能发送ICMP超时消息、路径上有路由器或防火墙阻止ICMP超时消息、目标IP地址没有响应。
!H,!N,或!P:主机、网络、或协议不可达。
!X或!A:通信被禁止,比如路径上有路由访问控制表(ACL)。
!S:源路由失败。源路由会强迫traceroute使用某一条路径,失败可能是由于路由安全设置的原因。
一些设备会在它们的接口上阻止traceroute包,但允许ICMP包,因此常用-I选项来强迫traceroute使用ICMP包,这时"* * *"状态消息就会消失。traceroute显示了各跳路由器的响应时间(以毫秒ms为单位),注意响应时间慢并不表明就一定存在网络拥塞、延迟或包丢失的现象,因为许多路由设备只会给traceroute流量一个很低的响应优先级,这样有利于降低网络负载。
traceroute在目标服务器的前面一台路由器处终止响应:这只会在这台路由器是服务器的默认网关时才会发生。这并不是路由器的问题,而是服务器的问题。可能有服务器有一个不正确的默认网关、服务器上运行了防火墙软件并阻止traceroute、服务器与网络断开,被关闭或网卡配置不正确等。
11、用mtr检测网络拥塞:mtr会实时地重复进行traceroute,它动态地显示到目标地址的traceroute路径上每一跳的往返时间。一个好的特性是它能以毫秒为单位显示最好、最差和平均的往返时间。这不仅能够让使你看清那一跳比较慢,也能让你查觉它们什么时候开始变慢。当你怀疑网络有间断性的拥塞时,可以使用这个工具来进行诊断。
12、查看网络数据包:可使用的抓包工具比较多,应用比较广泛的有tcpdump, tshark, wireshark图形界面软件包等。通过查看网络数据包,可以分析出网络中的很多问题,当然这需要对各种协议的包格式非常熟悉。
13、用nslookup进行DNS诊断:nslookup可以查询一个域名的服务器的IP地址,或者反向查询,即通过IP地址来查询它对应的域名。比如nslookup www.csdn.net。也查询域名和IP地址的关联性,比如nslookup www.csdn.net 203.81.21.61。注意在将来的Linux版本中,nslookup可能会被移除,而用host命令代替。
14、用nmap检测网络的漏洞:nmap是一个强大的端口扫描工具,你可以用它来确定目标主机上的各个TCP/IP端口状态,哪些被打开、哪些被关闭、端口上运行的是什么服务、主机的MAC地址等。在家庭环境中它通常用的比较少,但是在公司环境中它可用来检测你的网络漏洞,比如服务器正在运行一个未授权的网络应用。它是不怀好意的网上冲浪者喜欢的一个工具,因此它应该在你的控制下用于测试外部和内部的服务器。
-P0:指定在扫描前先ping一下目标主机。
-T:设置端口扫描期间包与包之间的定时模式,有一些防火墙能在一个预定义的时间范围内检测到大量的非标准包的到达,这个选项的值设为5时表示迟钝模式,定时间隔为60秒;值为0时表示偏执狂模式,定时间隔为0.3秒。
-O:将检测目标主机的操作系统类型(基于各种类型数据包的众所周知的响应)。
-p:列出要扫描的TCP/IP端口范围。不使用些选项则扫描所有端口。
-s:定义各种扫描方法,或者使用遵循TCP/IP标准的包,或者使用不遵守TCP/IP的包。
-A 侵略式的扫描选项。目前它激活了OS探测(-O)、版本扫描(-sV)、脚本扫描(-sC)、以及traceroute(--traceroute)。
例如,对主机192.168.0.230,使用有效的TCP连接(-sT)、迟钝模式(-T 5)来扫描1-7100号的端口,并进行侵略式的扫描。
$ sudo nmap -A$ sudo nmap -A -sT -T5 -p1-7100 192.168.0.230
Starting Nmap 4.53 ( http://insecure.org ) at 2009-10-25 22:59 CST
Warning: Traceroute does not support idle or connect scan, disabling...
SCRIPT ENGINE: rpcinfo.nse is not a file.
SCRIPT ENGINE: Aborting script scan.
Interesting ports on 192.168.0.230:
Not shown: 7090 filtered ports
PORT STATE SERVICE VERSION
80/tcp open http?
139/tcp open netbios-ssn
445/tcp open microsoft-ds Microsoft Windows XP microsoft-ds
2869/tcp closed unknown
3389/tcp closed ms-term-serv
5800/tcp closed vnc-http
5900/tcp closed vnc
6002/tcp open http Safenet Sentinel License Monitor httpd 7.3
7001/tcp open afs3-callback?
7002/tcp open afs3-prserver?
1 service unrecognized despite returning data.
MAC Address: 00:11:11:06:96:90 (Intel)
Device type: general purpose
Running (JUST GUESSING) : Microsoft Windows XP|2000|2003 (90%)
Aggressive OS guesses: Microsoft Windows XP SP2 (90%), Microsoft Windows XP SP2 (firewall disabled) (87%),
Microsoft Windows 2000 SP4 or Windows XP SP2 (86%), Microsoft Windows 2003 Small Business Server (86%), Microsoft Windows XP Professional SP2 (86%), Microsoft Windows Server 2003 SP1 or SP2 (85%), Microsoft Windows XP Professional SP2 (firewall enabled) (85%)
No exact OS matches for host (test conditions non-ideal).
Network Distance: 1 hop
Service Info: OS: Windows
OS and Service detection performed. Please report any incorrect results at http://insecure.org/nmap/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 142.397 seconds -sT -T5 192.168.0.230
噢!这个工具相当可怕!!!
15、用netcat测试网络带宽:netcat(或nc)就像一把瑞士军刀,它可以创建一个TCP或UDP套接字来进行数据传输。-l选项指定程序应该侦听,而不是对话,后面要跟着套接字的端口。常用的命令形式有
sudo nc -l 192.168.0.230 5800 # 侦听主机192.168.0.230上的TCP 5800端口
sudo nc -l 7777 > myapp-i386.iso # 从端口7777上接收数据并输出到myapp-i386.iso文件中
cat /tmp/myapp-i386.sio | nc 192.168.0.230 7777 # 读取文件中的数据,并写入到远程主机的TCP 7777号连接上
如果你不想存储接收到的数据,可重定向到/dev/null。如果你只想向远程主机写入随机的数据,可以从/dev/random中读取并写入到远程主机。netcat是一个很好的带宽测试工具,它可以支配网卡的数据容量。不幸的是,它没有提供数据传输的统计信息,你可以使用其他的一些工具(例如mrtg)来获取这些信息。
16、确定攻击源:有时你意识到系统可能正在遭受拒绝服务攻击,这有可能一些不怀好意的用户或只是某个人正在用wget命令快速地下载你的Web站点上的所有页面。主要的症状包括用netstat命令看到一大堆建立的连接、或者在防火墙及Web服务器的日志中看到一大堆的条目。有时攻击的形式并不是你的服务器能够处理的稳定常量形式,而是你不能处理的,比如e-mail SPAM。ISP通常对SPAM的抱怨非常敏感,但虽然你有它的IP地址,一个traceroute不会提供任何与ISP的连接信息。有时DNS查询也不足以确定是谁拥有这个犯罪的IP地址,你需要另外的工具。一个更好的方法是使用whois命令,后跟一个IP地址或DNS域名,它将提供给需要的管理信息给你,以便你能够搜索可能的攻击源。
17、确定谁使用了我的系统:知道谁登录了你的Linux主机总是非常重要的。这不仅可以让你跟踪不怀好意的用户,还能描述谁犯了错误,导致系统崩溃,或者由于httpd.conf文件中的一个印刷错误而导致Apache崩溃。主要命令有last和who。