鸟哥的 Linux 私房菜
目录 | Linux 基础篇 | Linux 服务器篇 | Linux 企业应用篇 | 安全管理
     
 
最近更新日期:2006/08/04
Linux 最强的,也是最让人称道的地方,就是他的网络功能了,不论是 Mail server、Web server、Proxy server 等等,都好好用喔!但是,我们也常在网络上看到一堆常见的问题,就是在问‘我的 Linux 没有办法连上网络,该如何是好....’等等的问题,问来问去的重点大概都是一样的状况!伤脑筋!那鸟哥就把一些在 Linux 上面可能会发生的网络问题把他整理一下,看看您是不是有这方面的问题,参考看看吧!


大标题的图示无法连线原因分析
老是看到有朋友在网络上哀嚎说:‘我的网络不通啊!’还有比较奇怪的是‘啊怎么网络时通时不通’之类的问题, 这类的问题其实主要可以归类为硬体问题与软件设定问题,硬体的问题比较麻烦,因为需要透过一些专门的装置来分析硬体; 至于软件方面,绝大部分都是设定错误或者是观念错误而已,比较好处理啦! OK!我们先来看看网络在哪里可能会出问题吧!


小标题的图示硬体问题
网络基础章节当中我们曾提到很多的网络基础概念, 以及一些简单的硬体维护问题。以一个简单的星形连线来说,我们可以假设他的架构如同下图所示:

区域网络的连线状态示意图
图一、区域网络的连线状态示意图


在上面的图示当中,"Linux PC3" 要连到 Internet 上面去的话,需要透过网络线、 交换器、 NAT 主机 (Linux 服务器或 IP 分享器)、ADSL 数据机,以及 Internet 上面的所有媒体设备 (包括路由器、桥接器、其他网络线等等); 那么哪些地方可能会出问题啊?
  1. 网络线材的问题

    在上面的图示中,可以发现,其实网络周边设备中,使用最多的就是网络线啦! 要注意网络线分成平行线与跳线 (RJ-45接头) ,而并不是所有的设备都支援自动分辨跳线与平行线的功能的! 所以你必须要了解到你的设备 (Hub/Switch/数据机) 所支援的网络线;另外, 如果你的网络线是接在门缝处或者是容易凹折处,那很有可能具有被压毁的情况, 所以您需要注意一下这些事情:

    • 网络线被截断;
    • 网络线过度扭曲变形造成讯号不良;
    • 自制网络接头 ( 如RJ-45跳线头 ) 品质不良;
    • 网络接头与设备 ( 如 Hub )接触不良;

  2. 网络卡、Hub 及 Router 等网络设备的问题

    另外,还有一些网络设备也会有问题,常见的问题如下:

    • 网络卡不稳定、品质不佳,或者与整体系统的相容度不佳;
    • 各网络设备的接头不佳,接触不良,造成讯号衰减;
    • 由于网络设备所在环境恶劣 (例如过热) 导致的当机问题;
    • 各网络设备使用方法不良,造成设备功能衰减;

  3. 设备配置的规则

    在各个设备的配置上是有一定的规则的,而最容易发生的问题就是太长的网络线会造成讯号的衰减, 导致网络连线的时间太长甚至无法连线。我们曾在网络基础当中谈过乙太网络最长的支援距离, 还有一些其他网络媒体配置的问题您必须晓得的:

    • 使用错误的网络线,最常发生在平行线与跳线的分别!
    • 搭建的网络线过长,导致讯号衰减太严重。例如乙太网络 CAT5e 的线理论限制长度大概是在 90 公尺左右,若两个设备 (Hub/主机之间) 长度大于 90 公尺时,自然就容易出现讯号发生问题了!
    • 其他杂讯的干扰,最常发生在网络线或者网络设备旁边有太强的磁波;
    • 区域网络上面,节点或者其他的设备太多,过去我们常以所谓的 543 原则来说明:
      • 5个网段(segment)。所谓segment就在物理连接上最接近的一组电脑, 在一个BNC网段里面最多只能接30台电脑,且网线总长不能超过185m。
      • 4个增益器(repeater)。也就是将信号放大的装置。
      • 3个电脑群体(population)。这个不好理解,也就是说前面所说的5个segment之中, 只能有3个可以装电脑,其它两个不行。
上述是一些最常见的硬体问题,当然啦,有的时候是设备本身就有问题, 而我们在网络基础里面谈到的那个很重要的‘ 网络布线 ’的情况,也是造成网络停顿或通顺与否的重要原因呐!所以,硬体问题的判断比较困难点。 好~底下我们再来聊一聊软件设定的相关问题。


小标题的图示软件问题
所谓的软件问题,绝大部分就是 IP 设定错误啊,路由不对啊,还有 DNS 的 IP 设定错误等等的, 这些问题都是属于软件设定啦!只要将设定改一改,利用一些探测软件查一查, 就知道问题出在哪里了!基本的问题有:
  1. 网络卡的 IP 设定错误
    例如:同一个 IP 在同一个网段中出现造成 IP 冲突、子遮罩网络设定错误、网络卡的驱动程序使用错误、 网络卡的 IRQ、 I/O Address 的设定冲突等等;

  2. 路由的问题 (route table)
    最常见的就是预设路由 (default gateway) 设定错误了!或者是路由介面不符所导致的问题, 使得资料封包没有办法顺利的送出去。

  3. 通讯协定不相符
    最常发生在不同的作业系统之间的通讯传输,例如早期 Windows 98 与 Windows 2000 之间的‘网芳’ 若要达成沟通,则 Windows 98 必须要加装 NetBEUI 这个通讯协定才行。又例如两部 Linux 主机要透过 NFS 通讯协定传输资料时,两边都得要支援 portmap 这个启动 RPC 协定的程序才行! 这些通讯协定我们都会在后面的章节分别介绍的啦!

  4. 网络负荷的问题 (loading)
    当同时有大量的资料封包涌进 Server 或者是 Hub 或者是同一个网络中, 就有可能造成网络的停顿甚至挂点!另外,如果区网内有人使用 BT (P2P 软件) 或者是有人中毒导致蠕虫充满整个区网,也会造成网络的停顿问题;

  5. 其他问题
    例如:一些 port 被防火墙挡住了,造成无法执行某些网络资源;应用程序本身的 Bug 问题;应用程序中使用者的网络设定错误;以及不同的作业系统的相容性问题等等。

小标题的图示问题的处理
既然问题发生了,就要去处理他啊!那如何处理呢?以上面的星形连线图示为例,把握两个原则:
  • 先由自身的环境探测起,可以由自身 PC 上的网络卡查起,到网络线、到 Hub 再到 ATU-R 等等的硬体先检查完。在这个步骤当中,最好用的软件就是 ping , 而你最好能有两部以上的主机来进行连线的测试;
  • 确定硬体没问题了,再来思考软件的设定问题!
实际上,如果网络不通时,你可以依序这样处理:
  1. 了解问题:这个问题是刚刚发生?还是因为之前我做了什么动作而导致无法连线?
  2. 确认 IP:先看看自己的网卡有无驱动?能否取得正确的 IP 来连线?
  3. 确认区网连线:利用 ping 来沟通两部主机,确定网络线与中继的 hub/switch 工作正常;
  4. 确认对外连线:看主机或 IP 分享器能否依据 连上 Internet 那一章的方法顺利取得 IP 参数,并以 ping 的方法确定对外连线是可以成功的;
  5. 确认 DNS 查询:利用 nslookup 或 host 或 dig 检查 www.google.com 看看;
  6. 确认 Internet 节点:可以利用 traceroute 检查各节点是否没问题?
  7. 确认对方服务器正常服务:是否对方服务器忙线中?或他的机器挂了?
  8. 确认我方服务器:是否某些服务没有正确启动?可利用 netstat 检查, 是否某些安全机制的套件没有开放,例如 SELinux 这项机制;
  9. 防火墙或权限的问题:是否由于权限设定错误所致? 是否由于您的机器有防火墙忘记启用可连线的端口所致?这个可以透过 tcpdump 来处理!
