# 8.1 路由
## 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 以后的版本中已經被克服啰!

- - - - - -
### 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 在一部主機的兩張網卡上,結果呢?很多服務都無法連通了!就是因為痛過,所以才有更強烈的印象啊!錯誤經驗學習法則 ^\_^!

- - - - - -
- 鳥哥的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 參考數據與延伸閱讀