## 8.1 路由
我们在[第二章网络基础](http://linux.vbird.org/linux_server/0110network_basic.php)里面谈到过[路由](http://linux.vbird.org/linux_server/0110network_basic.php#route)的相关概念, 他最大的功能就是在帮我们规划网络封包的传递方式与方向。至于路由的观察则可以使用 [route](http://linux.vbird.org/linux_server/0140networkcommand.php#route) 这个指令来查阅与设定。 好了,那么路由的形式有哪些?你又该如何确认路由是否正确呢?
* * *
### 8.1.1 路由表产生的类型
如同第二章网络基础里面谈到的,每一部主机都有自己的路由表, 也就是说,你必须要透过你自己的路由表来传递你主机的封包到下一个路由器上头。 若传送出去后,该封包就得要透过下一个路由器的路由表来传送了,此时与你自己主机的路由表就没有关系啦! 所以说,如果网络上面的某一部路由器设定错误,那...封包的流向就会发生很大的问题。 我们就得要透过 [traceroute](http://linux.vbird.org/linux_server/0140networkcommand.php#traceroute) 来尝试了解一下每个 router 的封包流向啰。
OK!那你自己主机的路由表到底有哪些部分呢?我们以底下这个路由表来说明:
```
[root@www ~]# route -n
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 <== 1
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0 <== 2
0.0.0.0 192.168.1.254 0.0.0.0 UG 0 0 0 eth0 <== 3
```
首先,我们得知道在 Linux 系统下的路由表是由小网域排列到大网域, 例如上面的路由表当中,路由是由『 192.168.1.0/24 --> 169.254.0.0/16 --> 0.0.0.0/0 (预设路由) 』来排列的。 而当主机的网络封包需要传送时,就会查阅上述的三个路由规则来了解如何将该封包传送出去。 那你会不会觉得奇怪,为什么会有这几个路由呢?其实路由表主要有这几种情况来设计的:
* 依据网络接口产生的 IP 而存在的路由:
例如 192.168.1.0/24 这个路由的存在是由于鸟哥的这部主机上面拥有 192.168.1.100 这个 IP 的关系! 也就是说,你主机上面有几个网络接口的存在时,该网络接口就会存在一个路由才对。 所以说,万一你的主机有两个网络接口时,例如 192.168.1.100, 192.168.2.100 时,那路由至少就会有:
```
[root@www ~]# ifconfig eth1 192.168.2.100
[root@www ~]# route -n
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
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 1002 0 0 eth0
0.0.0.0 192.168.1.254 0.0.0.0 UG 0 0 0 eth0
```
* 手动或预设路由(default route):
你可以使用 route 这个指令手动的给予额外的路由设定,例如那个预设路由 (0.0.0.0/0) 就是额外的路由。 使用 route 这个指令时,最重要的一个概念是:『你所规划的路由必须要是你的装置 (如 eth0) 或 IP 可以直接沟通 (broadcast) 的情况』才行。举例来说,以上述的环境来看, 我的环境里面仅有 192.168.1.100 及 192.168.2.100 ,那我如果想要连接到 192.168.5.254 这个路由器时, 下达:
```
[root@www ~]# route add -net 192.168.5.0 \
> netmask 255.255.255.0 gw 192.168.5.254
SIOCADDRT: No such process
```
看吧!系统就会响应没有办法连接到该网域,因为我们的网络接口与 192.168.5.0/24 根本就没有关系嘛! 那如果 192.168.5.254 真的是在我们的实体网络连接上,并且与我们的 eth0 连接在一起,那其实你应该是这样做:
```
[root@www ~]# route add -net 192.168.5.0 \
> netmask 255.255.255.0 dev eth0
[root@www ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.5.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
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 1002 0 0 eth0
0.0.0.0 192.168.1.254 0.0.0.0 UG 0 0 0 eth0
```
这样你的主机就会直接用 eth0 这个装置去尝试连接 192.168.5.254 了! 另外,上面路由输出的重点其实是那个『Flags 的 G 』了!因为那个 G 代表使用外部的装置作为 Gateway 的意思!而那个 Gateway (192.168.1.254) 必须要在我们的已存在的路由环境中。 这可是很重要的概念喔! ^_^
* 动态路由的学习:
除了上面这两种可以直接使用指令的方法来增加路由规则之外,还有一种透过路由器与路由器之间的协商以达成动态路由的环境, 不过,那就需要额外的软件支持了,例如: [zebra (http://www.zebra.org/)](http://www.zebra.org/what.html) 或 CentOS 上面的 [Quagga (http://www.quagga.net/)](http://www.quagga.net/about.php) 这几个软件了!
事实上,在 Linux 的路由规则都是透过核心来达成的,所以这些路由表的规则都是在核心功能内啊!也就是在内存当中喔! ^_^
* * *
### 8.1.2 一个网卡绑多个 IP: IP Alias 的测试用途
我们在[第五章的 ifconfig](http://linux.vbird.org/linux_server/0140networkcommand.php#ifconfig) 指令里面谈过 eth0:0 这个装置吧?这个装置可以在原本的 eth0 上面模拟出一个虚拟接口出来,以让我们原本的网络卡具有多个 IP ,具有多个 IP 的功能就被称为 IP Alias 了。而这个 eth0:0 的装置可以透过 [ifconfig](http://linux.vbird.org/linux_server/0140networkcommand.php#ifconfig) 或 [ip](http://linux.vbird.org/linux_server/0140networkcommand.php#ip_cmd) 这两个指令来达成, 关于这两个指令的用途请翻回去之前的章节阅读,这里不再浪费篇幅啊!
那你或许会问啊:『这个 IP Alias 有啥用途啊?』好问题!这个 IP Alias 最大的用途就是可以让你用来『应急』! 怎么说呢?我们就来聊一聊他的几个常见的用途好了:
* 测试用:
怎么说用来测试呢?举例来说,现在使用 IP 分享器的朋友很多吧,而 IP 分享器的设定通常是使用 WWW 接口来提供的。这个 IP 分享器通常会给予一个私有 IP 亦即是 192.168.0.1 来让用户开启 WWW 接口的浏览。问题来了,那你要如何连接上这部 IP 分享器呢?嘿嘿!在不更动既有的网络环境下,你可以直接利用:
```
[root@www ~]# ifconfig [device] [ IP ] netmask [netmask ip] [up|down]
[root@www ~]# ifconfig eth0:0 192.168.0.100 netmask 255.255.255.0 up
```
来建立一个虚拟的网络接口,这样就可以立刻连接上 IP 分享器了,也不会更动到你原本的网络参数设定值哩!
* 在一个实体网域中含有多个 IP 网域:
另外,如果像是在补习班或者是学校单位的话,由于原本的主机网络设定最好不要随便修改, 那如果要让同学们大家互通所有的计算机信息时,就可以让每个同学都透过 IP Alias 来设定同一网域的 IP , 如此大家就可以在同一个网段内进行各项网络服务的测试了,很不错吧!
* 既有设备无法提供更多实体网卡时:
如果你的这部主机需要连接多个网域,但该设备却无法提供安装更多的网卡时,你只好勉为其难的使用 IP Alias 来提供不同网段的联机服务了!
不过,你需要知道的是:所有的 IP Alias 都是由实体网卡仿真来的,所以当要启动 eth0:0 时,eth0 必须要先被启动才行。而当 eth0 被关闭后,所以 eth0:n 的模拟网卡将同时也被关闭。这得先要了解才行, 否则常常会搞错启动的装置啊!在路由规则的设定当中,常常需要进行一些测试,那这个 IP Alias 就派的上用场了。 尤其是学校单位的练习环境当中!
基本上,除非有特殊需求,否则建议你要有多个 IP 时,最好在不同的网卡上面达成,如果你真的要使用 IP Alias 时,那么如何在开机的时候就启动 IP alias 呢?方法有很多啦!包括将上面用 ifconfig 启动的指令写入 /etc/rc.d/rc.local 档案中 (但使用 /etc/init.d/network restart 时,该 IP alias 无法被重新启动), 但鸟哥个人比较建议使用如下的方式来处理:
* 透过建立 /etc/sysconfig/network-scripts/ifcfg-eth0:0 配置文件
举例来说,你可以透过底下这个方法来建立一个虚拟设备的配置文件案:
```
[root@www ~]# cd /etc/sysconfig/network-scripts
[root@www network-scripts]# vim ifcfg-eth0:0
DEVICE=eth0:0 <==相当重要!一定要与文件名相同的装置代号!
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.0.100
NETMASK=255.255.255.0
[root@www network-scripts]# ifup eth0:0
[root@www network-scripts]# ifdown eth0:0
[root@www network-scripts]# /etc/init.d/network restart
```
关于装置的配置文件案内的更多参数说明, 请参考[第四章 4.2.1 手动设定 IP 参数](http://linux.vbird.org/linux_server/0130internet_connect.php#connect_fix_IP)的相关说明, 在此不再叙述!使用这个方法有个好处,就是当你使用『 /etc/init.d/network restart 』时,系统依旧会使用你的 ifcfg-eth0:0 档案内的设定值来启动你的虚拟网卡喔!另外,不论 ifcfg-eth0:0 内的 ONBOOT 设定值为何,只要 ifcfg-eth0 这个实体网卡的配置文件中, ONBOOT 为 yes 时,开机就会将全部的 eth0:n 都启动。
透过这个简单的方法,你就可以在开机的时候启动你的虚拟接口而取得多个 IP 在同一张网卡上了。不过需要注意的是, 如果你的这张网卡分别透过 DHCP 以及手动的方式来设定你的 IP 参数,那么 dhcp 的取得务必使用实体网卡,亦即是 eth0 之类的网卡代号,而手动的就以 eth0:0 之类的代号来设定较佳。
**Tips:** 在旧版的 CentOS 4.x 中,如果你的 eth0 是使用 DHCP 来取得 IP 参数的话,那么由于 ifup 及 /etc/init.d/network 这两个 script 内程序代码撰写的方式,将会导致 ifcfg-eth0:0 这个配置文件不会被使用到喔!不过这个问题在 CentOS 5.x 以后的版本中已经被克服啰!
![](https://box.kancloud.cn/2016-05-13_5735736501917.gif)
* * *
### 8.1.3 重复路由的问题
很多朋友可能都有一个可爱的想法,那就是:『我可不可以利用两张网卡, 利用两个相同网域的 IP 来增加我这部主机的网络流量』?事实上这是一个可行的方案, 不过必须要透过许多的设定来达成,若你有需求的话,可以参考网中人大哥写的这一篇 ([注1](#ps1)):
* [带宽负载平衡 (http://www.study-area.org/tips/multipath.htm)](http://www.study-area.org/tips/multipath.htm)
如果只是单纯的以为设定好两张网卡的 IP 在同一个网域就能够增加你主机的两倍流量,那可就大错特错了~ 为什么呢?还记得我们在路由表规则里面提过网络封包的传递主要是依据主机内的路由表规则吧! 那如果你有两张网络卡时,假设: (底下信息请思考,不用实作!)
* eth0 : 192.168.0.100
* eth1 : 192.168.0.200
那你的路由规则会是如何呢?理论上会变成这样:
```
[root@www ~]# route -n
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 eth1
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
```
也就是说,(1)当要主动发送封包到 192.168.0.0/24 的网域时,都只会透过第一条规则 ,也就是透过 eth1 来传出去! (2)在响应封包方面,不管是由 eth0 还是由 eth1 进来的网络封包,都会透过 eth1 来回传!这可能会造成一些问题,尤其是一些防火墙的规则方面,很可能会发生一些严重的错误, 如此一来,根本没有办法达成负载平衡,也不会有增加网络流量的效果! 更惨的是,还可能发生封包传递错误的情况吶!所以说,同一部主机上面设定相同网域的 IP 时, 得要特别留意你的路由规则,一般来说,不应该设定同一的网段的不同 IP 在同一部主机上面。 例如上面的案例就是一个不好的示范啊!
**Tips:** 为什么会特别强调这个观念呢?大约 2000 年前后,鸟哥刚接触 Linux 时,由于当时的网络速度相当缓慢, 为了提升网络流量鸟哥费尽心思啊~后来想到说,如果有两片网卡,不就可以增加流量了吗?于是就设定了两个同网域的 IP 在一部主机的两张网卡上,结果呢?很多服务都无法连通了!就是因为痛过,所以才有更强烈的印象啊!错误经验学习法则 ^_^!
![](https://box.kancloud.cn/2016-05-13_5735736501917.gif)
* * *
- 鸟哥的Linux私房菜:服务器架设篇 第三版
- 第一部份:架站前的进修专区
- 作者序
- 第一章、架设服务器前的准备工作
- 1.1 前言: Linux 有啥功能
- 1.2 基本架设服务器流程
- 1.3 自我评估是否已经具有架站的能力
- 1.4 本章习题
- 第二章、基础网络概念
- 2.1 网络是个什么玩意儿
- 2.2 TCP/IP 的链结层相关协议
- 2.3 TCP/IP 的网络层相关封包与数据
- 2.4 TCP/IP 的传输层相关封包与数据
- 2.5 连上 Internet 前的准备事项
- 2.6 重点回顾:
- 2.7 本章习题
- 2.8 参考数据与延伸阅读
- 第三章、局域网络架构简介
- 3.1 局域网络的联机
- 3.2 本书使用的内部联机网络参数与通讯协议
- 第四章、连上 Internet
- 4.1 Linux 连上 Internet 前的注意事项
- 4.2 连上 Internet 的设定方法
- 4.3 无线网络--以笔记本电脑为例
- 4.4 常见问题说明
- 4.5 重点回顾
- 4.6 本章习题
- 4.7 参考数据与延伸阅读
- 第五章、 Linux 常用网络指令
- 5.1 网络参数设定使用的指令
- 5.2 网络侦错与观察指令
- 5.3 远程联机指令与实时通讯软件
- 5.4 文字接口网页浏览
- 5.5 封包撷取功能
- 5.6 重点回顾
- 5.7 本章习题
- 5.8 参考数据与延伸阅读
- 第六章、 Linux 网络侦错
- 6.1 无法联机原因分析
- 6.2 处理流程
- 6.3 本章习题
- 6.4 参考数据与延伸阅读
- 第二部分:主机的简易资安防护措施
- 第七章、网络安全与主机基本防护:限制端口, 网络升级与 SELinux
- 7.1 网络封包联机进入主机的流程
- 7.2 网络自动升级软件
- 7.3 限制联机埠口 (port)
- 7.4 SELinux 管理原则
- 7.5 被攻击后的主机修复工作
- 7.6 重点回顾
- 7.7 课后练习
- 7.8 参考数据与延伸阅读
- 第八章、路由观念与路由器设定
- 8.1 路由
- 8.2 路由器架设
- 8.3 动态路由器架设:quagga (zebra + ripd)
- 8.4 特殊状况:路由器两边界面是同一个 IP 网段: ARP Proxy
- 8.5 重点回顾
- 8.6 本章习题
- 8.7 参考数据与延伸阅读
- 第九章、防火墙与 NAT 服务器
- 9.1 认识防火墙
- 9.2 TCP Wrappers
- 9.3 Linux 的封包过滤软件:iptables
- 9.4 单机防火墙的一个实例
- 9.5 NAT 服务器的设定
- 9.6 重点回顾
- 9.7 本章习题
- 9.8 参考数据与延伸阅读
- 第十章、申请合法的主机名
- 10.1 为何需要主机名
- 10.2 注册一个合法的主机名
- 10.3 重点回顾
- 10.4 本章习题
- 10.5 参考数据与延伸阅读
- 第三部分:局域网络内常见的服务器架设
- 第十一章、远程联机服务器SSH / XDMCP / VNC / RDP
- 11.1 远程联机服务器
- 11.2 文字接口联机服务器: SSH 服务器
- 11.3 最原始图形接口: Xdmcp 服务的启用
- 11.4 华丽的图形接口: VNC 服务器
- 11.5 仿真的远程桌面系统: XRDP 服务器
- 11.6 SSH 服务器的进阶应用
- 11.7 重点回顾
- 11.8 本章习题
- 11.9 参考数据与延伸阅读
- 第十二章、网络参数控管者: DHCP 服务器
- 12.1 DHCP 运作的原理
- 12.2 DHCP 服务器端的设定
- 12.3 DHCP 客户端的设定
- 12.4 DHCP 服务器端进阶观察与使用
- 12.5 重点回顾
- 12.6 本章习题
- 12.7 参考数据与延伸阅读
- 第十三章、文件服务器之一:NFS 服务器
- 13.1 NFS 的由来与其功能
- 13.2 NFS Server 端的设定
- 13.3 NFS 客户端的设定
- 13.4 案例演练
- 13.5 重点回顾
- 13.6 本章习题
- 13.7 参考数据与延伸阅读
- 第十四章、账号控管: NIS 服务器
- 14.1 NIS 的由来与功能
- 14.2 NIS Server 端的设定
- 14.3 NIS Client 端的设定
- 14.4 NIS 搭配 NFS 的设定在丛集计算机上的应用
- 14.5 重点回顾
- 14.6 本章习题
- 14.7 参考数据与延伸阅读
- 第十五章、时间服务器: NTP 服务器
- 15.1 关于时区与网络校时的通讯协议
- 15.2 NTP 服务器的安装与设定
- 15.3 客户端的时间更新方式
- 15.4 重点回顾
- 15.5 本章习题
- 15.6 参考数据与延伸阅读
- 第十六章、文件服务器之二: SAMBA 服务器
- 16.1 什么是 SAMBA
- 16.2 SAMBA 服务器的基础设定
- 16.3 Samba 客户端软件功能
- 16.4 以 PDC 服务器提供账号管理
- 16.5 服务器简单维护与管理
- 16.6 重点回顾
- 16.7 本章习题
- 16.8 参考数据与延伸阅读
- 第十七章、区网控制者: Proxy 服务器
- 17.1 什么是代理服务器 (Proxy)
- 17.2 Proxy 服务器的基础设定
- 17.3 客户端的使用与测试
- 17.4 服务器的其他应用设定
- 17.5 重点回顾
- 17.6 本章习题
- 17.7 参考数据与延伸阅读
- 第十八章、网络驱动器装置: iSCSI 服务器
- 18.1 网络文件系统还是网络驱动器
- 18.2 iSCSI target 的设定
- 18.3 iSCSI initiator 的设定
- 18.4 重点回顾
- 18.5 本章习题
- 18.6 参考数据与延伸阅读
- 第四部分:常见因特网服务器架设
- 第十九章、主机名控制者: DNS 服务器
- 19.1 什么是 DNS
- 19.2 Client 端的设定
- 19.3 DNS 服务器的软件、种类与 cache only DNS 服务器设定
- 19.4 DNS 服务器的详细设定
- 19.5 协同工作的 DNS: Slave DNS 及子域授权设定
- 19.6 DNS 服务器的进阶设定
- 19.7 重点回顾
- 19.8 本章习题
- 19.9 参考数据与延伸阅读
- 第二十章、WWW 伺服器
- 20.1 WWW 的簡史、資源以及伺服器軟體
- 20.2 WWW (LAMP) 伺服器基本設定
- 20.3 Apache 伺服器的進階設定
- 20.4 登錄檔分析以及 PHP 強化模組
- 20.5 建立連線加密網站 (https) 及防砍站腳本
- 20.6 重點回顧
- 20.7 本章習題
- 20.8 參考資料與延伸閱讀
- 第二十一章、文件服务器之三: FTP 服务器
- 21.1 FTP 的数据链路原理
- 21.2 vsftpd 服务器基础设定
- 21.3 客户端的图形接口 FTP 联机软件
- 21.4 让 vsftpd 增加 SSL 的加密功能
- 21.5 重点回顾
- 21.6 本章习题
- 21.7 参考数据与延伸阅读
- 第二十二章、邮件服务器: Postfix
- 22.1 邮件服务器的功能与运作原理
- 22.2 MTA 服务器: Postfix 基础设定
- 22.3 MRA 服务器: dovecot 设定
- 22.4 MUA 软件:客户端的收发信软件
- 22.5 邮件服务器的进阶设定
- 22.6 重点回顾
- 22.7 本章习题
- 22.8 参考数据与延伸阅读