📄 0230router.htm
字号:
OK!那你自己主机的路由表到底有哪些部分呢?我们以底下这个路由表来说明∶<br />
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>route -n</span>
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 <span class=term_say><== 1</span>
127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo <span class=term_say><== 2</span>
0.0.0.0 192.168.1.2 0.0.0.0 UG 0 0 0 eth1 <span class=term_say><== 3</span>
</pre></td></tr></table>
首先,我们得知道在 Linux 系统下的路由表<span class=text_import2>是由小网域排列到大网域</span>,
例如上面的路由表当中,路由是由『 192.168.1.0/24 --> 127.0.0.0/8 --> 0.0.0.0/0 (预设路由) 』来排列的。
而当主机的网路封包需要传送时,就会查阅上述的三个路由规则来了解如何将该封包传送出去。<br /><br />
你会不会觉得奇怪,为什么会有这几个路由呢?其实路由表主要有这几种情况来设计的∶<br />
<ul>
<li><span class=text_import1>依据介面而存在的路由</span>∶<br />
例如 192.168.1.0/24 这个路由的存在是由于鸟哥的这部主机上面拥有 192.168.1.11 这个 IP 的关系!
也就是说,你主机上面有几个网路介面的存在时,该网路介面就会存在一个路由才对。
所以说,万一你的主机有两个网路介面时,例如 192.168.1.11, 192.168.2.11 时,那路由至少就会有∶<br />
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>route -n</span>
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.168.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
<span class=term_say>.....以下省略.....</span>
</pre></td></tr></table><br />
<li><span class=text_import1>手动或预设路由(default route)</span>∶<br />
你可以使用 route 这个指令手动的给予额外的路由设定,例如那个预设路由 (0.0.0.0/0) 就是额外的路由。
使用 route 这个指令时,最重要的一个概念是∶『<span class=text_import2>你所规划的路由必须要是你的装置
(如 eth0) 或 IP 可以直接沟通 (broadcast) 的情况</span>』才行。举例来说,以上述的环境来看,
我的环境里面仅有 192.168.1.11 及 192.168.2.11 ,那我如果想要连接到 192.168.100.254 这个路由器时,
下达∶<br />
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>route add -net 192.168.100.0 \</span>
> <span class=term_command>netmask 255.255.255.0 gw 192.168.100.254</span>
SIOCADDRT: Network is unreachable
</pre></td></tr></table>
看吧!系统就会回应没有办法连接到该网域,因为我们的网路介面与 192.168.100.0/24 根本就没有关系嘛!
那如果 192.168.100.254 真的是在我们的实体网路连接上,那其实你应该是这样做∶<br />
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>route add -net 192.168.100.0 \</span>
> <span class=term_command>netmask 255.255.255.0 dev eth0</span>
[root@linux ~]# <span class=term_command>route -n</span>
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.100.0 0.0.0.0 255.255.255.0 <span class=term_write>U </span> 0 0 0 eth0
<span class=term_write>192.168.1.0</span> 0.0.0.0 255.255.255.0 <span class=term_write>U </span> 0 0 0 eth0
0.0.0.0 <span class=term_write>192.168.1.2</span> 0.0.0.0 <span class=term_write>UG</span> 0 0 0 eth1
</pre></td></tr></table>
这样你的主机就会直接用 eth0 这个装置去尝试连接 192.168.100.254 了!
另外,上面路由输出的重点其实是那个『<span class=text_import2>Flags 的 G</span> 』了!因为那个 G
代表使用外部的装置作为 Gateway 的意思!而那个 Gateway (192.168.1.2) 必须要在我们的已存在的路由环境中。
这可是很重要的概念喔! ^_^<br /><br />
<li><span class=text_import1>动态路由</span>∶<br />
除了上面这两种可以直接使用指令的方法来增加路由规则之外,
还有一种透过路由器与路由器之间的协商以达成动态路由的环境,
不过,那就需要额外的软体支援了,例如∶ <a href="http://www.zebra.org/what.html"
target="_blank">zebra (http://www.zebra.org/)</a> 或 CentOS 上面的
<a href="http://www.quagga.net/about.php"
target="_blank">Quagga (http://www.quagga.net/)</a> 这几个软体了!<br />
</ul>
事实上,在 Linux 的路由规则都是透过核心来达成的,
所以这些路由表的规则都是在核心功能内啊!也就是在记忆体当中喔! ^_^
<br /><br />
</div>
<hr /><a NAME="routing_ip_alias"></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class="text_h2">IP Alias
的测试用途</span><br />
<div class=block2>
我们在 <a href="0140networkcommand.php">Linux 常用指令</a>里面谈过 eth0:0 这个装置吧?
这个装置可以在原本的 eth0 上面模拟出一个虚拟介面出来,以让我们原本的网路卡具有多个 IP ,
具有多个 IP 的功能就被称为 IP Alias 了。而这个 eth0:0 的装置可以透过
<a href="0140networkcommand.php#ifconfig">ifconfig</a> 或
<a href="0140networkcommand.php#ip_cmd">ip</a> 这两个指令来达成,
关于这两个指令的用途请翻回去之前的章节阅读,这里不再浪费篇幅啊!<br /><br />
那你或许会问啊∶『这个 IP Alias 有啥用途啊?』好问题!这个 IP Alias 最大的用途就是可以让你用来『应急』!
怎么说呢?我们就来聊一聊他的几个常见的用途好了∶<br />
<ul>
<li><span class=text_import1>测试用</span>∶<br />
怎么说用来测试呢?举例来说,现在使用 IP 分享器的朋友很多吧,
那 IP 分享器通常使用 WWW 介面来提供设定。那这个 IP 分享器通常会给予一个私有 IP 亦即是
192.168.0.1 来让使用者开启 WWW 介面的浏览。问题来了,那你要如何连接上这部 IP 分享器呢?
嘿嘿!在不更动既有的网路环境下,你可以直接利用∶<br />
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>ifconfig [device] [ IP ] netmask [netmask ip] [up|down]</span>
[root@linux ~]# <span class=term_command>ifconfig eth0:0 192.168.0.100 netmask 255.255.255.0 up</span>
</pre></td></tr></table>
来建立一个虚拟的网路介面,这样就可以立刻连接上 IP 分享器了。<br /><br />
<li><span class=text_import1>在一个实体网域中含有多个 IP 网域</span>∶<br />
另外,如果像是在补习班或者是学校单位的话,
由于原本的主机网路设定最好不要随便修改,那如果要让同学们大家互通所有的电脑资讯时,
就可以让每个同学都透过 IP Alias 来设定同一网域的 IP ,
如此大家就可以在同一个网段内进行各项网路服务的测试了,很不错吧!<br /><br />
<li><span class=text_import1>既有设备无法提供更多实体网卡时</span>∶<br />
如果你的这部主机需要连接多个网域,但该设备却无法提供安装更多的网卡时,
你只好勉为其难的使用 IP Alias 来提供不同网段的连线服务了!<br />
</ul>
不过,你需要知道的是∶<span class=text_import2>所有的 IP Alias 都是由实体网卡模拟来的,
所以当要启动 eth0:0 时,eth0 必须要先被启动才行。而当 eth0 被关闭后,
所以 eth0:n 的模拟网卡将同时也被关闭</span>。这得先要了解才行,否则常常会搞错启动的装置啊!
在路由规则的设定当中,常常需要进行一些测试,那这个 IP Alias 就派的上用场了。
尤其是学校单位的练习环境当中! ^_^!<br /><br />
基本上,除非有特殊需求,否则建议你要有多个 IP 时,最好在不同的网卡上面达成,
如果你真的要使用 IP Alias 时,那么如何在<span class=text_import2>开机的时候就启动 IP alias</span>
呢?有两个简单的方法可以使用∶<br />
<ul>
<li><span class=text_import1>透过 /etc/rc.d/rc.local</span>∶<br />
将『ifconfig eth0:n ....』的指令写入 /etc/rc.d/rc.local 当中,这样开机的时候就能够启动这个虚拟介面,
不过这方法有个弱点,就是当使用类似『 /etc/init.d/network restart
』的指令时,该介面可能就会被取消。<br /><br />
<li><span class=text_import1>透过 /etc/sysconfig/network-scripts/ifcfg-eth0:0</span>∶<br />
举例来说,你可以透过底下这个方法来建立一个虚拟装置的设定档案∶<br />
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>cd /etc/sysconfig/network-scripts</span>
[root@linux network-scripts]# <span class=term_command>vi ifcfg-eth0:0</span>
<span class=term_write>DEVICE=eth0:0 <span class=term_say><==相当重要!一定要与档名相同的装置代号!</span>
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.0.100
NETMASK=255.255.255.0
NETWORK=192.168.0.0
BROADCAST=192.168.0.255</span>
[root@linux network-scripts]# <span class=term_command>ifup eth0:0</span>
[root@linux network-scripts]# <span class=term_command>ifdown eth0:0</span>
</pre></td></tr></table>
关于装置的设定档案内的更多参数说明,请参考<a href="0130internet_connect.php#connect_fix_IP">连上 Internet</a>
一文的相关说明,在此不再叙述!使用这个方法有个好处,就是当你使用『 /etc/init.d/network restart 』时,
系统依旧会使用你的 ifcfg-eth0:0 档案内的设定值来启动你的虚拟网卡喔!另外,
不论 ifcfg-eth0:0 内的 ONBOOT 设定值为何,<span class=text_import2>只要 ifcfg-eth0 这个实体网卡的设定档中,
ONBOOT 为 yes 时,开机就会将全部的 eth0:n 都启动</span>。<br />
</ul>
透过这两个简单的方法,你就可以在开机的时候启动你的虚拟介面而取得多个 IP 在同一张网卡上了。
不过依旧要注意的是,如果你的 eth0 是使用 DHCP 来取得 IP 参数的话,那么由于 ifup 及 /etc/init.d/network
这两个 script 内程式码撰写的方式,将会导致 ifcfg-eth0:0 这个设定档不会被使用到喔!
所以<span class=text_import2>当你使用 DHCP 来取得 eth0 的 IP 时,你只好使用手动方式
(用 ifconfig) 来设定你的 IP Alias 了</span>。<br /><br />
</div>
<hr /><a NAME="routing_double"></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class="text_h2">重复路由的问题</span><br />
<div class=block2>
很多朋友可能都有一个可爱的想法,那就是∶『<span class=text_import2>我可不可以利用两张网卡,
利用两个相同网域的 IP 来增加我这部主机的网路流量</span>』?事实上这是一个可行的方案,
不过必须要透过许多的设定来达成,若您有需求的话,可以参考网中人大哥写的这一篇∶<br />
<ul><li><a href="http://www.study-area.org/tips/multipath.htm"
target="_blank">频宽负载平衡 (http://www.study-area.org/tips/multipath.htm)</a></li></ul>
如果只是单纯的以为设定好两张网卡的 IP 在同一个网域而已,那您可就大错特错了~
为什么呢?还记得我们在路由表规则里面提过网路封包的传递主要是依据主机内的路由表规则吧!
那如果你有两张网路卡时,假设∶<br />
<ul><li>eth0 : 192.168.0.100<li>eth1 : 192.168.0.200 </ul>
那你的路由规则会是如何呢?理论上会变成这样∶<br />
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>route -n</span>
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 <span class=term_write>eth1</span>
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 <span class=term_write>eth0</span>
</pre></td></tr></table>
也就是说,<span class=text_import2>当要传送到 192.168.0.0/24 的网域时,都只会透过第一条规则
,也就是透过 eth1 来传出去,而不管是由 eth0 还是由 eth1 进来的网路封包都会透过 eth1
来回传</span>,这可能会造成一些问题,
尤其是一些防火墙的规则方面,很可能会发生一些严重的错误,
如此一来,根本没有办法达成负载平衡,也不会有增加网路流量的效果!
更惨的是,还可能发生封包传递错误的情况呐!所以说,同一部主机上面设定相同网域的 IP 时,
得要特别留意你的路由规则,一般来说,
<span class=text_import2>不应该设定同一的网段的不同 IP 在同一部主机上面</span>。
例如上面的案例就是一个不好的示范啊!<br />
</div>
</div>
<hr /><a NAME="route"></a><img src="images/penguin-m.gif" alt="大标题的图示" height="34" width="25" align="middle" /><span class="text_h1">路由器架设</span><br />
<div class=block1>
在同一的区域网路里面可以透过广播 (broadcast) 了解到 MAC 与 IP 的解析,然后透过 MAC 对 MAC 来传送资料封包,
在不同的网域里头就得要透过路由器的帮忙。那么什么是路由器?他的主要功能是什么?
底下我们就来聊一聊!<br /><br />
<hr /><a NAME="route_what"></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class="text_h2">什么是路由器</span><br />
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -