1. 程式人生 > >Linux 雙線策略路由的三種實現方式總結+埠對映

Linux 雙線策略路由的三種實現方式總結+埠對映

網路環境

伺服器(閘道器):
   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