資應五甲 Linux 期末筆記

第八章、路由觀念與路由器設定

參考網址:http://linux.vbird.org/linux_server/0230router.php

路由

路由就像交通一樣, 設計良好的交通系統,可以讓我們迅速地到達世界各地,
而錯誤的交通則會讓我們塞車,甚至迷路以至於無法到達目的地,
因此在網路功能強大的Linux Server當中,正確的路由設計是相當重要的。

路由最大的功能就是在幫我們規劃網路封包的傳遞方式與方向。
至於路由的觀察則可以使用 route 這個指令來查閱與設定。

路由表產生的類型

每一部主機都有自己的路由表, 也就是說,
你必須要透過你自己的路由表來傳遞你主機的封包到下一個路由器上頭。

若傳送出去後,該封包就得要透過下一個路由器的路由表來傳送了,
此時與你自己主機的路由表就沒有關係。

route-n

這邊來解釋一下幾個上面重要的英文名詞:

  • Destination 目的地:是目的地主機位址、子網路位址、網路位址或預設路由。
    預設路由的目的地為 0.0.0.0。
  • Gateway 閘道:閘道是封包必須傳送的下一個路由器的 IP 位址。
  • Genmask 網路遮罩:網路遮罩與目的地一起使用,可決定使用路由的時機。
  • Iface 介面:介面表示用來連接下一個路由器的 LAN 或指定網路介面。

因此路由表就是我們的交通指南,Destination就像我們旅途中的目的地,Gateway就像中途的轉運站,
Genmask決定了更清楚的目的地,Iface則是我們搭乘的交通工具,
而預設路由就是我們出門時預定會先前往的地方(如火車站或機場)。

路由表是由小網域排列到大網域, 例如上面的路由表當中,
路由是由『 192.168.1.0/24 --> 169.254.0.0/16 --> 0.0.0.0/0 (預設路由) 』來排列的。
(如果這邊還是不太了解可以回顧一下四年級的網概課本或上網找一下相關資料,資源很多的。)

手動加入路由

使用 route 這個指令時,最重要的一個概念是:
你所規劃的路由必須要是你的裝置 (如 eth0) 或 IP 可以直接溝通 (broadcast) 的情況route add

動態路由

除了上面這兩種可以直接使用指令的方法來增加路由規則之外, 還有一種透過路由器與路由器之間的協商以達成動態路由的環境, 不過,那就需要額外的軟體支援了。

一個網卡綁多個 IP: IP Alias 的測試用途

如果你的這部主機需要連接多個網域,但該設備卻無法提供安裝更多的網卡時,
你只好勉為其難的使用 IP Alias 來提供不同網段的連線服務了。
不過,你需要知道的是:所有的 IP Alias 都是由實體網卡模擬來的,所以當要啟動 eth0:0 時,
eth0 必須要先被啟動才行。而當 eth0 被關閉後,所以 eth0:n 的模擬網卡將同時也被關閉。

舉例來說,你可以透過底下這個方法來建立一個虛擬裝置的設定檔案:
ifcfg-eth0:0
只要 ifcfg-eth0 這個實體網卡的設定檔中,ONBOOT為yes時,開機就會將全部的eth0:n都啟動。

重複路由的問題

可不可以利用兩張網卡, 利用兩個相同網域的 IP 來增加我這部主機的網路流量?
答案是不行,為什麼呢?我們來看一下以下的例子。
如果你有兩張網路卡時,假設:eth0 : 192.168.0.100 eth1 : 192.168.0.200
那你的路由規則會是如何呢?理論上會變成這樣:
same route 當要主動發送封包到 192.168.0.0/24 的網域時,都只會透過第一條規則,也就是只透過 eth1 來傳出去
(2)在回應封包方面,不管是由 eth0 還是由 eth1 進來的網路封包,都只會透過 eth1 來回傳
一般來說,不應該設定同一的網段的不同 IP 在同一部主機上面。 例如上面的案例就是一個不好的示範。

什麼是路由器與 IP 分享器