透过这些处理动作后,一般来说,应该都可以解决您无法上网的问题了! 当然啦,如果是硬体的问题,那么鸟哥也无法帮你,你可能最需要的是...... ‘送修吧孩子!

大标题的图示处理流程
既然知道上面已经谈到的几个小重点了,接下来当然是一个一个的给他处理掉啊! 底下我们就得要一步一脚印的开始检查的流程啊!


小标题的图示步骤一:网络卡工作确认
其实,网络一出问题的时候,您应该从自己可以检查的地方检查起,因此, 最重要的地方就是检查您的网络卡是否有工作的问题啦!检查网络卡是否正常工作的方法如下:
  1. 确定网络卡已经驱动成功:
    如果网络卡没有驱动成功,其他的,免谈!!所以你当然需要驱动你的网络卡才行! 确认网络卡是否被驱动,可以利用 lspci 先看看有没有捉到 Ethernet 字样的显示资讯,再以 dmesg 来检查是否被核心探测到,最后使用 lsmod 看看有没有相对应的模组已被载入。 整个步骤可以参考‘连上 Internet - Linux 网络卡’那一个小节, 这里鸟哥不再说明了! ^_^!不过你要注意的是,如果上述的检测方式都无法发现你的网络卡模组, 那肯定就是核心与核心模组不支援你的网络卡啊!那该怎办?参考 ‘连上 Internet之网卡编译’就对了!

  2. 确定可以手动直接建立 IP 参数:
    在顺利的载入网络卡的模组,并且‘取得网络卡的代号’之后,我们可以利用 ifconfigip 来直接给予该网络卡一个网络位址试看看! 看能否给予 IP 设定呢?例如:
    [root@linux ~]# ifconfig eth0 192.168.1.100
    
    来直接建立该网络卡的 IP ,然后直接输入 ifconfig 看能否查阅到刚刚设定好的参数即可。 如果可以建立起该 IP ,就以 ping 来检测看看:
    [root@linux ~]# ping 192.168.1.100
    
    如果有回应的话,那表示这个网卡的设定应该是没有问题了! 再来则是开始检测一下区域网络内的各个连接硬体啦!
Tips:
事实上要再次的重申,如果您的主机捉不到您主机上的网络卡 (通常是内建的网络晶片), 那么最好买一张便宜的螃蟹卡先来凑合着用,‘先求有!再求完美’, 不要一开始就挑战自己的耐心啊!拜托拜托!
鸟哥的图示

小标题的图示 步骤二:区域网络内各项连接设备检测
在确认完了最重要的网络卡设定之后,并且确定网络卡是正常的之后, 再接着下来则是区域网络内的网络连接情况了!假设您是按照 图一所设定的星形连线区域网络架构,那么你必须要知道整个‘网络’的概念!
  1. 关于网络的概念
    你得清楚的知道图一中各主机与服务器可以互相沟通是因为他们在‘同一个网络里面’, 所以,你要知道所谓的 192.168.1.0/24 这种网络的表达方式所代表的意义, 且子遮罩网络 (Netmask) 的意义也得了解。如果忘记了,请回去网络基础再翻一翻。

  2. 关于 Gateway 与 DNS 的设定
    Gateway 与 DNS (在 /etc/sysconfig/network-scripts/ifcfg-eth0, /etc/resolv.conf 的设定) 最容易被搞混~ 这两个并非是填写你的 Linux 主机的 IP 喔!应该是要填写 IP 分享器 (或 NAT 主机) 的 IP 在 Gateway 中, 填写 168.95.1.1 在 DNS 的 IP 设定当中!不能够搞错啊!如果还是不清楚?回去网络基础看看吧!

  3. 关于 Windows 端的工作群组与电脑名称
    假如您还需要资源分享,那么您就必须在 windows 系统中开放文件分享, 并且建议所有的电脑将‘工作群组’设定相同,但‘电脑名称’则不能相同!
假设你的区网内所有的主机 IP 都设定正确了,那么接下来你就可以使用 ping 来测试两部区网内主机的连线, 这个连线的动作可以让你测试两部主机间的各项设备,包括网络线、Hub/Switch 等等的咚咚! 如果无法测试成功,那就请了解一下:
  1. IP 参数是否设定正确
    再次强调,先决定 IP 是对的!鸟哥在上课的时候常常发现同学无法连到我的主机上, 一经使用 ifconfig 才发现他们与我的 IP 不在同一个网段内,就是会有这样的情况发生啊!唉~

  2. 连线的线材问题
    包括我们前面提到的网络线本身折损、过度缠绕造成的讯号衰减问题等等, 另外,有些比较旧的 Hub/Switch 或者是 ATU-R (ADSL 数据机,俗称的小乌龟是也) 由于没有 Auto MDI/MDIX 的功能,所以无法自动的分辨跳线与否, 那么当你插错网络线的时候,也就无法接通啦!这样了解乎?另外,早期我们常常会说, 最简单判断每部主机是否顺利连接到 Hub/Switch 可以透过连接到 Switch 上的灯号来判断, 不过,由于有时候网络线本身讯号不良,虽然灯号还是会亮,不过就是无法连接到 Switch 的情况 (鸟哥自己就曾发生过啊!),此时,跟朋友借一条 OK 的网络线来测试看看吧!

  3. 网卡或 Hub/Switch 本身出问题
    有一次鸟哥无法在外部连接到鸟哥的主机,怀疑是挂点了,结果冲到主机所在办公室察看,咦! 主机是好好的嘛!那怎么会无法连线呢?原因是.......室内环境通风不良,加上 Switch 所在处温度过高, 加上那部旧的 switch ‘刚好’风扇坏了,哈!就这样‘ switch 当机 ’ 在重新启动 switch (拔掉再插上电源线) 后就正常了。所以啰,很多情况都是会发生的, 而区域网络内的环境也很容易影响到连线品质啊!
确定自己主机的 IP 与网卡没有问题,加上内部区网透过 ping 也测试过没有问题, 接下来就是要‘取得可以对外连线的 IP 参数’啦!这个重要!


小标题的图示步骤三:取得正确的 IP 参数
什么叫‘取得正确的 IP 参数’啊?还记得我们谈过如果要顺利的连接上 Internet 的话, 必须要可以跟 public IP 进行沟通才行,而与 public IP 取得沟通的方法,在台湾比较常见的有 ADSL, Cable modem, 学术网络, 电话拨接等等,在 CentOS 当中,我们可以透过修改 /etc/sysconfig/network-scripts/ifcfg-eth0,或者是利用 rp-pppoe 来进行拨接, 无论如何,你就是得要连接到某个 ISP 去就是了~在你确认所有的区网没有问题之后, 参考一下连上 Internet 那一章的介绍, 连上之后,立即以 ifconfig 看看有没有捉到正确的 IP 啊? 在台湾如果使用 ADSL 连线的话,你应该可以顺利的取得一组正确的 Public IP 参数的!
Tips:
曾有国外的华人朋友来信说到,他们使用 ADSL 拨接之后竟然取得一组 Private IP , 害他们没有办法搭建服务器!他们想请问这样的情况是否合理。如果您熟悉路由相关的概念之后, 当然会知道:‘这当然合理!’,因为你取得的 IP 只是为了要连接到 ISP 去而已, 而 ISP 与你的主机当然可以透过 Private IP 来连线啊!如果是这样的话,那么您就肯定无法搭建服务器了! ^_^
鸟哥的图示
另外,最常发现无法顺利取得 IP 的错误就是‘BOOTPROTO’这个设定值设定错了! 因为 static 与 hdcp 协定所产生的 IP 要求是不一样的啊!还记得吧! 要特别留在 ifcfg-eth0 里面的设定参数喔!另外,如果你是使用 ADSL 拨接的, 但是老是无法拨接成功,那么建议你可以这样试看看:
  • 将 ADSL 的数据机 (ATU-R) 整个关机,将 Switch/Hub 也关掉电源;
  • 静待十分钟,等这些设备比较‘凉快’一点后,再重新插上电源;
  • 将 Linux 连接到 ADSL 的那块网卡 (假设为 eth0) 在 ifcfg-eth0 内,‘ONBOOT’设定为 no, 重新启动网络 (/etc/init.d/network restart),然后再执行 adsl-start
  • 如果还是无法拨接成功,并且你已经确认内部网络没有问题,那请中华电信的工程人员来帮忙您处理吧!
