目前Linux的擅长应用领域是:单一应用的基础服务器应用,譬如DNS、Web服务器、NFS服务器、防火墙、文件服务器、代理服务器、中小型数据库。Linux网络故障大多与服务器配置有关。下面我们介绍一下故障排除步骤。
一、 Linux网络故障之网卡故障
Linux的网络实现是模仿FreeBSD的,它支持FreeBSD的带有扩展的Sockets(套接字)和TCP/IP协议。它支持两个主机间的网络连接和Sockets通讯模型,实现了两种类型的Sockets:BSD Sockets和INET Sockets。它为不同的通信模型和服务质量提供了两种传输协议,即不可靠的、基于消息的UDP传输协议和可靠的、基于流的传输协议TCP,并且都是在IP网络协议上实现的。INET sockets是在以上两个协议及IP协议之上实现的。它们之间的关系见图1所示。
掌握Linux TCP/IP的网络模型(见图-2所示),掌握OSI网络模型、TCP/IP模型及相关服务对应的层次对于Linux网络故障分析与排除是非常重要的。据统计,Linux网络故障有35%在物理层、25%在数据链路层、10%在网络层、10%在传输层、10%在对话、7%在表示层、3%在应用层。由此可以看出,网络故障通常发生在网络七层模型的下三层,即物理层、链路层和网络层。对应于实际网络也就是使用的网络线缆、连接模块、网卡、交换机、路由器等设备故障。这些故障可能因为硬件的质量或性能、磨损老化、人为误操作、不正确的网络协议设置、管理问题、Linux软件的BUG、系统受到黑客攻击和Linux病毒等原因造成。OSI的层次结构为网管员分析和排查故障提供了非常好的组织方式。由于各层相对独立,按层排查能够有效地发现和隔离故障,因而一般使用逐层分析和排查的方法。
说明:我们把OSI七层模型和Linux TCP/IP四层网络模型对应,然后将各种网络协议也规档,这样有利于网络故障的排除。
1、物理层:
物理层的故障一般很好理解,所以把链路和物理层放在一起,对应TCP/IP概念层的网络接口。对应协议主要是:Enternet、FDDI 、和只要能传输IP数据报(Datagram)的任何协议。
2、网络层:
网络层对应Linux TCP/IP概念层的网际层,,网络层协议管理离散的计算机间的数据传输,用户一般注意不到,如IP协议为用户和远程计算机提供了信息包的传输方法,在机器IP地址和其它信息的基础上,IP确保信息包能正确地到达目的机器。这一过程中,IP和其它网络层的协议共同用于数据传输,如果没有使用一些监视系统进程的工具,用户是看不到在系统里工作着的IP的。网络嗅探器Sniffers就是能看到这些步骤的一个装置(它可以是软件,也可以是硬件),它能读取通过网络发送的每一个包,即能读取发生在网络层协议的任何活动,因此网络嗅探器sniffers会对安全造成威胁。重要的网络层协议包括:ARP(地址解析协议)、ICMP(Internet控制消息协议)、IP协议(网际协议)、TCP(传输控制协议) 等。
3.传输层
传输层对应Linux TCP/IP概念层的传输层。传输层 提供应用程序间的通信。其功能包括:一、格式化信息流;二、提供可靠传输。为实现后者,传输层协议规定接收端必须发回确认,并且假如分组丢失,必须重新发送。传输层 包括TCP(Transmission Control Protocol,传输控制协议)和UDP(User Datagram Protocol,用户数据报协议)是传输层中最主要的协议。TCP建立在IP之上,定义了网络上程序到程序的数据传输格式和规则,提供了IP数据包的传输确认、丢失数据包的重新请求、将收到的数据包按照它们的发送次序重新装配的机制。TCP 协议是面向连接的协议,类似于打电话,在开始传输数据之前,必须先建立明确的连接。UDP也建立在IP之上,但它是一种无连接协议,两台计算机之间的传输类似于传递邮件:消息从一台计算机发送到另一台计算机,两者之间没有明确的连接。UDP不保证数据的传输,也不提供重新排列次序或重新请求功能,所以说它是不可靠的。虽然UDP的不可靠性限制了它的应用场合,但它比TCP具有更好的传输效率。
4、网际层
应用层、表示层和会话层对应Linux TCP/IP概念层中的网际层。应用层位于协议栈的顶端,它的主要任务就是应用了。一般是可见的。如利用FTP(文件传输协议)传输一个文件请求一个和目标计算机的连接,在传输文件的过程中,用户和远程计算机交换的一部分是能看到的。常见的应用层协议有:HTTP、FTP、Telnet、SMTP、Gopher等。这是Linux网络设定最关键的一层。Linux服务器的配置文档主要针对应用层中的协议。
查找故障原因的思路
首先你要绘制一个正确的网络拓扑结构图,见图-2。
丛图-2中可以看出这是一个典型的中型Linux异构以太网络。包括文件服务器、邮件服务器、打印服务器、FTP服务器、Web服务器、安全方面使用NAT防火墙。网络节点在300个左右,对于这个网络故障应当丛网络硬件传输问题开始,然后检查软件设定问题。
网络硬件传输问题
网络硬件传输问题引起的故障主要指连通性故障。
(1)网络线缆
在图-3中可以发现,网络接口设备中使用最多的是网络线缆 。由于网络线缆 经常接在墙角和门缝处,有可能被压坏。所以,需要注意网线是否因被截断、网线过度扭曲变形、自制网络接头(如RJ-45跳线头)品质不良造成讯号不良;网络接头与设备(如集线器、路由器、交换机)接触不良等。网络线缆的检测通常使用网络线缆测试仪。顾名思义,它主要用于测试目前大家常用的遮敝式双绞线、非遮敝式双绞线及同轴缆线等。一般来讲网络线缆测试仪都有侦测缆线错误状态功能,网线是否开路,是否短路以及相反、交叉、分离等即可就可辨别,同时在一定的范围内还可量测缆线的长度,更主要的是用它来核对双绞线末端到末端连接是否符合 EIA/TIA 568商业建筑电信布线标准。
(2)网卡、集线器、路由器、交换机、ADSL调制解调器等网络硬件设备
1、网卡不稳定、品质不佳,或者与整体系统的兼容性不佳; 各网络设备的接触不良,造成讯号衰减; 网络设备使用方法不良,造成设备功能衰减等都会造成传输问题。网卡的检测可以通过网卡的Link灯代表网线的好坏或者与Hub的连接是否正确,网卡的100M灯代表是否是100M连接。
2、好的路由器、交换机一般都有液晶的小条,实时显示运行状态,可以从中看出设备的故障情况。大部分网络设备的物理层的信息虽然标识一样,但在细节上很不相同,需要仔细研读产品说明书来了解。 另外可以在交换机上观察各以太口上获得的MAC地址来判断故障。链路层的信息一般和物理层的信息交织在一起,除非出现误码率高和设备运行状态不稳定等,都不需要对链路层进行排障。
3、ADSL调制解调器:
POWER: 当ADSL路由器接上电源后,电源LED指示灯会亮起。如果LED指示灯熄灭的话,请检查您的电源接线是否正确。STATUS: 当ADSL Modem与局端设备握手时会闪烁,连线后会常亮。LINE 当广域网线路联通时,指示灯会亮起;在线路有数据传送时会闪烁。PC 局域网联机LED指示灯。当联机上以太网时,此灯会亮起;在未连接以太网时,此灯是熄灭的。以太网有数据传输时闪烁。
TEST 测试用,常灭。
(3) 网络设备配置的规则
各个网络设备的配置都是有规则的。太长的网络线会造成讯号的衰减,导致网络联机的时间太长甚至无法联机。 例如100兆以太网要遵守5-4-3-2-1网络标准:5-最多有5个网段且干线总长最大为2469m。4-最多连4个中继器。 3-其中3个干线段上连工作站,一个干线最多100个工作站,中继器相当于一个工作站,干网的每一端均需50欧姆的端界器,其中一个必须接地。2-有两个网段只用来扩长而不连任何工作站,1-由此组成一个局域网,工作站到收发器最大距离50m,收发器最小间距2.5m。
(4)UPS电源
UPS电源是一个容易被忽视的环节。由于路由器、交换机、基带式“猫”等网络设备对电压和接地都非常敏感,因此,对于这些网络,应当使用性能优良的在线式UPS作为供电电源,对于服务器10个以上,节点在300个以上的中型网络最好使用10000W功率以上的,从而可以将所有的网络设备都连接在同一电源,避免不同设备间的电压差别。此外,机房和机柜要有非常好的接地措施,并为所有设备建立一条地线保证接地电压相同,确保网络设备正常进行。
软件问题
(1)网卡的IP地址设定错误
网卡是Linux网络中的最常用设备,通常Linux服务器要安装两块以上网卡。网卡IP地址的设定不当是导致网络故障的最常见原因。例如,同一个IP在同一个网段中出现造成IP冲突、子屏蔽网络设定错误等。
(2)路由问题(Router)
这方面的问题出在网关的设定错误,或者是路由设定不正确,导致资料封包没有办法顺利地送出去。路由器是
(3)网络负荷问题(Loading)
当黑客对网络实施拒绝服务攻击时,同时有大量的信息包涌服务器或交换机和路由器,就有可能造成网络的停顿甚至挂起。Linux的网络安全是一个比较敏感的话题,一直有两种对立的观点。笔者是一个Linux坚定的支持者,从一个客观的角度来说:Linux是存在安全问题的。这里引用IBM的Linux安全专家“Jeff Crume” 在他的新书 – “What Hackers Don’t Want You to Know ”的话:Defaults are dangerous- 缺省安装时危险的。所以许多Linux网络故障是由于Linux服务器遭到系统攻击或感染Linux病毒引起的。
(4)其它
防火墙是Linux网络安全的关键部件,能够探测和阻挡的攻击。以Redhat Linux为例安装时已经内至三种不同级别(标准、高、Higher)的防火墙。有时候选择最高级别防火墙会让一些网卡端口被防火墙挡住了,造成无法执行某些网络资源。另外Linux内核存在的漏洞问题;应用程序中BUG;以及不同的操作系统的兼容性问题;设备驱动的缺少也是发生Linux网络故障的原因。
Linux网络故障的解决问题的思路
Linux网络故障排除应当遵循先硬件后软件的方法。因为硬件如果出现物理损坏那么如何设定网络都不能解决故障。解决问题的方法可以从自身Linux计算机的网卡查起,然后到服务器、集线器、路由器等硬件。如果确定硬件没有问题了,再来考虑软件的设定。
1、检查网卡工作状况
(1)使用cat /proc/modules查看网卡的模块是否已被加载,驱动硬件是操作系统最基本的功能,操作系统通过各种驱动程序来驾驭硬件设备,和Windows系统不同Linux内核目前采用可加载的模块化设计(LKMs Loadable Kernel Modules),就是将最基本的核心代码编译在内核中,而我们常见的驱动程序就是作为内核模块动态加载的,比如网卡驱动。Windows系统中我们一般“控制面板”的“设备管理器”查看硬件列表,在Linux中可以在命令行下输入:cat /proc/modules 即可显示Linux系统检测到的所有硬件设备。
(2)使用Ifconfig-a命令检查网卡接口
如果已经检测到网卡,网卡硬件就没有问题,接下来检查网卡的软件设定。
(3)编译网卡
如果Linux内核没有检测到网卡通常要重新安装网卡的驱动程序,网卡驱动程序安装方法步骤如下:
a、 编译并安装模块;
b、 修改/etc/conf.module 文件;
c、 修改/etc/sysconfig/network文件;
d、 修改/etc/sysconfig/network-scripts/ifcfg-eth0 文件;
e、 给网卡添加IP地址:打开网卡IP地址配置文件/etc/sysconfig/network-script/ifcfg-eh0.
文件内容是:
DEVICE=eth0 BOOTPROTO=none BROADCAST=192.168.1.255 IPADDR=192.168.1.12 NETMASK=255.255.255.0 NETWORK=192.168.1.0 ONBOOT=yes USERCTL=yes PEERDNS=no GATEWAY=192.168.1.1 TYPE=Ethernet
f、然后用以下命令启动网络服务:
#service network restat
说明网卡问题:使用ifconfig来进行配置。如果运行ifconfig,将会给出所有已经安装了的网卡。如果没有显示可用的网卡,那么很有可能是以下原因之一:1. 网卡没有被Linux检测到;2. 没有与之相应的内核模块;3. 该模块没有被加载;4. Linux系统不支持你的网卡。就现在来说,出现问题4的可能性很小,一般来说都是问题2和3,也可能是1。
Linux下无线网卡的安装顺序一般是:
采取全部安装方式安装Linux发行版本,重新编译内核,并除去任何对内核提供的 PCMCIA 驱动程序的部分。
了解网卡的规格并且下载并编译相应的 PCMCIA-CS 库和驱动程序
下载、编译并安装无线网卡必需的所有驱动程序。这一步骤对于有些网卡是可选的,而对于有些网卡是必须执行的。做与不做很大程度上取决于您所选的无线网卡。
修改和无线网卡的相关设定。从新启动Linux系统和网络。
2、 Ping 127.0.0.1 验证本机TCP/IP协议是否安装
Linux中一个概念:封闭回路。使用TCP/IP协议的Linux计算机,都会拥有一个IP地址,彼此间相互以IP地址确认对方,传递信息与数据。
3、确认局域网内网络连接情况
网卡设定确认没有问题之后,接下来要确认局域网内网络连接情况。根据图-2网络拓扑结构,对集线器1组成的局域网的要求有下面几点:
(1)客户机IP的设定
假设子网为192.168.1.0/24,那么局域网内所有计算机的IP应该介于192.168.1.1~192.168.1.254,且所有的计算机子屏蔽网络均为255.255.255.0,IP在所有的计算机都不可以重复。
(2)网关
假设Linux IP为192.168.1.2,那么局域网内所有客户机的网关是192.168.1.2 。
(3)Windows端的通信协议
局域网内其它的Windows系统的通信协议仅需要TCP/IP及NetBUEI即可,如果安装过多的通信协议可能会造成联机过慢。
(4)Windows 端工作组与计算机名称
假如需要资源共享,那么就必须在Windows系统中建立文件共享,并且所有的计算机工作组必须相同,但计算机名称不能相同。
二、 Linux网络故障之常见服务器故障(DNS;WEB;NFS;防火墙;文件服务器;代理服务器;中小型数据库)
1、DNS服务器故障排除
Linux域名服务器使用的是Bind9版本。域名服务器包含数据库的部分段的信息,并可提供被称之为解析器的客户来访问。如果在Linux网络中无法进行域名解析,很可能是没有在本地指定有效的域名服务器,通常这种情况比较常见。大多数DNS故障是因为配置文件的语法错误,或者是对计算机分配了错误的地址造成的。当进行DNS故障诊断时,可参照下面的步骤:
(1)对全部记录检查和确认主机名称的拼写,记住绝对地址是以“.”结尾的。
(2)如果在区文件中做了任何修改,务必修改SOA记录中的序列号,这将保证服务器正确地重新上载文件。
(3)确定输入到主区的名称和IP地址匹配反向指针文件中的反向指针信息。
(4)检查防火墙相关程序。
2、Apache服务器故障排除
Apache源于NCSAhttpd服务器,经过多次修改,成为世界上最流行的Web服务器软件之一。如果在使用Apache服务器出现问题的时候,你可以尝试下面几个步骤:
(⒈)查看错误日志
错误操作细节将写到服务器的错误日志里面,这些信息经常足够你诊断并修复错误(比如文件权限之类的)。错误日志缺省是在/usr/local/apache.logs/error_log,但是你可以通过设置Apache配置文件里面的ErrorLog项来修改它的位置。
(⒉)查看FAQ
在Apache主站点的页面上可以找到最新的FAQ的连接,这些FAQ里面列举了一些常见问题。一般FAQ位于http://httpd.apache.org/docs/misc/FAQ.html。
(⒊)查看Apache的Bug数据库
Apache的开发组在Bug数据库(http://bugs.apache.org/)里面存放了使用者报告的Bug,可以到里面查找你的问题是否已经列举在里面。如果关于此问题的报告还处于开放状态,那么建议你周期性地查看它。你也可以考虑给问题的提交者发信,因为关于这个问题的一些讨论可能是通过信件交流的。
(⒋)使用相关的邮件列表或者新闻组
很多问题之所以从未被添加到Bug数据库里面,是因为它们已经在邮件列表和新闻组里面频繁出现了。你可以到http://httpd.apache.org/userslist.html或者news:comp.infosystems.www.servers.unix获取这些信息。
(⒌)若以上方法全部失败,那么请到Bug数据库里面去报告一下这个问题。
3、NFS服务器故障检查和排除
网络文件服务器(Network File System,简称NFS),是分布式计算系统的一个组成部分,可实现在异种网络上共享和装配远程文件系统。NFS由Sun公司开发,目前已经成为文件服务的一种标准(RFC1904,RFC1813)。其最大的功能就是可以通过网络,让不同操作系统的计算机可以共享数据,所以也可以将它看做是一个文件服务器。
NFS网络出现了故障,可以从以下几个方面着手检查:
(1) 检查NFS客户机和服务器的负荷是否太高,Server和Client之间的网络是否正常;
(2) 检查/etc/exports文件的正确性;
(3) 必要时重新启动NFS或portmap服务;
(4)运行下列命令重新启动portmap和NFS:
service portmap restart service nfs start
(5) 检查Client上的mount命令或/etc/fstab的语法是否正确;
(6) 查看内核是否支持NFS和RPC服务。
普通的内核应有下列选项:
CONFIG_NFS_FS=m CONFIG_NFS_V3=y CONFIG_NFSD=m CONFIG_NFSD_V3=y CONFIG_SUNRPC=m
这里可以使用常见的网络连接和测试工具ping、tracerroute来测试网络连接及速度是否正常。网络连接正常是NFS能起作用的基础。 rpcinfo命令用于显示系统的RPC信息,一般使用-p参数列出某台主机的RPC服务。用rpcinfo-p命令检查服务器时,应该能看到portmapper、status、mountd nfs 和nlockmgr。用该命令检查客户端时,应该至少能看到portmapper服务。
常见问题解决方法:
当mount NFS文件系统时,如果错误信息是“Permission denied”,则表示NFS服务器不让客户机挂接。一般可以用更改服务端上的/etc/exports文件来解决问题,使用exportfs-rv命令重新导出文件系统。
如果出现的错误是“Program not registed”,那么则是NFS服务可能没有启动或者运行不正常。最常用的解决方法是重新启动NFS服务。
如果出现“RPC:Unable to receive”,则可能是服务端没有启动portmap服务;如果已经启动了,则可能是被防火墙所屏蔽。
还有一种情况是mount文件系统的时候,客户端没有任何反应,这多半是因为客户端没有启动portmap服务。
4、Samba文件服务器故障排除
在Linux异构网络,利用Linux建立文件服务器是一个很好的解决方案。针对企业内部网中的绝大部分客户机采用Windows的情况,我们可以通过使用Samba来实现文件服务器功能。 Samba是在Linux及Unix上实现SMB(Server Message Block)协议的一个免费软件,由服务器及客户端程序构成。这里我们只介绍服务器程序。我们首先介绍一些SMB协议的情况。SMB协议是建立在NetBIOS协议之上的应用协议,是基于TCP138、139两个端口的服务。
Samba服务器搭建后或许会发现客户端无法连接,通常有三个原因:
客户端应安装tcp/ip、 netbios、 ipx协议。
lmhosts, IP地址和netbios名子对应问题。
iptables防火墙设定不当。做各种配置前把先把iptables给关闭。
解决某个系统的问题应从最底层的共同特性开始入手。一般步骤是:
用Testpram命令检查语法错误,或S WAT那样的G U I配置文件检查smb . conf选项。
用ifconfig、wini pcfg、netstat和ping命令检查网络的连通性。
用ps、netstat、smbstatus和smbclient命令检查Samba守护进程操作。
在Windows客户机上用NET命令或Windows 资源管理器→工具→映射网络驱动器测试网络连通性。
用nmblookup确定域名服务操作。
用Windows NBTSTAT 查阅工作组和域中不同的SMB信息。
检验Samba配置文件中的语法和选项。
用smbclient命令检查认证和共享访问。
用testprns命令使对共享打印机的访问合法。
访问Samba Web站点和讨论组可以获得其他帮助。
5、Linux病毒造成网络故障的排除
为Linux邮件服务器和代理服务器安装防病毒软件,计算机病毒(包括蠕虫)是许多网络故障的祸首,Unix经过20多年的发展和完善,已经变得非常坚固,而Linux基本上继承了它的优点。在Linux里,如果不是超级用户,那么恶意感染系统文件的程序将很难得逞。当然,这并不是说Linux就无懈可击,病毒从本质上来说是一种二进制的可执行的程序。丛2003年到现在,网络经过了速客一号(Slammer)、冲击波(Blast)、霸王虫(Sobig)、 米虫(Mimail)、劳拉(Win32.Xorala)、Mydom的轮番轰炸。通常情况下企业接入互联网大多数使用代理服务器的发生。目前这些爆发的病毒虽然不会侵害Linux代理服务器,但是却会传播给访问它的Windows系统平台的计算机。所以发生频频方式网络故障时应当在Linux服务器上安装防病毒软件。Samba可以和使用Windows操作系统的机器很好的协作,在Windows的机器看来,Samba的服务就是网上邻居里的显示的一台服务器,我们可以把Windows下的文件保存在这个服务器上面。你可以把其他Windows机器的共享挂到Samba的目录下,然后一起杀,连Windows机器上的病毒也杀得干干净净。
6、对于Linux服务器攻击造成网络故障
对于Linux服务器来说,最大的危险是远程攻击。对Linux服务器攻击的定义是:攻击是一种旨在妨碍、损害、削弱、破坏Linux服务器安全的未授权行为。攻击的范围可以从服务拒绝直至完全危害和破坏Linux服务器。最严重的是远程用户获得根权限。Linux网络中超级用户拥有最高权限。一旦远程用户获得根权限你的网络随时可能被摧毁。所以部署IDS是防止这类网络故障的选择。当然你还要采取其他措施。信息情况可以查看笔者的:分级防御对Linux服务器的攻击。(网管员世界2003年10月刊)。
7、主机服务是否关掉了服务权限
一个比较常见的问题是客户机无法实现服务器提供的某些服务,也就是说可以ping到网络上的某部服务器,但是无法执行下载文件等任务。所以,首先必须了解该服务器是否关闭某些服务。最常见到的就是丛Red Hat 7.0开始中,FTP与Telnet已经缺省为关闭。这时,就必须通过修改/etc/xinetd.d文件,来打开这些功能。
8、Linux系统本身漏洞及其软件的BUG造成网络故障
操作系统是计算机系统灵魂,维护着系统的底层,对内存、进程等子系统进行管理和调度。如果操作系统本身出现了漏洞,其影响将会是致命的。操作系统的内核,对于网络安全是至关重要的。目前,内核的维护主要分两种模式:对于私有操作系统,如Windows/Solaris等,由于个人用户不能直接接触其源代码,其代码由公司内部开发人员维护,其安全性由同样的团队保证,内核的修正与其他应用程序一样,以patch/SP包的方式发布。对于Linux这样的开放式系统,是一种开放的结构。应该说,开放的模式是双刃剑。从机制上讲,全世界的开发人员都能获得源代码,从而找出其中的纰漏,似乎安全性应该更好;但是同时,如果网络管理人员不能及时更新内核,也会留下安全隐患。如果你是一个Linux网管员,你经常需要上相应的网站看,是否有补丁,是否有了bug fix,是否需要升级。千万不要报侥幸心理,否则一个script boy就可能拿下你的网站。套用一句名言:你的服务器永远可能在第二天被黑客接管。
Linux服务器运行的软件主要包括:samba,ftp,telnet,ssh,mysql,php,apache,Mozilla等,这些软件,大都是开源软件,而且都在不停升级,稳定版和测试版交替出现。在www.samba.org和 www.apache.org 上,最新的ChangeLog中都写着:bug fix, security bug fix的字样。所以Linux网管员要经常的关注相关网站的bug fix和升级,及时升级或添加补丁。
总结:
掌握OSI模型、TCP/IP分层模型及相对应的相关协议和正确网络拓扑结构,对于Linux网络故障分析与排除是非常重要的。当对OSI模型有一个透彻地了解时,故障诊断就变得易如反掌。另外Linux网络往往比较复杂需要你对多种网络操作系统都比较熟悉,还需要采取多种措施。如果能够配合使用一些网络检测工具(例如网络测试仪、网络嗅探器等),对于网络故障分析与排除也是非常有用的。
网络管理员的职责:有人说过,网管的主要工作就是每天去看看有没有新的补丁。这对windows网管适用,对Linux/unix系统的管理人员也同时适用。对操作系统和系统中应用程序的状况要胸有成竹,出了意外,马上就能觉察并修补。
参考: http://book.51cto.com/art/200704/44800.htm
本文出自 “Ricky's Blog” 博客,请务必保留此出处http://57388.blog.51cto.com/47388/1555216
原文地址:http://57388.blog.51cto.com/47388/1555216