路由器的主要功能就是:轉遞網路封包
路由器會分析來源端封包的 IP 表頭,在表頭內找出要送達的目標 IP 後,
透過路由器本身的路由表 (routing table) 來將這個封包向下一個目標 (next hop) 傳送。

如何達到路由器的功能呢?有以下二種方法:

  • 硬體功能:即硬體路由器,這些路由器內有嵌入式的作業系統, 可以負責不同網域間的封包轉譯與轉遞等功能
  • 軟體功能:例如 Linux這個作業系統的核心就有提供封包轉遞的能力。 所以我們接下來來看一下Linux的路由功能

打開核心的封包轉遞 (IP forward) 功能

觀察核心是否已經有啟動封包轉遞
cat ip_forward
讓該檔案的內容變成啟動值 1 最簡單的方是就是使用:『echo 1 > /proc/sys/net/ipv4/ip_forward
不過,這個設定結果在下次重新開機後就會失效。因此,鳥哥建議您直接修改系統設定檔的內容,
那就是 /etc/sysctl.conf 來達成開機啟動封包轉遞的功能。
vim sysctl.conf

由於 Linux 路由器的路由表設定方法的不同,通常路由器規劃其路由的方式就有兩種:

  • 靜態路由:直接以類似 route這個指令來直接設定路由表到核心功能當中, 設定值只要與網域環境相符即可。 不過,當你的網域有變化時,路由器就得要重新設定。
  • 動態路由:透過類似 Quagga 或 zebra 軟體的功能,這些軟體可以安裝在 Linux 路由器上, 而這些軟體可以動態的偵測網域的變化,並直接修改 Linux 核心的路由表資訊。

NAT (Network Address Translation, 網路位址轉譯)

NAT 本身就是一個路由器,只是 NAT 比路由器多了一個『 IP 轉譯』的功能。
如果兩個介面一邊是公共 IP (public IP) 但一邊是私有 IP (private IP) 呢?
由於私有 IP 不能直接與公共 IP 溝通其路由資訊,此時就得要額外的『 IP 轉譯』功能了。
所以說,當路由器兩端的網域分別是 Public 與 Private IP 時,才需要 NAT 的功能。

何時需要路由器

如果是超過數百部電腦的大型企業環境,由於他們的環境通常需要考慮如下的狀況

  • 實體線路之佈線及效能的考量:在一棟大樓的不同樓層要串接所有的電腦可能有點難度, 那可以透過每個樓層架設一部路由器將實體線路分隔, 就有助於這方面的網路效能。
  • 部門獨立與保護資料的考量:可以將那些重要的電腦放到一個獨立的實體網域, 並額外加設防火牆、路由器等連接上公司內部的網域。

靜態路由之路由器

備註:這邊還滿重要的,老師有說會考圖
接下來的內容都會跟著下面的那張示意圖,可以拉出來至另一個分頁,方便觀看
假設在貴公司的網路環境當中,除了一般職員的工作用電腦是直接連接到對外的路由器來連結網際網路,
在內部其實還有一個部門需要較安全的獨立環境,因此這部份的網路規劃可能是這樣的情況
router_static
這家公司主要有兩個 class C 的網段,分別是:

  • 一般區網(192.168.1.0/24) :包括 Router A, workstation 以及 Linux Router 三部主機所構成;
  • 保護內網(192.168.100.0/24):包括 Linux Router, clientlinux, winxp, win7 等主機所構成。

其中 192.168.1.0/24 是用來做為一般員工連接網際網路用的, 至於192.168.100.0/24則是給特殊的部門用的。
workstation 代表的是一般員工的電腦,clientlinux 及 winxp, win7 則是特殊部門的工作用電腦,
Linux Router 則是這個特殊部門用來連接到公司內部網域的路由器。
在這樣的架構下,該特殊部門的封包就能夠與公司其他部門作實體的分隔了。

如果 clientlinux 想要連上 Internet,那麼他的連線情況會是如何?

  • 發起連線需求:clientlinux --> Linux Router --> Router A --> Internet
  • 回應連線需求:Internet --> Router A --> Linux Router --> clientlinux

