<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 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 以后的版本中已經被克服啰! ![](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) - - - - - -
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看