熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

Linux 平台上之 Multipath Routing 應用

2013-11-13 15:24:57  來源: Oracle 

  $Date: // :: $
  
  警告:
  *****************************************************************************
  
  您因使用或不能使用本文之教學而產生之任何軟件硬件損害(包括但不限
  於直接或間接個人損害營業利潤之喪失業務中斷營業信息之遺失
  任何其它金錢損失)概不負任何損害賠償責任
  
  The author has taken care in the preparation of this paper but
  make no expressed or implied warranty of any kind and assume no
  responsibility for errors or omissions No liability is assumed for
  incidental or consequential damages in connection with or arising
  out of the use of the information or programs contained herein
  
  Linux is a registered trademark of Linus Torvalds Other product
  and company names mentioned herein may be the trademarks of their
  respective owners
  *****************************************************************************
  
  撰稿/整理: Rex Tsai
  此文件應有許多技術上得問題 請熟悉的朋友來信指教
  
  [Introduction]
  
  許多中小企業或是 Soho 甚至家庭 會在家中裝有一條以上寬頻/寬帶線路
  這篇 Tips 將介紹如何在 Linux 上 好好的應用這些資源
  
  在你使用兩家不同的 ISP 的時候 destination addressbased load
  balancing 將會是最好的解決方案 你的封包可以實時透過不同的 ISP 線路
  走出去 當然這裡所提的是從內部到外部 如果你的專線提供不同的網絡服
  務提供給網絡上得人存取 那麼接下來所說明的方式不適合您
  此篇文章只能提供內部網絡對外的 load sharing
  
  以下文章以 GNU/Debian Linux kernel iproute
  環境 所有動作請在主機前面執行
  
  假設你有兩條以上的網際網絡數據線路 (xDSL ISDN Cable whatever)
  想充分使用這些線路 概觀來看有三種方式
  
   Multiplexing
   Packetwise load balancing
   Destination addressbased load balancing
  或稱 EqualCost MultiPath Routing (ECMP)
  
  稍微解釋一下三種方式的不同
  
   Multiplexing
  
  Multiplexing 這個方式提供某些路由器提供 offerload balancing 或叫
  做 load sharing 這個方式可以讓路由器將流量分給不同的外流 ports
  但是會造成每個 port 的傳送上約有 % 的 overhead 此外 每家廠商的
  實作都是獨一的 因次你會被鎖在特定的解決方案上
  
  類似的技術是 bonding 或是 multilink 這裡所提得 Bonding 是一
  個標准 是由 Bandwidth on Demand Interoperability Group (一個大
  概有四十個制造商的協會)所提 已經提交給 American National Standards
  Institute TR group 這個通常的在於兩條數據線路都是接在同一個
  點(ISP)上的時候 因此如果是兩條不同 ISP 所提供的線路 那麼就沒辦法
  達到這個目的 當然 如果你的 ISP 不提供此項技術服務 那麼也是沒轍
  舉個例子 像是 stick multiple ISDN channels 將幾個慢速的線路合成為
  快速的一條 像是 ISDN H 規格即用到 inverse multiplexing 但通常
  用於視訊傳輸而不是電子資料
  
   Packetwise load balancing:
  
  這個在你可以得到所有的 ISP 協助的時候是可行的 如果兩家 ISP 都願意
  協助將其不同的路由器皆設定到同一個 IP 地址 那麼便可以這麼作
  
  在這個方式中 你會用到像是 sch_teql (the TEQL scheduler) 來創造一個
  virtual device 將你的封包分散在不同的網絡接口上
  
  一般來講 如果你是使用兩家不同 ISP 那麼你不可以使用這個解決方案
  但可以 將所有的網絡封包透過 IPIP or CIPE (Crypto IP Encapsu
  lation) 的方式來解決這個問題 看看 Linux Kernel 中的 IP: tunneling
  
   EqualCost MultiPath:
  
  在 Linux 核心中叫做 equal cost multipath (CONFIG_IP_ROUTE_MULTIPATH)
  比較正確的說法應該是 destination addressbased load balancing
  般 Linux 想要為某個 IP 地址找到路由 會因為效能的問題去查驗暫存(cache)
  中的資料 如果目標 IP 並沒有在暫存空間中 那麼他便會去查 routing table
  來決定該 IP 地址的路由 並將該路由放進 cache 中
  
  
  一般來講核心中的路由功能只能為某個封包決定唯一的方向 如果使用 ECMP 並
  有機會讓某個 package pattern 具有好幾種不同的方向 可以讓某個符合路由條
  件的封包透過 equal cost 或是自訂的權重來選擇該走的路由
  
  [Howto]
  
  如果你有數台計算機想使用外部網絡 一條 ADSL 不夠你使用(例如某人抓檔太凶)
  那麼這是你正在找的解決方案 你所能做的作好的方式就是每個 connection 可以
  以 nondeterministic fashion 的方式選擇路由 將 connection 分散到不同的
  Router 上 注意: 這裡所說的不是 packets 這樣 TCP/IP session 將無法連續
  
  但是這整個路由程序有兩個部份四個問題要解決
  
  a How to get your packets to the outside world
  
  b How the outside world replies to you
  
  a How the outside world sends packets to you
  
  b How you reply to the outside world
  
  Multipath 可以解決 a 出去的問題 一般的路由設定可以解決 b 與 ab
  則必須使用 policy routing (multiple tables)才能解決 Multiple Tables 可以
  讓你加入以封包來源地址為依據來決定路由
  
  以下的范例 在核心中 務必加入編譯以下選項
  
  必備:
  
  CONFIG_NETLINK=y
  這個選項是 Kernel/User netlink socket
  
  CONFIG_RTNETLINK=y
  Routing messages
  
  CONFIG_INET=y
  TCP/IP networking
  
  CONFIG_IP_ADVANCED_ROUTER=y
  IP: advanced router
  
  CONFIG_IP_MULTIPLE_TABLES=y
  IP: policy routing
  
  CONFIG_IP_ROUTE_MULTIPATH=y
  IP: equal cost multipath
  
  選用:
  
  CONFIG_IP_ROUTE_LARGE_TABLES=y
  一般來講 IP: large routing tables 也會勾選 一方面 routing
  zones 可以大於 這些數據存在 hash 數據結構中 也可以
  加速 the routing process
  
  而 iproute 套件也是必須的軟件 這個軟件的安裝方式與位置請洽詢提供
  您所使用套件之廠商/組織 (Red Hat Debian Mandrake SuSE etc)
  
  重頭戲來了 這裡假設你有三塊網絡卡 分別給內部網絡與兩家 ISP eth
  是內部網絡 eth 與 eth 是其它兩家 ISP 線路
  
  eth 是內部網絡 范圍是 /
  
  eth 其中一家 ISP IP 是 網關器(gateway)是
  
  eth 另外一家 ISP IP 是 網關器(gateway)是
  
  
  # 列出所有的 rule
  ip rule list
  
  # table 後的 是 table identifer 為數字
  # 注: 可用英文代稱取代請看 /etc/iproute/rt_tables
  #
  # table 是給在 gateway 後面的內部網絡使用 x 是 LAN 使用的 IP
  #
  # pref 後面指定的 是 priority 為 policy routing database 搜尋的次序
  
  ip rule add pref to / table
  ip route add / table dev eth
  
  # table 給 ISP # IP gateway
  # pref 後面指定的 是 priority 為 policy routing database 搜尋的次序
  ip rule add pref from table
  ip route add default table via
  
  # table is for ISP # IP gateway
  ip rule add pref from table
  ip route add default table via
  
  # 列出所有的 rule
  ip rule list
  # 列出 table 的 rule
  ip route list table
  # 列出 table 的 rule
  ip route list table
  
  # If your ISPs have servers that authenticate by originating IP address
  # (eg SMTP or NNTP servers) you will want to explicitly list them here
  
  # 這裡是靜態的 routing table 設定 如果你的 ISP 有提供某些網絡服務 必須該
  # ISP 的 IP 才能使用 那麼你會想將它設定在這裡
  # (eg Proxy SMTP or NNTP Server)
  ip route add / dev eth
  ip route add / dev eth
  
  # 如果上面所有的 rout
From:http://tw.wingwit.com/Article/program/Oracle/201311/16666.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.