Internet Connection with Multi-Homeing
10/26/2005, 08:44
Internet Connection with Multi-Homeing

在今天的企業中,尤其是跨國的企業,網路使用率己經是非常的高。但是一般而言,大部份的公司,還是選擇使用專線(Leased Line),來連接跨國的企業內部網路。不過若是有注意到像是 IBM 或是 HP 等國際大型企業,他們的網路是國際性的,全世界都有成立分公司或據點,而且是全部經由同一段 IP address,因為其網路大都是依伴著 Internet 而建立的,意思是說:Internet 就是他們的公司內部網路。要達到這樣子的設定,在網路的設定上,必定會遇到因為分公司所在當地的國情不同,或是網路的服務商服務內容不同,而需要有不同的調整。先不談資料傳輸的保密問題,光是網路的部份就有很多需要注意的地方,尤其是因為是跨國企業,如何不因為本地網路發生的問題,或本地網路服務商發生的問題,而造成斷線,影響進而到其他地區公司的資料傳輸。

以下將專就如何在 Internet 上作線路備援,防止上面所提到的問題作討論。

一般的網際網路連線,可以大致區分為單一線路單一服務商(Internet Sservice Provider),多條線路單一網路服務商,多條線路多家網路服務商等連線方式。而因應不同的連線方式,也會有不同的備援設定。

目前來說大多的公司,都是使用單一線路單一 ISP ,那就沒有什麼備援機制好說的了。分公司使用單一線路,經由單一服務商連至 Internet ,其資料直接或先經加密後由連線傳輸到總公司,若是這條路徑所經過中的任一個點(含 ISP 內部及 ISP 的上層 ISP 等等的線路)有問題或斷線,則資料傳輸就中斷,直到服務商將連線修復。當然若是 ISP 內部的問題,大都可以得到快速的服務而回復連線,但是若是遇到比較大的災難,而連 ISP 也無法快速復原時,就會有比較大的問題,停止服務數小時至數天,則可能會造成企業很大的損失。這時若有另一備援線路可以將資料傳輸出去,就不致於令企業網路停擺。


早期的網路規劃,大都使用撥接線路,作為企業網路的對內或對外備援線路,當路由器(router)發現線路有問題時,自動啟用撥接線路,並自動將資料導向備援線路。撥接線路的選擇,大都使用較可靠而且較高速的數位式 ISDN (Integeted Service Digital Network)。 ISDN 有比較可靠的品質以及較高的頻寬(2B+D 可至128Kbps 或 144Kbps),但相對來說線路費也比一般的電話(38.4Kbps 至 56Kbps)高上許多。尤其因為是一條備用線路,平時並不使用,但還是一樣要收費。若是網際網路的線路和電話網路是同一家服務商,或是因為線路斷線的位置,正好在公司門口的電信配接箱附近,則這時就算使用二條或二條以上的線路也是一樣不通,因為固障點是一樣的位置。而在電信線路安裝時,有要求電信公司經由不同外部線路路由或電信配接箱進入公司,則可以有效防止,因外部線路的單點固障問題(Single Point Failure)而斷線。但若是固障點是在 ISP 或是電信線路商之間呢?這樣還是有可能會發生單點固障的問題。

所以若是要預防這類因為單點固障問題而造成的斷線,就只有經由不同的線路連接不同的服務商來預防,這是比較安全的方式,不過恰好也是比較花錢的方式。

而使用同家的 ISP 所提供的兩條連線服務,看來是有限度的解決了斷線的問題,但是 IP address 的 mapping 也是一個問題,一般的 ISP 連接兩條線路會給二段不相連的 IP address,而在斷線發生時,原來所使用的 IP address 己經無法 route 到 ISP 了。這時若有網路 service 放在這段位置上,就會發生無法服務的問題。解決方法是同時使用兩段 IP address 在同一部主機上而得到一半的可服務機會,或是和 ISP 協調,給一段相連的 IP address 並設定 equal cost routing 或 float static route 來解決。

在使用了多條線路及多家 ISP 之後真的問題就不見了嗎?恐怕不見得!有時才是災難的開始。當使用了多條線路連接至多家不同的 ISP 後表面上,單點固障的問題是得到解決,尤其今天的 Internet 是使用 IP 作為基本的定址方式,這樣子的網路 topology 在實體線路的備援上得到解決,但又會經由不同的層面浮現新的問題。

