# 8.3 動態路由器架設:quagga (zebra + ripd)
## 8.3 動態路由器架設:quagga (zebra + ripd)
在一般的靜態路由器上面,我們可以透過修改路由配置文件 (route-ethN) 來設定好既定的路由規則,讓你的路由器運作順利。不過, 這樣的方法總是覺得很討厭!如果某天因為組織的再造導致需要重新規劃子網網段,如此一來,你就得要在[圖 8.2-1](#fig8.2-1) 的 Router A 與 Linux Router 再次的處理與檢查路由規則,真是有夠麻煩的~ 那能不能讓路由器自己學習新的路由,來達成自動增加該筆路由的信息呢?
上述的功能就是所謂的動態路由。動態路由通常是用在路由器與路由器之間的溝通,所以要讓你的路由器具有動態路由的功能, 你必須要了解到對方路由器上面所提供的動態路由協議才行,這樣兩部路由器才能夠透過該協議來溝通彼此的路由規則。 目前常見的動態路由協議有:RIPv1, RIPv2, OSPF, BGP 等。
想要在 CentOS 上面搞定這些動態路由的相關機制,那就得要使用 quagga 這個軟件啦!這個軟件是 zebra 計劃的延伸, 相關的官網說明可以參考文后的參考數據([注3](#ps3))。既然要玩 quagga ,自然就得要先安裝他啰!趕緊處理吧!
```
[root@www ~]# yum install quagga
[root@www ~]# ls -l /etc/quagga
-rw-r--r--. 1 root root 406 Jun 25 20:19 ripd.conf.sample
-rw-r-----. 1 quagga quagga 26 Jul 22 11:11 zebra.conf
-rw-r--r--. 1 root root 369 Jun 25 20:19 zebra.conf.sample
.....(其他省略).....
```
這個軟件所提供的各項動態路由協議都放置到 /etc/quagga/ 目錄內,底下我們以較為簡單的 RIPv2 協議來處理動態路由, 不過你得要注意的是,不論你要啟動什么動態路由協議,那個 zebra 都必須要先啟動才行!這是因為:
- zebra 這個 daemon 的功能在更新核心的路由規則;
- RIP 這個 daemon 則是在向附近的其他 Router 溝通協調路由規則的傳送與否。
而各個路由服務的配置文件都必須要以 /etc/quagga/\*.conf 的檔名來儲存才行,如上表我們可以發現 zebra 這個服務是有設定好了,不過 ripd 的檔名卻不是 .conf 結尾。所以我們必須要額外作些設定才行。
為了練習一下我們的 quagga ,當然得要設計一下可能的網絡聯機啰~假設網絡聯機的圖標如下,共有三個區網的網段, 其中最大的是 192.168.1.0/24 這個外部區網,另有兩個內部區網分別是 192.168.100.0/24 及 192.168.200.0/24 。

圖 8.3-1、練習動態路由所設定的網絡聯機示意圖
上圖的兩部 Linux Router 分別負責不同的網域,其中 Router Z1 是上個小節設定好之后就保留的,左邊的 Router Z2 則是需要額外設定的路由器喔!兩部 Router 可以透過 192.168.1.0/24 這個網域來溝通。在沒有設定額外路由規則的情況下,那個 PC Z1 與 PC Z2 是無法溝通的!另外,quagga 必須要同時安裝在兩部 Linux Router 上頭才行, 而且我們只要設定好這兩部主機的網絡接口 (eth0, eth1) 后,不需要手動輸入額外的路由設定喔!可以透過 RIP 這個路由協議來搞定的!
- 1\. 將所有主機的 IP 設定妥當:
這是最重要的吧?請將這四部主機 (Router Z1, Router Z2, PC Z1, PC Z2) 的網絡參數,按照圖 8.3-1 的模樣設置妥當。 設置的方式請參考本章上一小節,或者是依據第四章的 4.2.1 來設定啰,這里不再重復說明了。 另外,在 Router Z1, Z2 的部分還得要加上修改 ip*forwrad 參數!亦即是 /etc/sysctl.conf 的設定值喔! 這個鳥哥也常常忘記 @*@。
- 2\. 在兩部 Router 上面設定 zebra :
我們先設定圖 8.3-1 右手邊那一部 Router Z1,關于 zebra.conf 你可以這樣設定的:
```
# 1\. 先設定會影響動態路由服務的 zebra 并且啟動 zebra
[root@www ~]# vim /etc/quagga/zebra.conf
hostname www.centos.vbird <==給予這個路由器一個主機名,隨便取!
password linuxz1 <==給予一個密碼!
enable password linuxz1 <==將這個密碼生效!
log file /var/log/quagga/zebra.log <==將所有 zebra 產生的信息存到登錄文件中
[root@www ~]# /etc/init.d/zebra start
[root@www ~]# chkconfig zebra on
[root@www ~]# netstat -tunlp | grep zebra
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:2601 0.0.0.0:* LISTEN 4409/zebra
```
仔細看,由于 zebra 這個服務的任務主要是在修改 Linux 系統核心內的路由, 所以他僅監聽本機接口而已,并不會監聽外部的接口才對!另外,在 zebra.conf 這個檔案當中, 我們所設定的那個密碼是有作用的喔!可以讓我們登入 zebra 這套軟件呢! 好了,我們來查一查這個 2601 的 port 是否正確的啟動的呢?
```
[root@www ~]# telnet localhost 2601
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
Hello, this is Quagga (version 0.99.15).
Copyright 1996-2005 Kunihiro Ishiguro, et al.
User Access Verification
Password: <==在這里輸入剛剛你設定的密碼啊!
www.centos.vbird> ? <==在這邊輸入『 ? 』就能夠知道有多少指令可使用
echo Echo a message back to the vty
enable Turn on privileged mode command
exit Exit current mode and down to previous mode
help Description of the interactive help system
list Print command list
quit Exit current mode and down to previous mode
show Show running system information
terminal Set terminal line parameters
who Display who is on vty
www.centos.vbird> list <==列出所有可用指令
echo .MESSAGE
....(中間省略)....
show debugging zebra
show history
show interface [IFNAME]
....(中間省略)....
show ip protocol
show ip route
....(其他省略)....
www.centos.vbird> show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF,
I - ISIS, B - BGP, > - selected route, * - FIB route
K>* 0.0.0.0/0 via 192.168.1.254, eth0 <==核心直接設定的
C>* 127.0.0.0/8 is directly connected, lo <==接口產生的路由
K>* 169.254.0.0/16 is directly connected, eth1 <==核心直接設定的
C>* 192.168.1.0/24 is directly connected, eth0 <==接口產生的路由
C>* 192.168.100.0/24 is directly connected, eth1 <==接口產生的路由
www.centos.vbird> exit
Connection closed by foreign host.
```
仔細看到,我們登入這個 zebra 的服務之后,可以輸入『help』或問號『?』, zebra 就會顯示出你能夠執行的指令有哪些,比較常用的當然是查詢路由規則啰!以『 show ip route 』來查閱,結果可以發現目前的接口與默認路由都被顯示出來了,顯示的結果當中:
- K :代表以類似 route 指令加入核心的路由規則,包括 route-ethN 所產生的規則;
- C :代表由你的網絡接口所設定的 IP 而產生的相關的路由規則
- S :以 zebra 功能所設定的靜態路由信息;
- R :就是透過 RIP 協議所增加的路由規則啰!
事實上,如果你還想要增加額外的靜態路由的話,也可以透過 zebra 而不必使用 route 指令呢! 例如想要增加 10.0.0.0/24 給 eth0 來處理的話,可以這樣做:
```
[root@www ~]# vim /etc/quagga/zebra.conf
# 新增底下這一行喔!
ip route 10.0.0.0/24 eth0
[root@www ~]# /etc/init.d/zebra restart
[root@www ~]# telnet localhost 2601
Password: <==這里輸入密碼
www.centos.vbird> show ip route
K>* 0.0.0.0/0 via 192.168.1.254, eth0
<u>S>* 10.0.0.0/24 [1/0] is directly connected, eth0</u>
C>* 127.0.0.0/8 is directly connected, lo
K>* 169.254.0.0/16 is directly connected, eth1
C>* 192.168.1.0/24 is directly connected, eth0
C>* 192.168.100.0/24 is directly connected, eth1
```
嘿嘿!立刻就會多出一筆路由的規則,而且最右邊會顯示 S,亦即是靜態路由 (Static route) 的意思。 如此一來,我們系統管理員可就輕松多了!設定完右邊 Router Z1 的 zebra 之后,不要忘記設定你的 Router Z2 呦! 同樣的設定再來一遍啦!只是主機名與密碼應該給予不同才是呦!因為過程都一樣,鳥哥就不再重復設定。 接下來我們可以開始看看 ripd 這個服務啰!
- 3\. 在兩部 Router 上面設定 ripd 服務:
ripd 這個服務可以在兩部 Router 之間進行路由規則的交換與溝通,當然啦,如果你的環境里面有類似 Cisco 或者是其他有提供 RIP 協議的路由器的話,那么你當然也是可以透過這個 RIP 讓你的 Linux Router 與其他硬件路由器互相溝通的吶! 只不過 CentOS 6.x 的 quagga 所提供的 ripd 服務使用的是 RIPv2 版本,這個版本預設就要求得要進行身份驗證的動作, 但是我們是個小型網絡,并不想要加入這個身份驗證的功能,因此就得要增加某些設定值才能夠順利的啟動 ripd 呦!
先來設定 Router Z1 吧!在 Router Z1 當中,我們主要是透過 eth0 發送所有的網域路由信息,同時,我們管理的網域有 192.168.1.0/24, 192.168.100.0/24。再加上取消身份驗證的設定值后,我們的 ripd 就會變成這樣:
```
[root@www ~]# vim /etc/quagga/ripd.conf
hostname www.centos.vbird <==這里是設定 Router 的主機名而已
password linuxz1 <==設定好你自己的密碼喔!
debug rip events <==可以記錄較多的錯誤訊息!
debug rip packet <==鳥哥透過這個訊息解決很多問題
router rip <==啟動 Router 的 rip 功能
version 2 <==啟動的是 RIPv2 的服務 (默認值)
network 192.168.1.0/24 <==這兩個就是我們管理的接口啰!
network 192.168.100.0/24
<u>interface eth0</u> <==針對外部的那個接口,要略過身份驗證的方式
<u>no ip rip authentication mode</u> <==就是這個項目!不要驗證身份!
log file /var/log/quagga/zebra.log <==登錄檔設定與 zebra 相同即可
[root@www ~]# /etc/init.d/ripd start
[root@www ~]# chkconfig ripd on
[root@www ~]# netstat -tulnp | grep ripd
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:2602 0.0.0.0:* LISTEN 4456/ripd
udp 0 0 0.0.0.0:520 0.0.0.0:* 4456/ripd
# 新版的 quagga 啟動的 2602 僅在 127.0.0.1,是透過 port 520 來傳遞信息!
```
基本上,這樣就設定完成一部路由器的 RIP 動態路由協議了!在上頭 ripd.conf 的設定當中, 他會主動以 eth0 及 192.168.1.0/24 這個網域的功能來進行搜索,如此一來,未來你進行任何路由規則的變動, 或者是整個網域的主機 IP 進行更動,你將不需要重新到每部 Router 上更動! 因為這些路由器會自動的更新他們自己的規則喔!嘿嘿!接下來,同樣的動作請你到 [圖 8.3-1](#fig8.3-1) 左邊那部 Router Z2 上面設定一下! 因為整個設定的流程都一樣,所以這里鳥哥就省略啦!
- 4\. 檢查 RIP 協議的溝通結果:
在兩部 Linux Router 都設定妥當之后,你可以登入 zebra 去看這兩部主機的路由更新結果喔! 舉例來說,鳥哥登入[圖 8.3-1](#fig8.3-1) 右邊那部 Router Z1 后,并且登入 zebra , 觀察路由會是這樣的情況:
```
[root@www ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.100.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.168.200.0 192.168.1.200 255.255.255.0 UG 2 0 0 eth0
0.0.0.0 192.168.1.254 0.0.0.0 UG 0 0 0 eth0
# 其實看路由就知道啦!那條有點線的就是新增的路由規則!很清楚!
[root@www ~]# telnet localhost 2601
Password: <==不要忘記了密碼啊!
www.centos.vbird> show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF,
I - ISIS, B - BGP, > - selected route, * - FIB route
K>* 0.0.0.0/0 via 192.168.1.254, eth0
S>* 10.0.0.0/24 [1/0] is directly connected, eth0
C>* 127.0.0.0/8 is directly connected, lo
K>* 169.254.0.0/16 is directly connected, eth1
C>* 192.168.1.0/24 is directly connected, eth0
C>* 192.168.100.0/24 is directly connected, eth1
R>* 192.168.200.0/24 [120/2] via 192.168.1.200, eth0, 00:02:43
```
如果你有看到上述的字體,嘿嘿!那就是成功啦!那個最左邊的 R 代表的是透過 RIP 通訊協議所設定的路由規則啦! 如此一來,咱們的路由器設定就搞定啰~如果一切都沒有問題,你也想要開機就啟動 zebra, ripd,那么還得要這樣:
```
[root@www ~]# chkconfig zebra on
[root@www ~]# chkconfig ripd on
```
透過這個 quagga 以及 RIPv2 的路由協議的輔助,我們可以輕松的就將路由規則分享到附近區網的其他路由器上頭, 比起單純使用 route 去修改 Linux 的核心路由表,這個動作當然要快速很多!不過,如果是很小型的網絡環境,那么不要使用這個 quagga 啊!因為有點多此一舉的感覺。如果你的企業環境真的有夠大,那么玩一玩這個 quagga 配合一些動態路由協議,嘿嘿!也是可行的啦!
**Tips:** 鳥哥差一點被這一版的 ripd.conf 設定內容搞死~因為 CentOS 5.x 以后的版本預設的 RIPv2 會去進行身份驗證,所以原先在 CentOS 4.x 的設定是不能用的,偏偏登錄檔又看不出個所以然..后來查到可以透過 ripd.conf 內的 debug 參數去設定除錯登錄, 才發現 RIPv2 的認證問題!最終 google 一下才解決問題~好累啊!

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