雙線策略路由的三種實現方式總結+端口映射

http://bbs.chinaunix.net/thread-2196440-1-1.html


網絡環境

服務器(網關):
   eth0 爲LAN口,IP爲 LAN_IP = 192.168.0.1 
   eth1 爲第一個WAN口,接電信線路,IP爲 CTC_IP,網關爲 CTC_GW
   eth2 爲第二個WAN口,接網通線路,IP爲 CNC_IP,網關爲 CNC_GW

內網網站
   HTTP_SERVER = 192.168.0.100 
    

內核打補丁

   如果你希望外網用戶,不管通過哪個IP都可以訪問到服務器或映射後的內網服務器,那麼你就需要爲內核打上補丁,
   補丁在 http://www.ssi.bg/~ja/#routes 可以下載到,在 Static, Alternative Routes, Dead Gateway Detection, NAT 找和內核對應的 patch

   下載後爲內核打上,然後在 

    Networking  --->  Networking options  --->  IP: advanced router 

    把 IP: equal cost multipath with caching support (EXPERIMENTAL) 前面的勾去掉

    如果你不想打補丁,或不想動內核,有個簡單的辦法來實現,即寫一個腳本,每隔2秒鐘刷新一次route cache

    while : ; do
        ip route flush cache
        sleep 2
    done


雙線策略的實現

1. 靜態路由方式(這種方式是最簡單的)

    1) 設置默認路由,比如電信
       ip route replace default via 電信網關 dev eth1

    2) 設置策略路由,對另外一條線路

        ip route add 網通路由表1 via 網通網關 dev eth2 metric 1
        ip route add 網通路由表2 via 網通網關 dev eth2 metric 1
        .... 

    3) 添加原路返回路由 

    策略路由規則設置完後,還要爲每條線路加入相應的 “原路返回路由”(從哪條線進來的數據,最終還是從這條線出去),不然就會出現這樣的問題:
    電信用戶通過網通的IP訪問不到服務器,網通用戶也不能通過電信IP訪問到服務器


    ip route flush table 100
    ip route add default via 電信網關 dev eth1 src 電信IP table 100 prio 50
    ip rule add from 電信IP table 100

    ip route flush table 200
    ip route add default via 網通網關 dev eth2 src 網通IP table 200 prio 50
    ip rule add from 網通IP table 200

    出來加入本身的原路返回路由之外,還應加入局域網接口的,不然通過端口映射後,內網無法通過外網IP訪問到映射後的服務器
    ip route add 192.168.0.0/24 dev eth0  scope link  src 192.168.0.1 table 100
    ip route add 192.168.0.0/24 dev eth0  scope link  src 192.168.0.1 table 200


2. 策略路由方式

    爲了方便,我們增加2個策略路由表,電信 => 100,網通 => 200,這樣再添加規則時,就可以直接用自定義的名稱來替代數字

    echo "100 ctc" >>  /etc/iproute2/rt_tables
    echo "200 cnc"  >> /etc/iproute2/rt_tables

    1)設置默認路由(電信)
    ip route replace default via 電信網關 dev eth1

    2)對網通進行基於目的地址的策略路由
    ip rule add to 網通路由表1 table cnc prio 100
    ip rule add to 網通路由表2 table cnc prio 100
    .... 

    3)添加原路返回路由

    ip route flush table ctc
    ip route add default via 電信網關 dev eth1 src 電信IP table ctc
    ip route add 192.168.0.0/24 dev eth0  scope link  src 192.168.0.1 table ctc
    ip rule add from 電信IP table ctc

    ip route flush table cnc
    ip route add default via 網通網關 dev eth2 src 網通IP table cnc
    ip route add 192.168.0.0/24 dev eth0  scope link  src 192.168.0.1 table ctc
    ip rule add from 網通IP table cnc