第一個問題是:如果花了許多預算在網路的實體線路備份上,而得到額外的頻寬,何不直接拿來平時使用,而不單單作為備援線路使用。這時在線路上的輸出(Outbound)/輸入(Inbound)封包(Packet)的負載平衡(Load balance/Load shareing)方面就要多加注意了。因為 IP 網路在設計時的特性,有些傳輸方式(TCP)會要求:送出要求封包,並期望經由相同的路徑收到回應資料。雖然這不是所有的傳輸方式都有這樣的要求,不過因為在像 TCP 的封包中含有資料的順序編號,有時若經由不同路徑傳送則在傳送時間上會要求比較嚴格,也就是說當收到第一個封包後,因第二個封包是經由不同的路徑傳送,而造成比第一個封包到達或是根本沒有送到,而需要重送等問題,反而會浪費頻寬,以及封包因重新計算的傳送延遲,還有因要 queueing 封包在 buffer 中,等待較慢送到的封包重組,而造成記憶體浪費等問題。

還有當使用多條連線至不同的 ISP (Multi-Homeing to Multi-Vendor) ,並有 service 在 Internet 上時。平時並不會有太大的問題,當多條線路中的一條斷線或是某 ISP 作系統維護而將線路暫停服務時,問題就會出現。

例如有一個 http service 在 ISP A 的線路上,但是因為某些原因斷線。這時就算還有別的線路可以連至 Internet ,而該部主機也還有網路連接並可以連至 Internet,但因為 IP address 是由 ISP routed 過來的,當和 ISP 斷線了,也代表從 Internet 來的 service request 無法找到這部主機的 IP 而產生 ICMP host/route unreachable 而無法服務。當然這可以將 HTTP sevice 主機指定二個 IP address 並分別為 ISP-A 及 ISP-C IP address 各一組而得到解決。不過若是經由直接 IP address 連接的方式,還是會發生找不到 service。

若是這部主機在 DNS (Domain Name Server)上有兩筆資料,一筆為 ISP A 的 IP ,一筆為 ISP-C 的 IP ,則當 ISP-A 斷線時,以 domain-name 來作 service 連接,就會產生時斷時好的情形,因為 DNS 會對相同的 domain name 作 round robin 而在 ISP-A / ISP-C 二組 IP 之間跳動。而產生有時從 ISP A 有時從 ISP C 送收資料的情況。而 ISP-A 的線路是不通的,所以只有一半的機會會得到服務。要解決上述問題,可以經由使用 Portable IP address 加上和 ISP之間交換 routing 來解決。

所謂的 portable IP address 是對應於 non-portable IP address。一般說來申請一條 Internet 線路,不管是 Leased Line 或是 DSL (Digital Subscribe Loop)線路, ISP 都會指定一組 IP address 給這條線路。而當需要更換 ISP 時,這組 IP 也會被 ISP 收回,並由新 ISP 再指定一組新的 IP address 使用。這種稱為 none-Protable IP address。因為 ISP 是經由上層 ISP 或稱之為 LIR (Local Internet Registies)取得一段 IP address 並在客戶申請時指定(Assignment)一小段 IP 給客戶使用,但因為一整大段 IP 是由 LIR 指定給 ISP 的所以這些 IP address 是指定給 ISP 所使用的,當轉換 ISP 時必須重新由指定客戶 release 回去給 ISP,以作重新分配。簡而這之,就是這些 IP address 是指定給該 ISP 來給其客戶使用的,當發生轉換 ISP 時 IP address 也會同時轉換。而且同時轉換後原來的主機也都需要同步更新 IP address,這對於管理網路人員來說,是很大的工程,而且在轉換時會有網路不穩的情形發生。

若是有一種 IP address 可以在轉換 ISP 時,可以直接轉換過去,直接使用原有的 IP address 不需經過修改,這將會非常方便,而這就是 Portable IP address 。這種 IP address 是由企業直接向 LIR 或是 LIR 的上層直接申請,等於是和 ISP 平行的,當轉換 ISP 時只是換線路而不用更換 IP,很方便,不過代價也不小。

那為何還是使用 non-portable IP address 居多呢?因為各 LIR 或是 IR 有對申請及使用 portable IP address 的限制:

必需至少一次申請 8個 class C 的 IP address (CIDR /21 正好是一般 Internet routing table 的最基本大小的 21 bit netmask) 。每一個 IP 價格為 $1 美金(APNIC)。再加上第一次的申請費用 -大約相等於 8個 class C IP address 的價格這樣子的價錢大都令人望而卻步了,除非是真的一定要用到。

Portable IP address 可以在各 ISP 之間作連接,但是相對的, ISP 之間的 routing 也會因為客戶使用了 Portable IP address 而多出好幾行(目前全球的 IPv4 routing table 大小約為二十二萬多條路徑)並且無法經由 route aggregation 減少 routing table 的 size。而另一方面是因為 IP address 是有限的資源。 所以 IANA (Internet Assigned Numbers Authority)才會對 Portable IP address 作嚴格的限制。