因为很多时候都是由于网络媒体过热,也有可能主机内部的一些网络参数有点问题, 所以,干脆就不要启动网卡,让 adsl-start 自动去启动网卡即可! 如果顺利取得 IP 后,却还是无法顺利连到 Internet 上面时,你觉得还有哪些地方需要处理的呢?


小标题的图示步骤四:确认路由表的规则
如果你已经顺利取得正确的 IP 参数的话,那么接下来就是测试一下是否可以连上 Internet 啊! 鸟哥建议你可以尝试使用 ping 来连连看 Hinet 的 DNS 主机,也就是 168.95.1.1 那部机器啦!
[root@linux ~]# ping -c 3 168.95.1.1
如果有回应,那就表示你的网络‘基本上已经没有问题,可以连到 Internet 了!’, 那如果没有回应呢?明明取得了正确的 IP 却无法连接到外部的主机,肯定有鬼!呵呵!没错! 还记得我们在网络内资料的传输可以直接透过 MAC 来传送, 但如果不在区网内的资料,则需要透过路由,尤其是那个预设路由 (default route) 来帮忙转递封包吧! 所以说,如果你的 public IP 无法连接到外部 (例如 168.95.1.1) ,可能的问题就出在路由与防火墙上面了。 假设你没有启动防火墙,那问题就缩小到剩下路由啰~

那路由的问题如何检查?就用 route -n 来检查啊!

例题:假设有个使用 ADSL 拨接的 Linux 主机,他的路由表如下,你觉得出了什么问题?
Destination     Gateway       Genmask         Flags Metric Ref    Use Iface
59.104.200.1    0.0.0.0       255.255.255.255 UH    0      0        0 ppp0
192.168.1.0     0.0.0.0       255.255.255.0   U     0      0        0 eth0
169.254.0.0     0.0.0.0       255.255.0.0     U     0      0        0 eth0
127.0.0.0       0.0.0.0       255.0.0.0       U     0      0        0 lo
0.0.0.0         192.168.1.2   0.0.0.0         UG    0      0        0 eth0
答:
    仔细看到上面的路由输出,第一条是 ppp0 产生的 public IP 介面,第二条是 eth0 的内部网络介面, 在看到最后一条的 0.0.0.0/0.0.0.0 这个预设路由,竟然是内部网络的 eth0 为 gateway ? 这不合理,最大的问题应该是出在 ifcfg-eth0 里面不小心设定了‘GATEWAY=192.168.1.2’ 所致,解决的方法为:

    1. 取消 ifcfg-eth0 内 GATEWAY=192.168.1.2 那一行,(该行亦可能出现在 /etc/sysconfig/network 内)
    2. 重新启动网络 /etc/init.d/network restart
    3. 重新进行拨接: adsl-stop; adsl-start

另外一个可能发生的情况,就是:‘忘记设定预设路由’啦! 例如使用 ifconfig 手动重新设定过网络卡的 IP 之后,其实路由规则是会被更新的, 所以预设路由可能就会不见了!那个时候你就得要利用 route add 来增加预设路由啰!


小标题的图示步骤五:主机名称与 IP 查询的 DNS 错误
如果你发现可以 ping 到 168.95.1.1 这个 Internet 上面的主机,却无法使用浏览器在网址列浏览 http://www.google.com 的话,那肯定 99% 以上问题是来自于 DNS 解析的困扰! 解决的方法就是直接到 /etc/resolv.conf 去看看设定值对不对啊! 一般常见的内容是这样的:
[root@linux ~]# vi /etc/resolv.conf
nameserver 168.95.1.1
nameserver 139.175.10.20
最常见的错误是‘那个 nameserver 的拼字写错了!’真是最常见的问题~~另外,如果 client 端是 Windows 系统呢?常常初学者会搞错的地方就是在 windows 的设定了!要注意: Windows 端的 DNS 设定与主机端 /etc/resolv.conf 的内容相同即可! 很多初学者都以为 TCP/IP 内的 DNS 主机是填上自己的 Linux 主机,这是不对的 (除非您自己的 Linux 上面有 DNS 服务) !您只要填上您的 ISP 给您的 DNS 主机 IP 位置就可以了


小标题的图示步骤六:Linux 的 NAT 服务器或 IP 分享器出问题
NAT 服务器最简单的功能就是 IP 分享器啦!NAT 主机一定是部路由器,所以你必须要在 Linux 上面观察好正确的路由资讯。否则肯定有问题。另外, NAT 主机上面的防火墙设定是否合理? IP 分享器上面是否有设定抵挡的机制等等,都会影响到对外连线是否能够成功的问题点。 关于 NAT 与防火墙我们会在后续的章节继续介绍的啦!


小标题的图示步骤七:Internet 的问题
Internet 也会出问题喔!当然啦~没有任何东西是不会出问题的! 举例来说,好几年前台湾西岸因为施工的关系,导致南北网络骨干缆线被挖断, 结果导致整个 Internet 流量的大塞车!这就是 Internet 的问题~还有,数年前 Study Area 网站放置的地点由于路由器设定出了点差错, 结果导致连线速度的缓慢。这都不是主机本身出问题,而是 Internet 上面某个节点出了状况。 想要确认是否问题来自 Internet 的话,就使用 traceroute 吧! 查察看问题是来自那个地方再说!


小标题的图示步骤八:主机的问题
如果上述的处理都 OK ,却无法登入某部主机时,我想,最大的问题就是出现在主机的设定啦! 这包括有:
  • 主机并没有开放该项服务:例如主机关闭了 telnet ,那你使用 telnet 去连线,是无法连接上的啦!
  • 主机的权限设定错误:例如你将某个目录设定为 drwx------ ,该目录拥有者为 root , 你却将该目录开放给 WWW 来浏览,由于 WWW 无法进入该目录,所以当然无法正确的给用户端浏览啊! 这是最典型的权限设定错误的情况啊!
  • 安全机制设定错误:例如 SELinux 是用来更细微管理主机存取的一种核心机制, 如果你没有设定好就启用的话,那么主机的服务很多都‘无法顺利的启用’, 关闭 SELinux 就好了。而其他例如 /etc/hosts.deny, PAM 模组等等, 都可能造成使用者无法登入的问题!这就不是网络问题,而是主机造成连线无法成功!
  • 防火墙问题:防火墙设定错误也是一个很常见的问题,你可以使用 tcpdump 来追踪封包的流向, 以顺利的了解防火墙是否设定错误。
基本上,一个网络环境的检测工作可不是三言两语就讲的完的~而且常常牵涉到很多经验的问题~ 请您常常到一些讲座的场合去听听看大家的经验,去 google 看看人家的解决方法, 都有助于让你更轻易的解决网络问题的喔! ^_^

大标题的图示课后练习
  • 以图一的星形连线为例,你的 Linux PC 3 可以 ping 到 Windows PC1 ,但是反过来, Windows PC1 无法 ping 到 Linux PC3,你觉得原因可能发生在哪里?
    由于两边已经可以用 ping 进行连线,所以硬体应该是没有问题了。 而 Linux --> Windows 没问题, Windows --> Linux 有问题,可能是由于 Linux 主机上面的防火墙所致。 可以使用 iptables -L -n 去查阅一下防火墙的设定规则。详细的防火墙请参考后续的章节。

2002/07/31:第一次完成日期!
2003/08/19:重新修订一些资料,与前面的章节比较好配合!
2006/08/04:将旧的文章移动到 此处

 
     
中国存储网 chinastor.cn排版整理
原文作者鸟哥,主页,更多Linux学习资料在线看:Linux系统管理员手册 - Linux命令大全 - Linux调用大全- Linux专栏 - 国产Linux