openwrt 策略路由 (帶寬疊加等應用)


linux 高級路由即基於策略的路由比傳統路由在功能上更強大,使用也更靈活,它不僅能夠根據目的地址來轉發路徑而且也能夠根據報文大小、應用或ip源地址來選擇路由轉發路徑從而讓系統管理員能輕松做到:
1、 管制某台計算機的帶寬。
2、 管制通向某台計算機的帶寬
3、 幫助你公平地共享帶寬
4、 保護你的網絡不受DOS的攻擊
5、 保護你的Internet不受到你的客戶的攻擊
6、 把多台服務器虛擬成一台,並進行負載均衡或者提高可用性
7、 限制你的用戶訪問某些計算機
8、 限制對你的計算機的訪問
9、 基於用戶帳號、MAC地址、源IP地址、端口、QOS《TOS》、時間或者content等進行路由
一、高級路由的基礎IP ROUTE2
基本命令:
ip link list 顯示ip鏈路狀態信息
ip address show 除顯示所有網絡地址
ip route show 顯示主路由表信息
ip neigh show 顯示鄰居表
linux系統路由表
linux可以自定義從1-252個路由表,
linux系統維護了4個路由表:
0#表 系統保留表
253#表 defulte table 沒特別指定的默認路由都放在改表
254#表 main table 沒指明路由表的所有路由放在該表
255#表 locale table 保存本地接口地址,廣播地址、NAT地址 由系統維護,用戶不得更改
路由表的查看可有以下二種方法:
      ip route list table table_number
      ip route list table table_name
路由表序號和表名的對應關系在/etc/iproute2/rt_tables中,可手動編輯
路由表添加完畢即時生效,下面為實例
ip route add default via 192.168.1.1 table 1 在一號表中添加默認路由為192.168.1.1
ip route add 192.168.0.0/24 via 192.168.1.2 table 1 在一號表中添加一條到192.168.0.0網段的路由為192.168.1.2
注:各路由表中應當指明默認路由,盡量不回查路由表.路由添加完畢,即可在路由規則中應用..
二、高級路由重點之一路由規則 ip rule
進行路由時,根據路由規則來進行匹配,按優先級(pref)從低到高匹配,直到找到合適的規則.所以在應用中配置默認路由是必要的..     
ip rule show 顯示路由規則
路由規則的添加
ip rule add from 192.168.1.10/32 table 1 pref 100
如果pref值不指定,則將在已有規則最小序號前插入
注:創建完路由規則若需立即生效須執行#ip route flush cache;刷新路由緩沖
    可參數解析如下:   &n
        From -- 源地址
        To -- 目的地址(這里是選擇規則時使用,查找路由表時也使用)
      Tos -- IP包頭的TOS(type of sevice)域Linux高級路由-
      Dev -- 物理接口
      Fwmark -- iptables標簽
    采取的動作除了指定路由表外,還可以指定下面的動作:
        Table 指明所使用的表
       Nat 透明網關

      Prohibit 丟棄該包,並發送 COMM.ADM.PROHIITED的ICMP信息
      Reject 單純丟棄該包
      Unreachable丟棄該包, 並發送 NET UNREACHABLE的ICMP信息
    具體格式如下:更強大,使用更靈活,它使網絡管理員不僅能
        Usage: ip rule [ list | add | del ] SELECTOR ACTION
        SELECTOR := [ from PREFIX ] [ to PREFIX ] [ tos TOS ][ dev STRING ] [ pref NUMBER ]
        ACTION := [ table TABLE_ID ] [ nat ADDRESS ][ prohibit | reject | unreachable ]
                  [ flowid CLASSID ]
        TABLE_ID := [ local | main | default | new | NUMBER ]
