鸟哥的 Linux 私房菜
为取得较佳浏览结果,请爱用 firefox 浏览本网页
目录 | 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 参数:
    在顺利的载入网路卡的模组,并且‘取得网路卡的代号’之后,我们可以利用 ifconfig 或 ip 来直接给予该网路卡一个网路位址试看看! 看能否给予 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:将旧的文章移动到 此处

2002/07/31以来统计人数

 
     
本网页主要以 firefox 配合解析度 1024x768 作为设计依据
http://linux.vbird.org is designed by VBird during 2001-2009. Aerosol Lab.