當使用了 Portable IP address 連接,這表示需要作 routing 交換,來 announce 給 Internet 上所有網路,表明有一段網路可經由這些線路到達的路徑。而現行的 Internet 上交換 Routing 的 Protocol 是使用 BGP (Border Gateway Routing Protocol)。BGP 使用 TCP port 179 來交換 routing 資料,也就是說在其下一定還有一種或以上的 routing protocol 來作為 local site 和 peer 之間的 routing 資料交換,至少也要有 Static route 。不然 BGP 使用 TCP 是無法將 routing 資料交換出去,一般中小型網路是使用 OSPF ( Open Shortest Path First),不過用 RIP (Routing Information Protocol)也是可以的,不過使用 RIP 要注意到 RIP version 的問題。因為 RIP version 1 是 classful ,在交換 routing 時是不帶有 subnet-mask,RIP version 2 是 classless 的,會帶有 subnet-mask。

要使用 BGP 交換 Internet 路由,還需要有一個 AS number (ASN: Autonomous System Number) 自治領域編號。這是 BGP 用來辦別及計算 routing 的一個編號。不同於一般的 routing protocol,RIP 使用所經過的 hop 數而 OSPF 使用線路速度所換算的 cost 來作計算。hop 或 cost 用在 local 或是可掌控的網路中是足夠了,但 BGP 是和全球的網路交換,使用 hop 或 cost 會使用得數字變很大而且有時二個 peer 之間會相隔了數個 router 或是網路,而使得 hop 及 cost 的數字變成沒有意義。使用 BGP 並沒有要求相鄰的 BGP neighbor 一定要直接連接。所以 BGP 用了 ASN 來簡化這個問題,ASN 很簡單的將一整個網路看一個 hop 而使用相同的 cost 或 metric 參數來計算網路路由。

BGP table version is 0, local router ID is 10.60.86.1
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal
Origin codes: i - IGP, e - EGP, ? - incomplete

Network Next Hop Metric LocPrf Weight Path
*> 10.60.68.0/24 10.60.74.253 0 100 200 i

*> 10.60.74.0/24 10.60.74.253 0 100 i
*> 10.60.82.0/24 10.60.74.253 0 0 100 200 i
*> 10.60.84.0/24 10.60.84.253 0 0 300 i
*> 10.60.86.0/24 0.0.0.0 0 32768 i
*> 10.60.113.0/24 10.60.84.253 0 300 400 i
*> 10.64.0.0/12 10.60.74.253 0 0 100 i
Total number of prefixes 7

有了 Portable IP address 並使用 BGP 將路由交換出去,這時在 Multi-Homeing to Mullti-Vendor 還要注意到是否會變成 transit AS ,也就是要防止成為中繼資料的交換,而占到使用的頻寬。如 ISP-A 的資料要到 ISP-B 可是因為在 BGP routing 上 best route 是經由這個連接在兩個 ISP 中的網路而幫 ISP-A 轉送資料至 ISP-C。這可以經由 BGP 的 route filtering 或 prefix-list filter 來避免。

有了 Portable IP address 並由 BGP 交換出路由,當有某一條線路發生斷線,因為有 portable IP address 及對多個 ISP 作路由交換,別的網路的服務需求,就可以經由不同的路由到達同一個 IP address 網路,而不致於發生無法服務或是找不到主機來作服務的情形。

但因為使用 portable IP adderss 作 Multi-Homeing 的價格並非平易近人,所以會這樣子作的企業並不多,但 MultiHomeing 的需求並不因此而減少,那要如何達成和使用 Portable IP address 一樣的功能呢?一個方法是使用 mirror site 或是放到 portal site,尤其是 HTTP 或 FTP 的 service。再來就是同時使用二個或以上的 IP address 在同一部主機上,並使用 DNS 來作 mapping 單一 domain name 至多個 IP address,或者使用 NAT 作二個 IP address mapping 至同一部主機,方法很多。不過這些方法都還是有各自的缺點,沒有使用 portable IP address 簡單、直接,不過因為 portable IP address 及 BGP Internet routing exchange 的最低要求門檻太高了,而且在現實的網路有很多使用了 NAT (Network Address Translate),而將部份問題解決,所以就會有很多的替代方案出現。


參考資料:

BGP http://en.wikipedia.org/wiki/BGP
Autonomous System http://www.faqs.org/rfcs/rfc3065.html
Frequently Asked Questions on Multi-homing and BGP http://info.connect.com.au/docs/routing/general/multi-faq.shtml
APNIC BGP http://www.apnic.net/stats/bgp/
APNIC http://www.apnic.net
TWNIC http://www.twnic.net
IANA http://www.iana.net
BGP Report http://bgp.potaroo.net

BGP is specified in several Request For Comments (RFCs):
RFC 1771 Describes BGP4, the current version of BGP
RFC 1654 Describes the first BGP4 specification
RFC 1105, RFC 1163, and RFC 1267 Describes versions of BGP prior to BGP4

註:本編使用 Linux GNOME AbiWorddia 編輯,gcin 作中文輪入。
Routing 使用 Zebra BGP 作測試。