1.策略路由
    基於策略的路由比傳統路由在功能上更強大,使用更靈活,它使網絡管理員不僅能夠根據目的地址而且能夠根據報文大小、應用或IP源地址來選擇轉發路 徑...        
    #/etc/iproute2/rt_tables 此文件存有linux 系統路由表默認表有255 254 253三張表
      255  local 本地路由表 存有本地接口地址,廣播地址,已及NAT地址.
           local表由系統自動維護..管理員不能操作此表...
      254  main 主路由表 傳統路由表,ip route若沒指定表亦操作表254.一般存所有的路由..
           注:平時用ip ro sh查看的亦是此表設置的路由.
      253  default  默認路由表一般存放默認路由...
           注:rt_tables文件中表以數字來區分表0保留最多支持255張表
    路由表的查看可有以下二種方法:
      #ip route list table table_number
      #ip route list table table_name    路由表添加完畢,即可在策略路由表內添加路由例:      #ip route add 192.168.1.0/24 dev eth0 via 192.168.1.66 realm 4        注:發往子網192.168.1.0/24的數據包通過分類4轉發配合tc使用,后文有介紹講解...      #ip route add default via 192.168.1.1 table int1      #ip route add 192.168.1.0/24 via 192.168.1.1 table int2      #ip route add 172.16.0.2/16 via 172.16.0.1 table int3        注:各路由表中應當指明默認路由,盡量不回查路由表.路由添加完畢,即可在路由規則中應用..
    #ip rule sh 顯示路由規則
      0:      from all lookup local
      32766:  from all lookup main
      32767:  from all lookup default
    進行路由時,正是根據路由規則來進行匹配,按優先級(pref后數值)從高到低匹配,直到找到合適的規則.所以在應用中配置默認路由是必要的..   
    策略路由一般手工添加路由表,路由表的添加只需編輯rt_tables文件,規定表序號,表名即可..
    ip rule規則添加示例:
      #ip rule add from 192.168.1.112/32 [tos 0x10] table test2 pref 999 prohibit
      #ip rule add to 192.168.1.2 pref 1000 table test1
      #ip rule add from 192.168.1.0/24 pref 1001 table test1
      #ip rule add [from 0/0] table test1 pref 1003
      #ip rule add fwmark 1 pref 1002 table test2  此句型配合iptables -t mangle應用.如先對數據  包作標記:      #iptables -t mangle -A PREROUTING -p tcp -m multiport                             --dports 80,8080,20,21 -s 192.168.1.0/24 -j MARK --set-mark 1   
        注:創建完路由規則若需立即生效須執行#ip route flush cache;刷新路由緩沖
    可參數解析如下:
        From -- 源地址
        To -- 目的地址(這里是選擇規則時使用,查找路由表時也使用)
    Tos -- IP包頭的TOS(type of sevice)域
    Dev -- 物理接口
     Fwmark -- 防火牆參數
    采取的動作除了指定路由表外,還可以指定下面的動作:
        Table 指明所使用的表
       Nat 透明網關    Prohibit 丟棄該包,並發送 COMM.ADM.PROHIITED的ICMP信息
    Reject 單純丟棄該包
    Unreachable丟棄該包, 並發送 NET UNREACHABLE的ICMP信息
    具體格式如下:
        Usage: ip rule [ list | add | del ] SELECTOR ACTION
        SELECTOR := [ from PREFIX ] [ to PREFIX ] [ tos TOS ][ dev STRING ] [ pref NUMBER ]
        ACTION := [ table TABLE_ID ] [ nat ADDRESS ][ prohibit | reject | unreachable ]
                  [ flowid CLASSID ]
        TABLE_ID := [ local | main | default | new | NUMBER ]  2.網卡捆綁(網關linux+多網卡)    #modprobe bonding mod=1 miimon=200 primary=eth1 創建bond0,模式為1,主網卡eth1..    #ip addr add dev bond$ 10.0.0.1/24 設置bond0的IP    #ifenslave bond0 eth1 eth2 添加綁定的dev      注:mode=0 輪轉均衡(默認模式),此模式MAC頻繁切換導致交換機負載大..         mode=1 主備模式 用primary指定網卡         mode=4 常用 802.3ad模式,動態鏈路采集模式.此模式要求SWITCH捆綁..         miimon=ms 每隔多少毫秒查詢鏈路是否有效.      其它參數如:         arp_interval=ms         arp_ip_target=*.*.*.*    另一種網卡捆綁固化方式:      #vi /etc/modules.conf 加入以下行      alias bond0 bonding        系統在啟動時加載bonding模塊,對外虛擬網絡接口設備為 bond0..

#cd /etc/sysconfig/network-scripts
#vi ifcfg-bond0
        DEVICE=bond0
        IPADDR=11.0.0.1
        NETMASK=255.0.0.0
        NETWORK=192.168.1.0
        BROADCAST=192.168.1.255
        ONBOOT=yes
        BOOTPROTO=none
        USERCTL=no
#vi ifcfg-eth0
        DEVICE=eth0
        USERCTL=no
        ONBOOT=yes
        MASTER=bond0
        SLAVE=yes
        BOOTPROTO=none
#vi ifcfg-eth1
        DEVICE=eth0
        USERCTL=no
        ONBOOT=yes
        MASTER=bond0
        SLAVE=yes
        BOOTPROTO=none 

