配置電信網通雙線雙IP的解決辦法

robbin發表於2009-09-01
做網際網路網站,最頭疼的事情之一就是電信和網通的互聯互不通了,為了能夠讓北方網通和南方電信使用者都可以快速的訪問網站,解決辦法就是託管到雙線機房。雙線機房有兩類,一類是通過BGP技術實現互聯互通,伺服器只需要一個網路卡一個IP地址就可以了,由機房進行路由的智慧判斷,選擇合適的路由訪問,這樣對於網站來說是很方便的,比方說上海移動的怒江機房,上海地面通的自建機房,科技網的機房,但BGP機房一般頻寬都比較少,流量高一些的話可能就沒有辦法了。另外一種就是雙線雙IP的機房,頻寬可能更高一些,但是路由配置極其複雜,比方說上海電信的市北機房。

因為和諧的原因,JavaEye網站伺服器最近被迫從原來的移動怒江雙線機房當中搬了出去,由託管商推薦到了上海市北雙線機房,市北雙線機房實際上是電信機房,但是從天津網通拉了2G專線過來,因此伺服器需要至少兩個網路卡,一個網路卡接電信閘道器,一個網路卡接網通閘道器,來實現互聯互通。如果多臺伺服器的話,還需要第3個網路卡組建內網進行內網通訊。

對於雙線雙IP的伺服器來說,要解決兩個問題:

一、你的網站使用者究竟走那個IP來訪問你的伺服器
二、你的網站內容究竟走那個IP返回給使用者

對於第1個問題,可以使用智慧DNS解析來解決,即DNS伺服器判斷使用者所在IP地址,如果使用者是電信接入,就把伺服器的電信IP解析給他;如果使用者是網通接入,就把伺服器的網通IP解析給他。

智慧DNS可以自己基於開源的DNS軟體來定製,不過國內有一個很好的免費智慧DNS伺服器提供商:[url=http://www.dnspod.com]DNSPod[/url],推薦使用DNSPod的服務。他就可以實現上述的智慧DNS解析。

對於第2個問題,則需要在伺服器上面配置路由規則,來決定究竟如何處理資料的返回路徑問題。

1、填寫靜態路由表

因為伺服器有兩個IP,分別在不同的網段,你使用電信IP的閘道器做路由,那麼網通的IP地址使用者壓根就訪問不到,反之亦然。目前流行的解決辦法,就是使用電信閘道器做預設的路由,然後自己手工填寫所有網通IP地址段的路由規則。這個辦法可以Google搜尋到一大把,不展開了。

這種辦法的缺點是新增規則太多太麻煩,而且難免掛一漏萬,如果你漏了一些網段,那這些網段的使用者就訪問不了你的網站了。況且網段地址的分佈總是在不斷變化的,你還必須定期更新路由表。

2、根據使用者訪問進來的路徑設定動態路由

就是說如果使用者是通過電信IP地址訪問過來的話,那麼使用電信閘道器做路由,返回內容走電信閘道器;如果使用者通過網通IP地址訪問過來的話,那麼使用網通閘道器做路由,返回內容走網通的閘道器,這樣就不必那麼麻煩的維護路由表了。以JavaEye網站伺服器為例,具體配置方法如下:

JavaEye網站伺服器電信IP:114.80.66.199,電信閘道器:114.80.66.1
JavaEye網站伺服器網通IP:60.29.231.190,網通閘道器:60.29.231.1

1) 預設閘道器使用電信閘道器作為路由

在Linux上面配置預設閘道器,如果是RedHat,應該是在/etc/sysconfig/network檔案裡面新增一行:GATEWAY=114.80.66.1,如果是SuSE,應該是在/etc/sysconfig/network/routes裡面新增一行:default 114.80.66.1 - - 或者可以直接使用YaST2來配置。

2)新增路由表

修改/etc/iproute2/rt_tables,新增內容:
252 tel 電信路由表
251 cnc 網通路由表


然後手工新增路由規則,在Console裡面執行如下命令:

#新增原路返回路由
ip route flush table tel
ip route add default via 114.80.66.1 dev eth0 src 114.80.66.199 table tel
ip rule add from 114.80.66.199 table tel

ip route flush table cnc
ip route add default via 60.29.231.1 dev eth1 src 60.29.231.190 table cnc
ip rule add from 60.29.231.190 table cnc


即讓從電信IP過來的請求按照電信路由返回,從網通IP過來的請求從網通路由返回。這樣就搞定了,是不是很簡單?這個辦法是bobo同學提供的,感謝他。

3) 把路由規則寫入啟動指令碼

如果伺服器重啟,或者網路服務重啟,上述的路由規則就失效了,所以你需要把上面這段命令寫入系統啟動指令碼和網路啟動指令碼

如果是RedHat,系統啟動指令碼是/etc/rc.d/rc.local
如果是SuSE,可以自己寫一個啟動指令碼,連結到S99上,比方說/etc/init.d/rc.local

如果是RedHat,網路啟動指令碼是/etc/rc.d/init.d/network
如果是SuSE,網路啟動指令碼是/etc/init.d/network

相關文章