3. iptables打標記+iproute2 fwmark

    1)使用 CONNMARK 對連接進行標記

    外網進來數據
    iptables -t mangle -A PREROUTING -i eth1 -m conntrack  --ctstate NEW  -j CONNMARK --set-mark 0x100
    iptables -t mangle -A PREROUTING -i eth2 -m conntrack  --ctstate NEW  -j CONNMARK --set-mark 0x200

    轉發出去的數據
    iptables -t mangle -A POSTROUTING -o eth1  -m conntrack  --ctstate NEW  -j CONNMARK --set-mark 0x100
    iptables -t mangle -A POSTROUTING -o eth2  -m conntrack  --ctstate NEW  -j CONNMARK --set-mark 0x200

    局域網進來數據
    iptables -t mangle -A PREROUTING -i eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j CONNMARK --restore-mark

    本地出去數據
    iptables -t mangle -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j CONNMARK --restore-mark

   2)在 IPROUTE2 中做基於 fwmark 的策略路由

   ip rule add fwmark 0x100 table ctc prio 40
   ip rule add fwmark 0x200 table cnc prio 40

   3)添加原路返回路由

   ip route add table ctc to $CTC_NET dev eth1  scope link
   ip route add table ctc to $CNC_NET dev eth2  scope link
   ip route add table ctc to 192.168.0.0/24 dev eth0  scope link
   ip route add default via 電信網關 dev eth1 table ctc

   ip route add table cnc to $CTC_NET dev eth1 scope link
   ip route add table cnc to $CNC_NET dev eth2  scope link
   ip route add table cnc to 192.168.0.0/24 dev eth0  scope link
   ip route add default via 網通網關 dev eth2 table cnc 


Iptables/NAT 規則

     /sbin/iptables -t nat -A POSTROUTING -o eth1 -s 局域網網段 -j SNAT --to-source 電信外網IP
     /sbin/iptables -t nat -A POSTROUTING -o eth2 -s 局域網網段 -j SNAT --to-source 網通外網IP

    如果外網IP是動態的,可以用 MASQUERADE 

     /sbin/iptables -t nat -A POSTROUTING -o eth1 -s 局域網網段 -j MASQUERADE
     /sbin/iptables -t nat -A POSTROUTING -o eth2 -s 局域網網段 -j MASQUERADE


端口映射

    端口映射可以分別針對兩條線做端口映射
    比如 LAN口的IP爲 192.168.0.1,內網服務器IP爲 192.168.0.100,映射端口爲 80

    iptables -t nat -A PREROUTING -p tcp --dport 80 -d 電信IP -j DNAT --to-destination 192.168.0.100
    iptables -t nat -A PREROUTING -p tcp --dport 80 -d 網通IP -j DNAT --to-destination 192.168.0.100

    端口迴流(內網可以通過外網IP訪問映射後的服務器)
    iptables -t nat -A POSTROUTING -p tcp -s 192.168.0.0/24 --dport 80 -d 192.168.0.100 -j SNAT --to-source 192.168.0.1

    [注]:上述規則應放到 NAT 規則之前


常見問題(FAQ)

1. 不能實現 “交叉訪問” 到服務器

    即:會出現外網電信用戶只能通過電信IP訪問到服務器,而通過網通IP訪問不了;
    同理,網通用戶只能通過網通IP訪問到服務器,而通過電信IP卻訪問不了。也就是隻是單純地解決了 “內網訪問哪裏,走哪條線路” 

答:電信用戶通過網通IP訪問時,數據到達了服務器上,本應該從網通的線路返回的,但最終卻從電信的線路出去了,這樣的數據會被上層網關丟棄。

    此時需要加入 “原路返回路由” ,實現 “從哪條線來的,依然從哪條線返回“。


2. 外網用戶不能交叉訪問映射後的內網服務器

    即:電信用戶可以通過電信IP訪問到內網服務器,網通用戶可以通過網通IP訪問到內網服務器
    但是:網通用戶不能通過電信IP訪問到內網服務器,電信用戶也不能網通IP訪問到內網服務器

答:路由緩存引起的,給內核打補丁,或每隔 2 秒左右刷新路由緩存


3. 內網用戶不能通過外網IP訪問內網服務器

答:a. 沒有做SNAT(端口迴流),加入迴流規則即可
     b. 加入 ”原路返回路由“ 時,沒有將局域網的路由加入進去


深入探討

1. 上述三種方式哪一種效率最高? 如何來評估 ?

2. 雙線失效保護,即掉線自動切換的實現(定時探測每條線路的連通性)
    可參考 http://linux.chinaunix.net/bbs/v ... p;highlight=coolend

3. 通過***方式實現虛擬雙線,即傳說中的“借線”

4. 內網訪問指定外網IP時走指定線路,指定內網IP上網走指定線路

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章