#/etc/init.d/network restart 重啟網絡服務驗證網卡的配置信息備份網卡被加上了NOARP標記     #cat /proc/net/bond0/info 查看bond信息  3.網橋(Linux+多網卡)    配置工具 brctlhttp://bridge.sourceforge.net/  源 碼包名:bridge-utils-*形式    安裝第一步:autoconf 后類同於源碼包安裝..    例.linu+二網卡eth0 eth1 配置成網橋      配置前去除加入網橋的eth0 eth1的IP      #ifconfig eth0/eth1 down      #ifconfig eth0/eth1 0.0.0.0 up      #brctl addbr br0      #brctl addif br0 eth0 eth1      #ip li set dev br0 up      #brctl showmacs br0 顯示網橋MAC
    撤網橋:      #ip li set dev br0 down      #brctl delif br0 eth0 eth1      #brctl delbr br0    網橋接口處亦可進行流量控制,無Ip的linux網橋可有效防御外界的功擊,對linux網橋機的總控安全性高...    貼上一篇網橋應用實例,此實例是網橋的一種擴張應用...      腳本名:start_bridge.sh      #!/bin/sh      brctl addbr net1
      brctl addif net1 eth0
      ifconfig eth0 down
      ifconfig eth0 0.0.0.0 up
      ifconfig net1 192.168.5.1 up
      #ip ro del 192.168.1.0/24 dev eth1  proto kernel  scope link  src 192.168.1.28      ip ro del 192.168.1.0/24
      #route add -net 0.0.0.0 netmask 0.0.0.0 gw 192.168.5.2      ip route add default via 192.168.5.2
      echo "1" > /proc/sys/net/ipv4/ip_forward  Linux高級路由需結合iptables才能充分體現其功能的強大,實際工作中的應用 多半基於此,當然要熟練掌握Linux高級路由+iptables 還需進一步的加強學習和實踐的應用...
指定ip 192.168.1.2全部數據走VPN網關
VPN_ifname=tap1                #openvpn接口是tap1
VPN_GATEWAY=10.0.0.1   #openvpn網關是10.0.0.1
VPN_ipaddr=10.0.0.2          #openvpn 獲取到的IP地址是10.0.0.2
vpn=100   # 路由table名
ip route add $VPN_GATEWAY dev $VPN_ifname src $VPN_ipaddr table $vpn     #指定指定路由表100 中10.0.0.1走tap1
ip route add default via $VPN_GATEWAY table $vpn                                              #指定路由表100默認網關為10.0.0.1
ip rule add from 192.168.1.2/32 table $vpn                                                               #添一個規則指定192.168.1.2 使用100表
#ip rule del from 192.168.1.2/32 table $vpn                                                              #刪除規則
ip route show table 100      #顯示路由表100
ip rule                                 #顯示規則

openwrt上簡單的負載均衡
wan_gw=$(uci -p /var/state get network.wan.gateway)
wan_ifname=$(uci -p /var/state get network.wan.ifname)
wan_ip=$(uci -p /var/state get network.wan.ipaddr)
wan1_gw=$(uci -p /var/state get network.wan1.gateway)
wan1_ifname=$(uci -p /var/state get network.wan1.ifname)
wan1_ip=$(uci -p /var/state get network.wan1.ipaddr)
echo $wan_ip    $wan_ifname    $wan_gw
echo $wan1_ip    $wan1_ifname    $wan1_gw

ip route del default
ip route del default
ip route add default scope global nexthop via $wan_gw dev $wan_ifname weight 1 nexthop via $wan1_gw dev $wan1_ifname weight 1
#ip route add default scope global nexthop dev $wan_ifname nexthop dev $wan1_ifname
#ip route replace default scope global nexthop dev $wan_ifname nexthop dev $wan1_ifname

如果就這樣可以疊加網絡,但會經常出現掉線問題.
要從指定wan過來的請求走wan出,wan1 IP過來的請求從wan1出,這樣就不會出現掉線問題。
wan_table=110
wan1_table=111
ip rule flush
ip route add $wan_gw dev $wan_ifname src $wan_ip table $wan_table        #指定指定路由表100 走wan網關
ip route add default via $wan_gw table $wan_table                                        #指定路由表100默認網關為$wan_table      
ip rule add dev $wan_ifname table $wan_table                                               #添一個規則指定從$wan_ifname的數據包 使用100表
ip rule add fwmark $wan_table  table $wan_table                                        #此句型配合iptables -t mangle應用.如先對數據  包作標記
iptables -t mangle -A PREROUTING -i eth1 -m state --state NEW -j CONNMARK --set-mark $wan_table

#iptables -t mangle -A NWANPRE -i eth1 -m state --state NEW -j CONNMARK --set-mark $wan_table

#iptables -t mangle -A PREROUTING -p tcp -m multiport --dports 80,8080,20,21 -s 192.168.1.0/24 -j MARK --set-mark 1   



示例: 實現鏈路負載平衡.加入缺省多路徑路由,讓ppp0和ppp1分擔負載(注意:scope值並非必需,它只不過是告訴內核,這個路由要經過網關而不是直連的。實際上,如果你知道遠程端點的地址,使用via參數來設置就更好了)。
  # ip route add default scope global nexthop dev ppp0 nexthop dev ppp1
  # ip route replace default scope global nexthop dev ppp0 nexthop dev ppp1
  示例4: 設置NAT路由。在轉發來自192.203.80.144的數據包之前,先進行網絡地址轉換,把這個地址轉換為193.233.7.83
  # ip route add nat 192.203.80.142 via 193.233.7.83
示例: 實現數據包級負載平衡,允許把數據包隨機從多個路由發出。weight 可以設置權重.
  # ip route replace default equalize nexthop via 211.139.218.145 dev eth0 weight 1 nexthop via 211.139.218.145 dev eth1 weight 1


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM