为什么同⼀服务器不能设置两个⽹关(转)
【IT168专稿】⼀台主机能够对外部⽹络进⾏正常的访问(不论是上互联⽹或是访问别的⽹段),必须设置IP地址、⼦⽹掩码、⽹关、DNS服务器(如果仅是访问内⽹的话,DNS服务器地址可以不设)等四项信息,这个观点已经逐渐被⼤家所认识和接受了,但是如果⼀台主机有两块⽹卡,那么是不是这两块⽹卡都要设置⽹关呢?实际情况是:即使有两块⽹块,也只能在其中的⼀块⽹关上设置⼀个⽹关,如果两块⽹卡都设置了⽹关的话,很可能造成⽆法正常的访问⽹络。这个观点我对许多⼈都讲过,但是效果不是太好,很多⼈很多时候还是会把两块⽹关都设置上⽹关,结果是⽹络故障就出现了,下⾯我结合⼀次具体的⼯程实践为⼤家解释⼀下这个问题。
  周末的时候到机房,发现有两位同事正忙得热⽕朝天,⼚家的软件⼯程师也在那⾥,⼏个⼈都盯着电脑屏幕,⼀筹莫展,我问出了什么情况,同事说是有⼀台接⼝服务器⾃从更改了IP地址后,到SMS(⽤户管理系统)和CA(条件接收系统)等服务器就不通了,搞不清楚是怎么回事。对于这个项⽬的⽹络规划我是了解的,现在先为⼤家简单的介绍⼀下这个项⽬,拓扑图如图1所⽰:
  BOSS系统的设计思路是BOSS系统内部组成局域⽹,与CA服务器的通讯通过接⼝服务器来实现,因此接⼝服务器就安装了两块⽹卡,⼀块是连接BOSS系统内⽹的(以下简称⽹卡1),IP地址为10.232.0.11,⼀块是连接CA服务器的(以下简称⽹卡2),IP地址为10.230.0.40,我们⾸先按照这个思路设计并实现了
⽹络连接,并为⽹卡1分配了⽹关:10.230.0.1。但是在测试期间我们要保证BOSS系统的服务器和SMS服务器均可被CISCO3550交换机上的其它客户端同时访问到,这样的话,就需要跳过接⼝服务器,将BOSS系统内⽹的交换机直接连到CISCO3550交换机上,由于是不同⽹段的互访问(10.230/24和10.232/16⽹段),我们⼜为⽹卡2分配了⽹关:10.232.1.1,新的⽹络组⽹图如图2所⽰。
  现在的故障现象就是⾃从按照图2的规划更换了⽹络结构和重新设置了接⼝服务器的IP地址等信息后,接⼝服务器就⽆法对CA服务器进
⾏访问了,在接⼝服务器上ping CA服务器,出现的提⽰是:
  Reply from 10.230.0.1: Destination net unreachable.
  看到这个提⽰,我已经⼤致明⽩了产⽣⽹络故障的原因,肯定是接⼝服务器上⾯⽹卡2设置了⽹关以后,没有将⽹卡1上⾯的⽹关删除造成的。但是这台服务器所⽤的操作系统是REDHATAS4.7,⼤家也知道LINUX中查看⽹卡的信息⽐较别扭,怎么说呢?当键⼊ifconfig –a时会出现所有⽹络设备的IP地址信息,但是这其中并不包括⽹关的信息,为了争取时间,我们就不再琢磨在命令⾏中怎么把⽹关信息给出来了,好在这台服务器可以进⼊窗⼝模式,我们双击电脑屏幕右下⾓表⽰⽹络连接的那个⼩图标,下⾯的操作就跟在WINDOWS⼀样了,层层深⼊后,果然看到两块⽹卡都设置了⽹关,这样就验证了我的判断,解决⽅法也很简单,去掉第⼀块⽹卡上的⽹关,然后重启服务器即可。
  故障解决了,我们坐下来,⼀起来讨谈这个⼀台主机不能同时设置两个⽹关的话题,C和X分别代表⼩崔和祥⼦,下⾯是对话过程:
  ⼀、⽤路由器做⽐喻说明为什么不能同时设置两个⽹关
  C:为什么⼀台主机不能同时设置两个⽹关,电脑都要设置⽹关才能正常的与⽹络通讯啊,为什么设置了两个⽹关后反⽽出现故障了吗?
  X:这个问题吗,就要看从哪个⾓度理解了,以前⽼说的不够彻底,这样吧,我们从⽹络的基础构造来说可能容易理解⼀些。举个例⼦,咱们平常使⽤的哪些⽹络设备是有两个⽹⼝的?
  C:(眨了眨美丽的⼤眼睛)可能是光纤收发器吗,我看机房⾥⽤了好多双⽹⼝的光纤收发器。
  X:(只觉得喉咙⾥有点甜,感觉跟⾃⼰想像的结果差得实在太远,稳了稳神说),是路由器啊,⼤,怎么想到光纤收发器上⾯去了。  C:(温柔的笑了笑),对对对,是路由器。
  X:(总算开始进⼊正确的轨道了),是的,路由器,或者是硬件防炎墙这⼀类的⽹络设备,它们⼀般都⾄少有两个⽹⼝,那么再想⼀想,咱们配置这些设备时候都是进⾏了哪些操作呢?
  C+X:先配置两个端⼝的IP地址(外⽹⼝的⼀般是公⽹IP地址,内⽹⼝⼀般是私⽹IP地址)、⼦⽹掩码,
然后配置了默认路由(也就是相关于外⽹⼝的⽹关),做完这⼀步后,我们在路由器上就可以PING通 ISP分配给我们的DNS服务器地址了,说明我们跟外⽹已经联通了。
  X:是吧,路由器的两个⽹络端⼝是不是相当服务器的那两块⽹卡呢?它是不是只设置了⼀个⽹关?
  C:嗯,好像是这样。
  X:那路由器内⽹⼝的地址有什么⽤呢?
  C:是作为内⽹主机的⽹关。
  X:就是这个意思,内⽹⼝与外⽹⼝是可以互相通讯的,所以不需要设置内⽹的⽹关,虽然它不需要设置⽹关,但是它却成为了内⽹内主机的⽹关地址。咱们再回到⼀台主机同时安装了两块⽹卡这个课题上来,⼀般来说,⼀台主机有⼀块⽹卡,它就可以理解为⼀台普通的主机,只要能够满⾜上⽹的需要就可以了,为了访问外部⽹络或者与不同⽹段之间的主机进⾏通讯,必须要设置⽹关,但是⼀台主机安装了两块⽹卡,它的作⽤就不⼀样了,这时候它的作⽤就可以理解为⼀台服务器,或者更直接⼀些,就相当⼀台路由器。
  C:⼀台主机+两块⽹块=⼀台路由器?
  X:是啊,咱们再把时间往前推⼏年,在01、02年的时候,很多单位上⽹都是通过代理服务器的⽅式,就是在⼀台PC机(或者服务器)上安装两块⽹卡,然后通过PROXY软件来实现代理局域⽹内主机上⽹,那个时候就有很多⼈将代理服务器上的两块⽹卡都设置了⽹关,结果造成了很多莫名其妙的⽹络故障。
  C:感受这个好遥远啊。
  X:(赶快拉回来)对,那⽤路由器来做⽐喻,明⽩为什么⼀台主机即使有两块⽹卡也不能同时设置两个⽹关了吧
  C:好象有点明⽩了。
  ⼆、“Destination net unreachable”这个提⽰是怎么来的
  C:今天看到的ping的提⽰信息很奇怪,⾥⾯有“Destination net unreachable.”的提⽰
  X:是啊,通常见到的ping操作,返回的提⽰不是“request time out”,就是“Reply from 10.75.0.6: bytes=32 time=1ms TTL=127”,这两类,但是只要出现“Destination net unreachable”,就说明到⽬标主机不⼀定真的不通,⽽是出于某种原因被限制了。
  C:被限制了?怎么还有这样的事?
  X:是的,⽐如以前我经常在路由器和硬件防⽕墙上做的内⽹⽤户不能访问某⼀个或某⼀类⽹站,就是通过创建⼀个禁⽌访问的ACL,⾥⾯包含相应的⾮法⽹站,这时候⽤户再去ping那个⽹站,就会出现“Destination net unreachable”这样的提⽰,这就说明不是那个⽹站不存在,⽽是不让你去访问它。
  C:这样的功能也能实现?
  X:是啊,操作起来其实很简单,我们来做个简单的实验吧,正好现在⼿头上有⼀台CISCO3550的交换机,咱们搭⼀个简单的测试环境就可以把这个现象模拟出来,如图3所⽰:
  咱们现在就创建⼀个ACL,并把它应⽤到VLAN65上,如下所⽰:
  3550#show ip access-lists no5
  Extended IP access list no5
  deny ip any host 10.75.0.8
  permit ip any any (93467 matches)
  3550#show run
  interface Vlan65
  description link to 2floor
  ip address 10.65.0.1 255.255.0.0
  ip access-group no5 in
  在应⽤这个ACL之前,就打开⼀个DOS窗⼝⼀直在10.65.88.8上ping 10.75.0.8,会出现如下提⽰:
  C:\Documents and Settings\lrx>ping 10.75.0.8
用路由器连接两台电脑  Pinging 10.75.0.8 with 32 bytes of data:
  Reply from 10.75.0.8: bytes=32 time<1ms TTL=127
  Reply from 10.75.0.8: bytes=32 time<1ms TTL=127
  说明从10.65.88.8到10.75.0.8是通的,但应⽤完ACL后,ping的信息就显⽰为如下所⽰了。
  Reply from 10.65.0.1: Destination net unreachable.
  Reply from 10.65.0.1: Destination net unreachable.
  这个时候我们对于⽹络结构并没有做任何的改动,即⽹线仍然是连接的,但是却出现了“Destination net unreachable.”(⽬标⽹络⽆法到达的提⽰),说明ACL已经成功的阻⽌了从10.65.88.8到10.75.0.8的访问。
  C:真神奇啊。
  三、LINUX系统中⽹卡IP地址信息修改的⽅法
  X:刚才咱们为了尽快的解决问题,采⽤的是进⼊LINUX的窗⼝界⾯对⽹卡的相关信息进⾏了修改,并通过重启服务器使修改⽣效的,但是很多时候,服务器是⽆法进⼊窗⼝界⾯的,也不允许进⾏重启操作,这个时候我们就要在命令⾏中进⾏操作了。
  C:很复杂吧?
  X:也不是太复杂,我们只要记住“/etc/sysconfig/network-scripts”这个⽬录就可以了,由于LINUX具有⾃动补全命令的功能,我们只需记住⼀些关键的词,就可以⼀步⼀步的进⼊到这个⽬录中来,⾥⾯对应着相应的⽹卡的信息,⽐如第⼀块⽹卡就叫ifcfg-eth0,⾥⾯就有详细的
IP地址、⼦⽹掩码、⽹关等信息,如下所⽰:
  [root@localhost network-scripts]# more ifcfg-eth0
  DEVICE=eth0
  BOOTPROTO=none
  HWADDR=00:0C:29:8D:CB:99
  ONBOOT=yes
  TYPE=Ethernet
  NETMASK=255.255.0.0
  IPADDR=10.65.88.1
  USERCTL=no
  IPV6INIT=no
  PEERDNS=yes
  GATEWAY=10.65.0.1
  如果不需要为第⼀块⽹卡设置⽹关的话,把GATEWAY=后⾯的值删除即可,存盘退出后,再执⾏⼀遍ifdown eth0 ;ifup eth0即可以实现⽹卡的重启,以便使新的设置⽣效,两个命令⼀起写的好处可以保证我们还要以连接到服务器上。
  C:不错,不错,这个办法不错。
  这个⽹络故障的排除就算胜利结束了,关键是我们不仅做到“知其然”,⽽且通过沟通实现了“知其所以然”,⽹管员就是在不断解决故障的过程中成长起来的。