注意Router A 必須要有兩個介面,一個是對外的 Public IP 一個則是對內的 Private IP,
因此 Router A 還需要額外增加 NAT 這個機制才行。

Linux Router的設定

linux-router-settings
且透過最後的 ping 我們也知道 Linux Router 可以連上 Router A

受保護的網域,以 clientlinux 為例

以 Linux 作業系統為例,並且 clientlinux 僅有 eth0 一張網卡時,他的設定是這樣的:
clientlinux-settings
最後一個動作有問題!怎麼會連 ping 都沒有辦法 ping 到 Router A 的 IP 呢?
表示我們的連線是有問題的!再從剛剛的回應連線需求流程來看一下吧!

  • 發起連線:clientlinux --> Linux Router (OK) --> Router A (OK)
  • 回應連線:Router A (此時 router A 要回應的目標是 192.168.100.10),Router A 僅有 public 與 192.168.1.0/24 的路由,所以該封包會由 public 介面再傳出去,因此封包就回不來了

簡單來說就是RouterA的路由表不夠完整,沒辦法將封包回送至獨立區域,
只好告知 Router A 當路由規則碰到 192.168.100.0/24 時,要將該封包傳 192.168.1.100 就是了。

特別的路由規則: Router A 所需路由

在 Router A 增加一條路由規則
router-a-add-1

不過這個規則並不會寫入到設定檔,因此下次重新開機這個規則就不見了! 你應該要建立一個路由設定檔。由於這個路由是依附在 eth0 網卡上的,
所以設定檔的檔名應該要是 route-eth0
router-a-add-2
接下來 ping 192.168.100.10 看看能不能有回應?
然後再到 clientlinux 上面去 ping 192.168.1.254 看看有沒有回應,你就知道設定成功了!

既然內部保護網路已經可以連上 Internet 了,那麼是否代表 clientlinux 可以直接與一般員工的網域,例如 workstation 進行連線呢?

  • 連線發起: clientlinux --> Linux Router (OK) --> workstation (OK)
  • 回應連線: workstation (連線目標為 192.168.100.10,因為並沒有該路由規則,因此連線丟給 default gateway,亦即是 Router A) --> Router A (OK) --> Linux Router (OK) --> clientlinux

不過回應連線竟然會偷偷透過 Router A 來幫忙,這是因為 workstation
與當初的 Router A 一樣,並不知道 192.168.100.0/24 在 192.168.1.100 裡面,
反正 Router A 已經知道了該網域在 Linux Router 內,就能正常回到 clientlinux。

讓 workstation 與 clientlinux 不透過 Router A 的溝通方式

如果是 Linux 的系統,就得在workstation底下添加設定如下:
work-to-client
透過這樣的設定方式,你也可以發現到一件事,那就是: 『路由是雙向的,你必須要瞭解出去的路由與回來時的規則

不過這裡必須要提醒的是,如果你的 Linux Router 有設定防火牆的話,
而且還有設定類似 NAT 主機的 IP 偽裝技術,那可得特別留意,因為還可能會造成路由誤判的問題。

動態路由器架設:quagga (zebra + ripd)

如果某天因為組織的再造導致需要重新規劃子網路網段,就只好再次的處理與檢查路由規則, 那能不能讓路由器自己學習新的路由,來達成自動增加該筆路由的資訊呢?

上述的功能就是所謂的動態路由。動態路由通常是用在路由器與路由器之間的溝通, 你必須要瞭解到對方路由器上面所提供的動態路由協定才行, 這樣兩部路由器才能夠透過該協定來溝通彼此的路由規則。
目前常見的動態路由協定有:RIPv1, RIPv2, OSPF, BGP 等。

常見的 Linux 上的動態路由套件為 quagga (zebra + ripd)

以下動態路由內容老師不考,有興趣的同學可參考以下網站。 http://linux.vbird.org/linux_server/0230router.php#dynamicroute