ip route rule 路由策略 高級路由 捆綁 網橋

http://lwfs.net/2005/11/28/10/css

#!/bin/bash

    IP0=
    IP1=
    GW0=
    GW1=
    NET0=
    NET1=
    DEV0=eth0
    DEV1=eth1

    # comment the next two line after first run this script.
    echo 200 cernet >>/etc/iproute2/rt_tables
    echo 210 chinanet >>/etc/iproute2/rt_tables

    ip route add ${NET0} dev ${DEV0} src ${IP0} table cernet
    ip route add default via ${GW0} table cernet
    ip route add ${NET1} dev ${DEV1} src ${IP1} table chinanet
    ip route add default via ${GW1} table chinanet
    ip route add ${NET0} dev ${DEV0} src ${IP0}
    ip route add ${NET1} dev ${DEV1} src ${IP1}

    # delete old rule
    ip rule del from ${IP0}
    ip rule del from ${IP1}
    # setup new rule
    ip rule add from ${IP0} table cernet
    ip rule add from ${IP1} table chinanet 



http://jpuyy.com/2014/01/ip-rule-and-ip-route.html

ip rule和 ip route

相對ip route ,ip rule是高級路由,能實現不一樣條件路由的轉發。html

linux系統維護了路由表,用ip rule show能夠查看路由表。node

# ip rule show
0: from all lookup local 
32766: from all lookup main 
32767: from all lookup default

路由表記錄在/etc/iproute2/rt_tables文件中,默認裏面會用這麼幾行,在這個文件裏添加的路由表即時生效linux

255 local
254 main
253 default
0 unspec

因此自定義一個路由表的時候,序號要在1-252之間,路由選擇的優先級也與數字的大小有關,越小的優先級越高,先匹配。
數字後面要規定一個別名,方便使用和辨認。算法

這樣路由表的查看可有如下兩種方法:shell

ip route list table table_number
ip route list table table_name

如查看默認路由表可用以下命令數據庫

ip route list table main
ip route list table 254

路由表添加完以後,接下來就是對路由表的操做,若是我有編程

eth1 配置ip 192.168.1.8/24 路由表 101 mytable1ubuntu

eth2 配置ip  192.168.2.8/24 路由表 102 mytable2數組

不一樣段的從不一樣的網卡走。

ip route add 192.168.1.0 dev eth1 src 192.168.1.8 table mytable1
ip route add default via 192.168.1.1 table mytable1
ip rule add from 192.168.1.8 table mytable1

ip route add 192.168.2.0 dev eth2 src 192.168.2.8 table mytable2
ip route add default via 192.168.2.1 table mytable2
ip rule add from 192.168.2.8 table mytable2

如今使用ip rule show查看

# ip rule show
 0: from all lookup local
 32764: from 192.168.2.8 lookup mytable2
 32765: from 192.168.1.8 lookup mytable1
 32766: from all lookup main
 32767: from all lookup default

這時要刪除rule可以使用

ip rule del prio 32764

ip rule還能夠實現更高級的功能,好比根據ip目的地址,包大小來進行轉發。

查看route -n flag

The flags

Following is the list of flags and their significance in the routing table :

U : This flag signifies that the route is up
G : This flag signifies that the route is to a gateway. If this flag is not present then we can say that the route is to a directly connected destination
H : This flag signifies that the route is to a host which means that the destination is a complete host address. If this flag is not present then it can be assumed that the route is to a network and destination would be a network address.
D : This flag signifies that this route is created by a redirect.
M : This flag signifies that this route is modified by a redirect.

 
 
http://blog.csdn.net/bytxl/article/details/9850803

策略路由以及使用 ip route , ip rule , iptables 配置策略路由實例

分類: 網絡 linux 命令2013-08-09 10:36 560人閱讀 評論(0) 收藏 舉報
 

目錄(?)[+]

 

http://blog.sina.com.cn/s/blog_659b48590100n2q6.html

例:

 

公司內網要求192.168.0.100之內的使用 10.0.0.1 網關上網(電信),其餘IP使用 20.0.0.1 (網通)上網。
 
首先要在網關服務器上添加一個默認路由,固然這個指向是絕大多數的IP的出口網關。
 
# ip route add default gw 20.0.0.1
 
以後經過 ip route 添加一個路由表
 
# ip route add table 3 via 10.0.0.1 dev ethX
 (ethX是10.0.0.1所在的網卡,3 是路由表的編號)
 
以後添加 ip  rule 規則
 
# ip rule add fwmark 3  table 3 
(fwmark 3是標記,table 3 是路由表3 上邊。 意思就是凡是標記了 3 的數據使用table3 路由表)
 
以後使用iptables給相應的數據打上標記:
 
# iptables -A PREROUTING -t mangle -i eth0 -s 192.168.0.1 -192.168.0.100 -j MARK --set-mark 3
 
由於mangle的處理是優先於 nat 和fiter表的,因此相應數據包到達以後先打上標記,以後再經過ip rule規則。對應的數據包使用相應的路由表進行路由,最後讀取路由表信息,將數據包送出網關。

 

-------------------------------------------------------------------------------------------------------------------------------------

 

ip rule 命令

linux 高級路由即基於策略的路由,比傳統路由在功能上更強大,使用也更靈活,它不只可以像傳統路由同樣,根據目的地址來轉發數據,並且也可以根據報文大小、應用,協議或ip源地址來選擇路由轉發路徑從而讓系統管理員能輕鬆作到:
一、 管制某臺計算機的帶寬。
二、 管制通向某臺計算機的帶寬
三、 幫助你公平地共享帶寬
四、 保護你的網絡不受DOS的攻擊
五、 保護你的Internet不受到你的客戶的攻擊
六、 把多臺服務器虛擬成一臺,並進行負載均衡或者提升可用性
七、 限制你的用戶訪問某些計算機
八、 限制對你的計算機的訪問
九、 基於用戶賬號、MAC地址、源IP地址、端口、QOS《TOS》、時間或者content等進行路由

 

1、高級路由的基礎IP ROUTE2

基本命令:

ip link list 顯示ip鏈路狀態信息
ip address show 除顯示全部網絡地址
ip route show 顯示主路由表信息
ip neigh show 顯示鄰居表

linux系統路由表

linux能夠自定義從1-252個路由表,
linux系統維護了4個路由表:
0表 系統保留表
 
255  local 本地路由表,存有本地接口地址,廣播地址,以及NAT地址。
     local表由系統自動維護,管理員不能操做此表。
254  main 主路由表,傳統路由表,ip route若沒指定表即操做表254。
     注:平時用route查看的亦是此表設置的路由。
253  default  默認路由表通常存放默認路由。
     注:rt_tables文件中表以數字來區分表,保留最多支持255張表。

路由表的查看可有如下二種方法:
      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                       在1表中添加默認路由爲192.168.1.1
# ip route add 192.168.0.0/24 via 192.168.1.2                     添加一條到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
刷新路由緩衝。
 
命令格式以下:
        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 ]

    參數解析以下:
        From -- 源地址
        To -- 目的地址(這裏是選擇規則時使用,查找路由表時也使用)
  Tos -- IP包頭的TOS(type of sevice)域Linux高級路由-
  Dev -- 物理接口
     Fwmark -- iptables標籤
    採起的動做除了指定路由表外,還能夠指定下面的動做:
        Table 指明所使用的表
      Nat 透明網關
   Prohibit 丟棄該包,併發送 COMM.ADM.PROHIITED的ICMP信息 
   Reject 單純丟棄該包
   Unreachable丟棄該包, 併發送 NET UNREACHABLE的ICMP信息
 
    路由表添加完畢,便可在策略路由表內添加路由。
例:
      #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  )
 
  Linux高級路由需結合iptables才能充分體現其功能的強大,實際工做中的應用多半基於此,固然要熟練掌握Linux高級路由+iptables 還需進一步的增強學習和實踐的應用。
 

route 命令

使用 Route 命令行工具查看並編輯計算機的 IP 路由表。Route 命令和語法以下所示:
route [-f] [-p] [Command [Destination] [mask Netmask] [Gateway] [metric Metric]] [if Interface]]
-f 清除全部網關入口的路由表。  
-p 與 add 命令一塊兒使用時使路由具備永久性。 
Command 指定您想運行的命令 (Add/Change/Delete/Print)。 
Destination 指定該路由的網絡目標。  
mask Netmask 指定與網絡目標相關的網絡掩碼(也被稱做子網掩碼)。  
Gateway 指定網絡目標定義的地址集和子網掩碼能夠到達的前進或下一躍點 IP 地址。  
metric Metric 爲路由指定一個整數成本值標(從 1 至 ArrayArrayArrayArray),當在路由表(與轉發的數據包目標地址最匹配)的多個路由中進行選擇時能夠使用。  
if Interface 爲能夠訪問目標的接口指定接口索引。若要得到一個接口列表和它們相應的接口索引,使用 route print 命令的顯示功能。能夠使用十進制或十六進制值進行接口索引。 
/?  在命令提示符處顯示幫助。  
示例:

使用route 命令添加的路由,機器重啓或者網卡重啓後路由就失效了,方法:

  //添加到主機的路由

  # route add –host 192.168.168.110 dev eth0

  # route add –host 192.168.168.119 gw 192.168.168.1

  //添加到網絡的路由

  # route add –net IP netmask MASK eth0

  # route add –net IP netmask MASK gw IP

  # route add –net IP/24 eth1

  //添加默認網關

  # route add default gw IP

  //刪除路由

  # route del –host 192.168.168.110 dev eth0

添加一條路由(發往192.168.62這個網段的所有要通過網關192.168.1.1:
  route add -net 192.168.62.0 netmask 255.255.255.0 gw 192.168.1.1

  刪除一條路由
  route del -net 192.168.122.0 netmask 255.255.255.0
  刪除的時候不用寫網關。


若要顯示 IP 路由表的所有內容,請鍵入:
# route print

Kernel IP routing table

  Destination Gateway Genmask Flags Metric Ref Use Iface

  10.147.9.0 * 255.255.255.0 U 1 0 0 eth0

  192.168.1.0 * 255.255.255.0 U 2 0 0 wlan0

  192.168.122.0 * 255.255.255.0 U 0 0 0 virbr0

  link-local * 255.255.0.0 U 1000 0 0 eth0

  192.168.0.0 192.168.1.1 255.255.0.0 UG 0 0 0 wlan0

  default 10.147.9.1 0.0.0.0 UG 0 0 0 eth0

  root@Ubuntu:~#

  結果是自上而下, 就是說, 哪條在前面, 哪條就有優先, 前面都沒有, 就用最後一條default。


若要顯示以 10. 起始的 IP 路由表中的路由,請鍵入:
route print 10.*
若要添加帶有 1Array2.168.12.1 默認網關地址的默認路由,請鍵入:
route add 0.0.0.0 mask 0.0.0.0 1Array2.168.12.1
若要向帶有 255.255.0.0 子網掩碼和 10.27.0.1 下一躍點地址的 10.41.0.0 目標中添加一個路由,請鍵入:
route add 10.41.0.0 mask 255.255.0.0 10.27.0.1
若要向帶有 255.255.0.0 子網掩碼和 10.27.0.1 下一躍點地址的 10.41.0.0 目標中添加一個永久路由,請鍵入:
route -p add 10.41.0.0 mask 255.255.0.0 10.27.0.1
若要向帶有 255.255.0.0 子網掩碼、10.27.0.1 下一躍點地址且其成本值標爲 7 的 10.41.0.0 目標中添加一個路由,請鍵入:
route add 10.41.0.0 mask 255.255.0.0 10.27.0.1 metric 7
若要向帶有 255.255.0.0 子網掩碼、10.27.0.1 下一躍點地址且使用 0x3 接口索引的 10.41.0.0 目標中添加一個路由,請鍵入:
route add 10.41.0.0 mask 255.255.0.0 10.27.0.1 if 0x3
若要刪除到帶有 255.255.0.0 子網掩碼的 10.41.0.0 目標的路由,請鍵入:
route delete 10.41.0.0 mask 255.255.0.0
若要刪除以 10. 起始的 IP 路由表中的全部路由,請鍵入:
route delete 10.*
若要將帶有 10.41.0.0 目標和 255.255.0.0 子網掩碼的下一躍點地址從 10.27.0.1 修改成 10.27.0.25,請鍵入:
route change 10.41.0.0 mask 255.255.0.0 10.27.0.25

ip命令的語法

  ip命令的用法以下:
  ip [OPTIONS] OBJECT [COMMAND [ARGUMENTS]]
  4.1 ip link set--改變設備的屬性. 縮寫:set、s
  示例1:up/down 起動/關閉設備。
  # ip link set dev eth0 up
  這個等於傳統的 # ifconfig eth0 up(down)
  示例2:改變設備傳輸隊列的長度。
  參數:txqueuelen NUMBER或者txqlen NUMBER
  # ip link set dev eth0 txqueuelen 100
  示例3:改變網絡設備MTU(最大傳輸單元)的值。
  # ip link set dev eth0 mtu 1500
  示例4: 修改網絡設備的MAC地址。
  參數: address LLADDRESS
  # ip link set dev eth0 address 00:01:4f:00:15:f1
  4.2 ip link show--顯示設備屬性. 縮寫:show、list、lst、sh、ls、l
  -s選項出現兩次或者更屢次,ip會輸出更爲詳細的錯誤信息統計。
  示例:
  # ip -s -s link ls eth0
  eth0: mtu 1500 qdisc cbq qlen 100
  link/ether 00:a0:cc:66:18:78 brd ff:ff:ff:ff:ff:ff
  RX: bytes packets errors dropped overrun mcast
  2449949362 2786187 0 0 0 0
  RX errors: length crc fifo missed
  0 0 0 0 0
  TX: bytes packets errors dropped carrier collsns
  178558497 1783946 332 0 332 35172
  TX errors: aborted fifo window heartbeat
  0 0 0 332
  這個命令等於傳統的 ifconfig eth0
  5.1 ip address add--添加一個新的協議地址. 縮寫:add、a
  示例1:爲每一個地址設置一個字符串做爲標籤。爲了和Linux-2.0的網絡別名兼容,這個字符串必須以設備名開頭,接着一個冒號,
  # ip addr add local 192.168.4.1/28 brd + label eth0:1 dev eth0
  示例2: 在以太網接口eth0上增長一個地址192.168.20.0,掩碼長度爲24位(155.155.155.0),標準廣播地址,標籤爲eth0:Alias:
  # ip addr add 192.168.4.2/24 brd + dev eth1 label eth1:1
  這個命令等於傳統的: ifconfig eth1:1 192.168.4.2
  5.2 ip address delete--刪除一個協議地址. 縮寫:delete、del、d
  # ip addr del 192.168.4.1/24 brd + dev eth0 label eth0:Alias1
  5.3 ip address show--顯示協議地址. 縮寫:show、list、lst、sh、ls、l
  # ip addr ls eth0
  5.4.ip address flush--清除協議地址. 縮寫:flush、f
  示例1 : 刪除屬於私網10.0.0.0/8的全部地址:
  # ip -s -s a f to 10/8
  示例2 : 取消全部以太網卡的IP地址
  # ip -4 addr flush label "eth0"
  6. ip neighbour--neighbour/arp表管理命令
  縮寫 neighbour、neighbor、neigh、n
  命令 add、change、replace、delete、fulsh、show(或者list)
  6.1 ip neighbour add -- 添加一個新的鄰接條目
  ip neighbour change--修改一個現有的條目
  ip neighbour replace--替換一個已有的條目
  縮寫:add、a;change、chg;replace、repl
  示例1: 在設備eth0上,爲地址10.0.0.3添加一個permanent ARP條目:
  # ip neigh add 10.0.0.3 lladdr 0:0:0:0:0:1 dev eth0 nud perm
  示例2:把狀態改成reachable
  # ip neigh chg 10.0.0.3 dev eth0 nud reachable
  6.2.ip neighbour delete--刪除一個鄰接條目
  示例1:刪除設備eth0上的一個ARP條目10.0.0.3
  # ip neigh del 10.0.0.3 dev eth0
  6.3.ip neighbour show--顯示網絡鄰居的信息. 縮寫:show、list、sh、ls
  示例1: # ip -s n ls 193.233.7.254
  193.233.7.254. dev eth0 lladdr 00:00:0c:76:3f:85 ref 5 used 12/13/20 nud reachable
  6.4.ip neighbour flush--清除鄰接條目. 縮寫:flush、f
  示例1: (-s 能夠顯示詳細信息)
  # ip -s -s n f 193.233.7.254
  7. 路由表管理
  7.1.縮寫 route、ro、r
  7.2.路由表
  從Linux-2.2開始,內核把路由概括到許多路由表中,這些表都進行了編號,編號數字的範圍是1到255。另外,
  爲了方便,還能夠在/etc/iproute2/rt_tables中爲路由表命名。
  默認狀況下,全部的路由都會被插入到表main(編號254)中。在進行路由查詢時,內核只使用路由表main。
  7.3.ip route add -- 添加新路由
  ip route change -- 修改路由
  ip route replace -- 替換已有的路由
  縮寫:add、a;change、chg;replace、repl
  示例1: 設置到網絡10.0.0/24的路由通過網關193.233.7.65
  # ip route add 10.0.0/24 via 193.233.7.65
  示例2: 修改到網絡10.0.0/24的直接路由,使其通過設備dummy
  # ip route chg 10.0.0/24 dev dummy
  示例3: 實現鏈路負載平衡.加入缺省多路徑路由,讓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
  示例5: 實現數據包級負載平衡,容許把數據包隨機從多個路由發出。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
  7.4.ip route delete-- 刪除路由
  縮寫:delete、del、d
  示例1:刪除上一節命令加入的多路徑路由
  # ip route del default scope global nexthop dev ppp0 nexthop dev ppp1
  7.5.ip route show -- 列出路由
  縮寫:show、list、sh、ls、l
  示例1: 計算使用gated/bgp協議的路由個數
  # ip route ls proto gated/bgp |wc
  1413 9891 79010
  示例2: 計算路由緩存裏面的條數,因爲被緩存路由的屬性可能大於一行,以此須要使用-o選項
  # ip -o route ls cloned |wc
  159 2543 18707
  示例3: 列出路由表TABLEID裏面的路由。缺省設置是table main。TABLEID或者是一個真正的路由表ID或者是/etc/iproute2/rt_tables文件定義的字符串,
  或者是如下的特殊值:
  all -- 列出全部表的路由;
  cache -- 列出路由緩存的內容。
  ip ro ls 193.233.7.82 tab cache
  示例4: 列出某個路由表的內容
  # ip route ls table fddi153
  示例5: 列出默認路由表的內容
  # ip route ls
  這個命令等於傳統的: route
  7.6.ip route flush -- 擦除路由表
  示例1: 刪除路由表main中的全部網關路由(示例:在路由監控程序掛掉以後):
  # ip -4 ro flush scope global type unicast
  示例2:清除全部被克隆出來的IPv6路由:
  # ip -6 -s -s ro flush cache
  示例3: 在gated程序掛掉以後,清除全部的BGP路由:
  # ip -s ro f proto gated/bgp
  示例4: 清除全部ipv4路由cache
  # ip route flush cache
  *** IPv4 routing cache is flushed.
  7.7 ip route get -- 得到單個路由 .縮寫:get、g
  使用這個命令能夠得到到達目的地址的一個路由以及它的確切內容。
  ip route get命令和ip route show命令執行的操做是不一樣的。ip route show命令只是顯示現有的路由,而ip route get命令在必要時會派生出新的路由。
  示例1: 搜索到193.233.7.82的路由
  # ip route get 193.233.7.82
  193.233.7.82 dev eth0 src 193.233.7.65 realms inr.ac cache mtu 1500 rtt 300
  示例2: 搜索目的地址是193.233.7.82,來自193.233.7.82,從eth0設備到達的路由(這條命令會產生一條很是有意思的路由,這是一條到193.233.7.82的迴環路由)
  # ip r g 193.233.7.82 from 193.233.7.82 iif eth0
  193.233.7.82 from 193.233.7.82 dev eth0 src 193.233.7.65 realms inr.ac/inr.ac
  cache 
 mtu 1500 rtt 300 iif eth0
  8. ip route -- 路由策略數據庫管理命令
  命令
  add、delete、show(或者list)
  注意:策略路由(policy routing)不等於路由策略(rouing policy)。
  在某些狀況下,咱們不僅是須要經過數據包的目的地址決定路由,可能還須要經過其餘一些域:源地址、IP協議、傳輸層端口甚至數據包的負載。
  這就叫作:策略路由(policy routing)。
  8.1. ip rule add -- 插入新的規則
  ip rule delete -- 刪除規則
  縮寫:add、a;delete、del、d
  示例1: 經過路由表inr.ruhep路由來自源地址爲192.203.80/24的數據包
  ip ru add from 192.203.80/24 table inr.ruhep prio 220
  示例2:把源地址爲193.233.7.83的數據報的源地址轉換爲192.203.80.144,並經過表1進行路由
  ip ru add from 193.233.7.83 nat 192.203.80.144 table 1 prio 320
  示例3:刪除無用的缺省規則
  ip ru del prio 32767
  8.2. ip rule show -- 列出路由規則
  縮寫:show、list、sh、ls、l
  示例1: # ip ru ls
  0: from all lookup local
  32762: from 192.168.4.89 lookup fddi153
  32764: from 192.168.4.88 lookup fddi153
  32766: from all lookup main
  32767: from all lookup 253
  9. ip maddress -- 多播地址管理
  縮寫:show、list、sh、ls、l
  9.1.ip maddress show -- 列出多播地址
  示例1: # ip maddr ls dummy
  9.2. ip maddress add -- 加入多播地址
  ip maddress delete -- 刪除多播地址
  縮寫:add、a;delete、del、d
  使用這兩個命令,咱們能夠添加/刪除在網絡接口上監聽的鏈路層多播地址。這個命令只能管理鏈路層地址。
  示例1: 增長 # ip maddr add 33:33:00:00:00:01 dev dummy
  示例2: 查看 # ip -O maddr ls dummy
  2: dummy
  link 33:33:00:00:00:01 users 2 static
  link 01:00:5e:00:00:01
  示例3: 刪除 # ip maddr del 33:33:00:00:00:01 dev dummy
  10.ip mroute -- 多播路由緩存管理
  10.1. ip mroute show -- 列出多播路由緩存條目
  縮寫:show、list、sh、ls、l
  示例1:查看 # ip mroute ls
  (193.232.127.6, 224.0.1.39) Iif: unresolved
  (193.232.244.34, 224.0.1.40) Iif: unresolved
  (193.233.7.65, 224.66.66.66) Iif: eth0 Oifs: pimreg
  示例2:查看 # ip -s mr ls 224.66/16
  (193.233.7.65, 224.66.66.66) Iif: eth0 Oifs: pimreg
  9383 packets, 300256 bytes
  11. ip tunnel -- 通道配置
  縮寫
  tunnel、tunl
  11.1.ip tunnel add -- 添加新的通道
  ip tunnel change -- 修改現有的通道
  ip tunnel delete -- 刪除一個通道
  縮寫:add、a;change、chg;delete、del、d
  示例1:創建一個點對點通道,最大TTL是32
  # ip tunnel add Cisco mode sit remote 192.31.7.104 local 192.203.80.1 ttl 32
  11.2.ip tunnel show -- 列出現有的通道
  縮寫:show、list、sh、ls、l
  示例1: # ip -s tunl ls Cisco
  12. ip monitor和rtmon -- 狀態監視
  ip命令能夠用於連續地監視設備、地址和路由的狀態。這個命令選項的格式有點不一樣,命令選項的名字叫作monitor,接着是操做對象:
  ip monitor [ file FILE ] [ all | OBJECT-LIST ]
  示例1: # rtmon file /var/log/rtmon.log
  示例2: # ip monitor file /var/log/rtmon.log r

 

 
 

轉自:http://www.unixnotes.net/ip-rule.html?replytocom=25

相關資料:


http://www.cppblog.com/isware/archive/2011/06/01/147825.html

 
 
http://www.aliyun.com/zixun/content/3_12_519324.html

Linux的高級路由和流量控制:介紹iproute2

發佈時間:2014-12-19 更新時間:2014-12-26 來源:網絡 

做者:水筆思思

 
關鍵詞: Linux 流量控制 iproute2 高級路由

 

但願這篇文檔能對你更好地理解Linxs2.2/2.4的路由有所幫助和啓發。不被大多數使用者所知道的是,你所使用工具,其實可以完成至關規模工做。好比route 和ifconfig,實際上暗中調用了很是強大的iproute 2的底層基本功能。

Linux能爲你作什麼

一個小列表:

• 管制某臺計算機的帶寬
• 管制通向某臺計算機的帶寬
• 幫助你公平地共享帶寬
• 保護你的網絡不受DoS攻擊
• 保護Internet不受到你的客戶的攻擊
• 把多臺服務器虛擬成一臺,進行http://www.aliyun.com/zixun/aggregation/13996.html">負載均衡或者提升可用性
• 限制對你的計算機的訪問
• 限制你的用戶訪問某些主機
• 基於用戶帳號(沒錯!)、MAC地址、源IP地址、端口、服務類型、時間或者內容等條件進行路由。

如今,很多人都沒有用到這些高級功能。這有不少緣由。好比提供的文檔過於冗長並且不容易上手,並且流量控制甚至根本就沒有歸檔。

1 爲何使用 iproute2?

如今,絕大多數 Linux 發行版和絕大多數 UNIX都使用古老的arp, ifconfig和route命令。雖然這些工具可以工做,但它們在Linux2.2和更高版本的內核上顯得有一些落伍。好比,如今GRE隧道已經成爲了路由的一個主要概念,但卻不能經過上述工具來配置。
使用了iproute2,隧道的配置與其餘部分徹底集成了

2.2 和更高版本的Linux 內核包含了一個通過完全從新設計的網絡子系統。這些新的代碼讓Linux在操做系統的競爭中取得了功能和性能上的優點。實際上,Linux新的路由、過濾和分類代碼,從功能和性能上都不弱於現有的那些專業的路由器、防火牆和流量整形產品。

隨着新的網絡概念的提出,人們在現有操做系統的現有體系上修修補補來實現他們。這種執拗的行爲致使了網絡代碼中充斥着怪異的行爲,這有點像人類的語言。過去,Linux模仿了SunOS的許多處理方式,並不理想。

這個新的體系則有可能比以往任何一個版本的Linux都更善於清晰地進行功能表達。

2 iproute2 概覽

Linux有一個成熟的帶寬供給系統,稱爲Traffic Control(流量控制)。這個系統支持各類方式進行分類、排序、共享和限制出入流量。

咱們將從 iproute2 各類可能性的一個簡要概覽開始。

3 先決條件

你應該確認已經安裝了用戶級配置工具。這個包的名字在RedHat和Debian中都叫做「iproute」,也能夠在這個地方找到:

ftp://ftp.inr.ac.ru/ip-routing/iproute2-2.2.4-now-ss??????.tar.gz

你也能夠試試在這裏(ftp://ftp.inr.ac.ru/ip-routing/iproute2-current.tar.gz)找找最新版本。

iproute 的某些部分須要你打開一些特定的內核選項。應該指出的是,RedHat6.2及其之前的全部發行版中所帶的缺省內核都不帶有流量控制所須要的絕大多數功能。

而RedHat 7.2在缺省狀況下能知足全部要求。

另外,確認一下你的內核支持netlink ,Iproute2須要它.

 

 

 

本站全部文章所有來源於互聯網,版權歸屬於原做者。本站全部轉載文章言論不表明本站觀點,如是侵犯了原做者的權利請發郵件聯繫站長(yanjing@alibaba-inc.com),咱們收到後當即刪除。

 

 

http://man.chinaunix.net/linux/lfs/LFS-6.1.1/chapter06/iproute2.html

6.32. IPRoute2-2.6.11-050330

IPRoute2 包含了基本的和高級的基於 IPv4 網絡的程序。

預計編譯時間: 0.1 SBU
所需磁盤空間: 4.3 MB
安裝依賴於: GCC, Glibc, Make, Linux-Headers, Sed

6.32.1. 安裝 IPRoute2

這個程序包中的二進制文件 arpd 依賴於 Berkeley DB 。由於 arpd 對於一個基本 Linux 系統基本上沒有用處,因此咱們要使用下面的補丁去除對 Berkeley DB 的依賴。若是你須要使用 arpd 你能夠參考 BLFS-Book 中的這個頁面來了解如何編譯與安裝 Berkeley DB :http://www.linuxfromscratch.org/blfs/view/svn/server/databases.html#db 。

sed -i '/^TARGETS/s@arpd@@g' misc/Makefile

爲編譯 IPRoute2 作準備:

./configure

編譯軟件包:

make SBINDIR=/sbin

make 選項的含義:

SBINDIR=/sbin

確保將 IPRoute2 包中的二進制文件安裝到 /sbin 目錄中以符合 FHS 標準,由於一些 IPRoute2 二進制文件將會被 LFS-Bootscripts 使用。

安裝軟件包:

make SBINDIR=/sbin install

6.32.2. IPRoute2 的內容

安裝的程序: ctstat (連接到 lnstat), ifcfg, ifstat, ip, lnstat, nstat, routef, routel, rtacct, rtmon, rtpr, rtstat (連接到 lnstat), ss, tc

簡要描述

ctstat

鏈接狀態工具

ifcfg

ip 命令的shell腳本包裝

ifstat

顯示網絡接口的統計信息,包括接口發送和接收到的包數量。

ip

主可執行程序,它包含如下幾個功能:

ip link [device] 查看和修改設備狀態

ip addr 查看地址的特性,添加新地址、刪除舊地址。

ip neighbor 查看鄰居的特性,添加新鄰居、刪除舊鄰居。

ip rule 查看和修改路由規則

ip route 查看路由表和修改路由表規則

ip tunnel 查看和修改 IP 隧道及其特性

ip maddr 查看和修改多播地址及其特性

ip mroute 設置、修改、刪除多播路由

ip monitor 不間斷的監視設備狀態、地址、路由

lnstat

提供 Linux 網絡統計信息,用於替代舊的 rtstat 程序。

nstat

顯示網絡統計信息

routef

ip route 的一個組件,用於刷新路由表。

routel

ip route 的一個組件,用於列出路由表。

rtacct

顯示 /proc/net/rt_acct 文件的內容

rtmon

路由監視工具

rtpr

將 ip -o 的輸出轉換爲可讀的格式

rtstat

路由狀態工具

ss

相似於 netstat 命令,顯示活動的鏈接。

tc

流量控制,用於實現服務質量(QOS)和服務級別(COS):

tc qdisc 創建排隊規則

tc class 創建基於級別的隊列調度

tc estimator 估算網絡流量

tc filter 設置 QOS/COS 包過濾器

tc policy 設置 QOS/COS 規則

 

 

 

 

http://blog.csdn.net/dog250/article/details/6685633

 

Linux路由應用-使用策略路由實現訪問控制

2011-08-14 10:51 5239人閱讀 評論(2) 收藏 舉報
 

目錄(?)[+]

 

引:

通常而言,訪問控制並非路由模塊完成的,而是防火牆的職責,若是你使用Linux的,這是iptables的職責。然而有時候,特別是在策略不少的狀況下,使用iptables會極大下降網絡性能,這是Netfilter的filter表的本質決定的,具體的優化參見《 Linux的Netfilter框架深度思考-對比Cisco的ACL》。
     Linux有一個很實用的特性能夠在某些情形下代替iptables,從而實現訪問控制。本文給出一個方法,說明如何使用策略路由來控制數據訪問的入口網卡,具體來說就是:只有經過特定的網卡才能訪問機器上的某一個地址。具體來說,Linux服務器有以下配置:
eth0:192.168.1.1/24
eth1:192.168.2.1/24
eth2:172.16.1.1/24
lo:127.0.0.1
只能經過eth0訪問192.168.1.1這個地址,而不能經過eth1或者eth2訪問,甚至本機都不能訪問192.168.1.1。
     可是在探討如何作以前,首先要明白一些理論知識,這樣才能知其然且知其因此然。

1.完成這個需求必需要明白的背景知識

1.1.Linux路由查找流程

全部的路由器設計都要遵循如下規則:
IF 目的地址配置在本機
    THEN 本機接收
ELSE
    查找路由表並在找到路由的狀況下轉發
END

固然Linux也不能例外,可是Linux並無將這這兩種狀況進行區分,而是使用「多張路由表」將兩者統一了起來。在Linux中,內置了三張路由表:
local,main,default,其中local路由表的優先級最高,而且不能被替換,在有數據包進來的時候,首先無條件的查找local路由表,若是找到了路由,則數據包就是發往本機的,若是找不到,則接着在其它的路由表中進行查找。使用ip route ls table local命令能夠看到local表的內容,好比機器的eth0網卡上配有192.168.0.7,則在local表中會有以下的路由:
local 192.168.0.7 dev eth0  proto kernel  scope host  src 192.168.0.7 
值得注意的是,local表中的路由是能夠刪除的。路由的src項指的是當數據包從本機發出時,在local表中找到了源地址的路由,首選的源ip地址
     在local表和main表之間,能夠插入251張策略路由表,所以若是有策略路由表的話,若是local表中沒有找到路由,則會查找策略路由表。
     總結一下本節的內容,Linux內置了三張路由表,其中local路由表優先級最高且不可替換,它完成「IF 目的地址配置在本機 THEN 本機接收」這個邏輯,在local表以後,能夠配置多張策略路由表,策略路由的知識本文不談,可是基本就是根據源地址,目的地址,出接口,入接口等元素來決定數據包在路由前是否進入該張策略路由表,本質上是一種過濾行爲(然則結果是能夠緩存的,其要點就在於此!)。

1.2.bind地址/no-bind地址

有一個問題,那就是若是一個數據包從本機發出,如何肯定其源地址,這個問題若是搞不明白,就可能面臨不少奇怪的現象而沒法解釋,在這個問題上,TCP和UDP的行爲是不一樣的,TCP比較簡單,由於一個TCP鏈接是四元素決定的(源IP地址,目的IP地址,源端口,目的端口),所以在創建鏈接後,源/目的IP地址是肯定的。對於UDP而言,狀況就複雜了,下節詳述。可是無論什麼協議,在API接口層次上,一個socket分爲bind地址的和不bind地址的。
     若是是bind地址,那麼源地址就是bind的那個地址,若是沒有bind,那麼源地址在路由以後根據路由的結果肯定。這就意味着,策略路由的from關鍵字將沒法匹配到全部沒有bind地址的應用程序從本地發出的包-緣由是策略路由匹配是在路由前作的,而此時尚未源IP地址。
     想明白協議棧如何這麼設計,仍是要從IP路由的本質以及傳輸層語義來分析。IP路由的職責就是能將IP數據報送到目的地,在路由以後選擇源IP地址能夠使返回的IP數據報在徹底逆向路徑上返回。考慮傳輸層的語義,對於TCP而言,其源地址的肯定性是TCP作的,而不是IP層作的,這一點必定要清楚。對於不bind地址的狀況,應用程序在數據包到達網絡層以前不須要考慮網絡層協議頭的內容,這個工做徹底有網絡層的IP路由模塊來完成,應用程序只須要指出目的IP便可,徹底由協議棧負責網絡層協議頭的添加。
     想明白協議棧如何實現這個邏輯,最好的辦法是看Linux的源代碼,方法是跟蹤一個數據包發送的全過程源碼,具體看ip_route_output_slow。

1.3.UDP踢皮球

討論TCP的文章不少,TCP也有不少複雜的特性值得去深究,然而UDP也不是吃素的,有一種現象就是UDP鏈接會踢皮球,最終用TCPDUMP抓取的數據包結果會讓人焦頭爛額。其實只要明白1.2節的內容,本節的內容就很簡單了。
     UDP無鏈接,不可靠,只負責將數據盡力而爲傳到目的主機,它對源和目的IP地址的管理很鬆散,UDP數據流(更確切的並不能稱爲數據流)是單包的。在兩端都沒有顯式bind到具體的IP地址的狀況下,最終的數據包能夠使用任意的本機地址,關鍵看路由的結果。數據到達對端以後,若是對端也沒有顯示bind到具體的IP地址,那麼回覆包的源地址也可能再也不是初始包的目的地址。咱們仍是用實例來講明吧,先看網絡拓撲:


路由配置以下:
host1:default 192.168.0.2
host2:default 172.16.0.2

host1上運行一個UDP服務器,綁到0.0.0.0這個地址,也就是不綁定地址,host2向host1 192.168.1.1的UDP端口8888發送數據,抓包發現其源地址是172.16.0.1,目的地址是192.168.1.1,而返回包卻抓不到了,意外抓取到一個源地址是192.168.0.1,目的地址是172.16.0.1的數據包。這是正常的,由於數據包到達host1時,查找返回路由時,會查到下一跳192.168.0.2,進而根據這個下一跳選擇同一網段的192.168.0.1這個地址,此時若是添加一條路由:172.16.0.1 gw 192.168.1.2,那麼就會看到返回數據包源地址爲192.168.1.1了。
     還有更奇怪的現象,那就是,初始時從host2向host1發送數據,源和目的分別是172.16.0.1和192.168.1.1,但是後來,在沒有斷開UDP客戶端和服務器的狀況下(host2更改了路由),源和目的分別成了172.16.1.1和192.168.0.1,這也是正常的,由於UDP原本就是無鏈接的,在不bind地址的狀況下,關鍵是根據路由來選擇源地址,選擇源地址原則是:優先選擇路由結果接口上和下一跳地址爲同一網段的第一個primary地址,不然選擇其它網卡上的primary地址,在選擇過程當中,有三個scope會影響選擇結果,一個是下一跳地址scope,它表示該地址到達本地的「距離」,另外一個是路由scope,它表示到達該路由的「距離」,還有一個是本地地址的scope,它限制了該地址的使用範圍,路由模塊保證下一跳的scope要小於路由的scope-背後的思想就是下一跳必定距離目的地比本機更近,而選擇的本地地址的scope必須小於等於給定的scope(做爲一個參數存在)。
     UDP踢皮球有一個後果就是會影響Netfilter的ip_conntrack,咱們知道,ip_conntrack是基於五元素來跟蹤鏈接的,UDP的混亂狀況可能使一個UDP數據流被跟蹤好幾回,從而使得後續的NAT規則(若是有的話)很複雜,NAT配置必須考慮到皮球的每個方向,不然就會漏掉原本應該被NAT的數據包。
     總之,網絡是很複雜的,千萬不要以爲就是配置幾個IP地址以及幾條路由那麼簡單的事。

1.4.路由前對本機出發數據包的源地址的檢查

若是是本機發出數據包,最終要進入路由模塊的ip_route_output_slow函數來查找路由,該函數對bind地址的源地址進行了檢查,它保證到該本地地址的路由必須在local路由表中被找到。
  1. static int ip_route_output_slow(...)  
  2. {  
  3.     if (oldflp->fl4_src) {  
  4.         ...  
  5.         if (!(oldflp->flags & FLOWI_FLAG_ANYSRC)) {  
  6.             /* It is equivalent to inet_addr_type(saddr) == RTN_LOCAL */  
  7.             dev_out = ip_dev_find(net, oldflp->fl4_src);  
  8.             if (dev_out == NULL)  
  9.                 goto out;  
  10.             ...  
  11.         }  
  12.     }  
  13. }  


ip_dev_find的實現中,有如下邏輯:
  1. local_table = fib_get_table(net, RT_TABLE_LOCAL);  
  2.     if (!local_table || local_table->tb_lookup(local_table, &fl, &res))  
  3.         return NULL;  


這意味着本機出發的數據包的源地址若是有的話,必需要在local表中找到一條local路由,不然則返回EINVAL錯誤。然而能夠取消這一限制,具體見1.6節。總而言之,FLOWI_FLAG_ANYSRC這個標誌是基於socket,經過setsockopt能夠設置socket,使與之相關的oldflp的flags中有FLOWI_FLAG_ANYSRC標誌。

1.5.Linux的IP地址屬於主機而不屬於網卡

在Linux中,不要覺得IP地址是屬於網卡的,它是屬於主機的,實際上就算是UNIX或者其它的OS,IP地址都不該該是網卡的,IP地址是三層概念,網卡是二層設備。不少人都認爲IP地址是屬於網卡的是由於在Linux中配置IP地址時都要給定一個網卡參數,好比ip address add dev ethX XXX/YY。
     IP地址是屬於主機的,這就意味着,只要IP數據報到達本機,沒有常規的方式使用路由限制該IP數據報不到達本地應用程序(local表是無條件最早被查詢的,除非在local表中將該地址對應的local路由刪除)。在procfs中使用sysctl能經過配置網卡參數達到限制數據包的目的嗎?好比什麼「關閉eth0的forwarding,這樣數據包就不能從eth0 forward到eth2了」,根本不是那回事。

1.6.取消本地地址必須存在於local路由表的限制

2.6.27以上內核的socket選項IP_TRANSPARENT能夠影響本機出發數據包路由查找時的源地址檢測,具體作法是在應用程序中使用下列代碼段:
int value = 1;
setsockopt(fd, SOL_IP, IP_TRANSPARENT, &value, sizeof(value));
設置後,服務器回包的源地址再也不限制在local表內,而是能夠使用任何地址,包括非本機地址,這個技術通常用於透明代理。所以能夠用這一特性來利用策略路由表完成本應該由防火牆完成的功能,不損耗性能。這樣能夠作到在local表中將eth0上的local路由刪除,將該local路由加到策略路由中,本地應用程序將不能訪問配置在eth0上地址。
     在2.6.27以前,協議棧在添加源地址(或者用戶指定了偵聽地址)時,要確保local路由表中擁有該地址,不然會報錯,而咱們就是想把該地址的本機local路由移出local表,所以此功能不可實現。在2.6.27以後,增長了FLOWI_FLAG_ANYSRC標誌,能夠經過設置該標誌作到限制的取消,具體作法有兩種,一種是全局的,那就是將ip_route_output_slow中的if (!(oldflp->flags & FLOWI_FLAG_ANYSRC))判斷取消掉,改成if (0);第二種改法是基於socket的,實際上FLOWI_FLAG_ANYSRC是基於單個socket設置的。完成此功能的前提:
1).內核編譯了CONFIG_IP_MULTIPLE_TABLES
2).修改管理服務程序,爲其socket增長IP_TRANSPARENT選項

2.具體操做

爲了很簡單的幾步操做,前面囉裏囉嗦說了那麼多,實際上作技術原本就應該這樣,必須挖掘深層次的原理,不然就只能算個IT工人。
配置:
eth0:192.168.0.1/24
eth1:172.16.0.1/24
eth2:10.0.0.1/24
lo:127.0.0.1

2.1.限制從其它網卡接口訪問特定網卡接口上配置的IP地址(這個說法不許確,具體見1.5節)對應的服務

2.1.1.添加一個策略路由表

echo "100 my" >> /etc/iproute2/rt_tables
這樣能夠在local和main表之間增長一個路由表my,內核路由模塊的查找順序是:local->my->main...

2.1.2.增長一條策略

ip rule add from 192.168.0.1 table my

2.1.3.在策略路由表中增長全部從eth0出去的路由

ip route add 12.34.0.0/16 via 192.168.0.2 dev eth0 table my
ip route add ... table my
...
ip route add default dev eth0 table my

全部匹配到my這個策略路由表的數據包,將從上述的路由項中查詢結果。注意,最後一條默認路由是必需要的,且必定要從eth0出去,不然根據Linux策略路由查找原則,若是在my表中沒有找到路由的話,仍是會繼續往下進行的,所謂的策略路由表只是一個優先級問題,而不是強制的查找約束。

2.1.4.結論和問題

經過以上的配置,全部從eth0進來的數據包才能安全返回,不然,好比從eth1進來一個訪問192.168.0.1的數據包,因爲它只有從eth1返回才能夠(不考慮多徑路由),然而返回包的源地址倒是192.168.0.1(對應的服務無論是TCP的仍是UDP必須顯式bind到192.168.0.1這個地址,不然對於UDP就會有踢皮球的現象),這樣路由查找就會進入my表(對於踢皮球的狀況,就可能不進入my表),然則my表中沒有一個從eth1出去的路由,且該包起碼會匹配到my表的默認路由,數據包所以沒法返回。
     如今考慮一下一個問題,若是是bind到192.168.0.1這個地址的服務主動訪問外部,是否是也必定要從eth0出去呢?答案是確定的,由於它bind了一個明確的地址,而源地址是該地址的數據包必定會匹配到my,最終起碼會匹配到my的默認路由...

2.1.5.進一步的問題

如今已經實現了不能從除eth0以外的其它接口進入訪問bind到eth0上地址的服務,然而若是但願作到連本地都不能訪問該服務,那纔是名副其實的「除eth0以外的...都不能...」,無疑本地出發的訪問192.168.0.1的數據包確定不是從eth0進入的。
     有一個辦法能夠解決這個問題,那就是禁用掉lo,由於在Linux中,全部從本地到本地的包都會被定向掉lo,禁掉lo後,全部本地到本地的包就都沒法到達目的地。可是這種方法並很差,管不着人家就把人家關起來,非真的猛士!下一節咱們就看看怎麼作到本地不能訪問本地eth0上的192.168.0.1這個地址,作到名副其實的「只有eth0進入的數據包才能訪問」

2.2.限制本地訪問本地bind到eth0上192.168.0.1這個地址的服務

想理解這個配置原理,還要回顧一下1.4節和1.6節,當理解了這兩節以後,這裏的配置就手到擒來了

2.2.0.前提:兩種方式

之一:直接將內核中的檢查取消掉,見1.6節
之二:改寫bind到192.168.0.1地址服務程序,爲其socket增長IP_TRANSPARENT選項,

2.2.1.添加一個新路由表

echo 「100  my_rule」 >> /etc/iproute2/rt_tables

2.2.2.增長一條策略:從eth0到來的數據包,開放my_rule路由表

ip rule add iif eth0 table my_rule
全部從eth0進來的數據包,查找my_rule表中的路由

2.2.3.爲新增策略增長190.7 local路由

ip route add local 192.168.0.1/32 dev lo table my_rule
因爲到達本地的數據包要想成功到達,必需要找到一條local路由(類型對便可,無需非要在local表),所以在my_rule中增長一條到達192.168.0.1的local路由

2.2.4.刪除原有的local表中的192.168.0.1路由

ip route del local 192.168.0.1/32 table local
因爲2.2.0中的兩種前提,對源地址的檢測已經取消了,到達源地址的路由如今沒有必要非要在local表中了,所以即便刪除了local中到達192.168.0.1的路由,也無所謂,返回包會直接使用源地址192.168.0.1而不被檢查。

2.2.5.結論和問題

2.2.1-2.2.4的結果就是:訪問192.168.0.1的數據包從eth0而來,查找my_rule表,找到,對於返回包,因爲IP_TRANSPARENT取消了限制,能夠正常返回;對於從非eth0到來的訪問192.168.0.1的包,因爲192.168.0.1的local路由已然被刪,my_rule因爲只匹配入口爲eth0的數據包於是不對其開放,將沒法訪問。
     這個配置在2.1節的基礎上作了加強,然而因爲要修改bind到192.168.0.1地址的服務程序,對於既有的閉源程序的相似的訪問控制將沒有用武之地(這些程序沒有源碼,不能修改)。

3.總的結論

本文給出了一種使用路由進行訪問控制的方式,對於規則比較簡單,且訪問控制都在第三層的場景中,路由的方式要比用防火牆更好,不會影響性能。然而本文的討論徹底是基於Linux的,對於非Linux的系統,好比Cisco,可能人家的ACL防火牆實現得比較高效,比iptables配置的更好,也就不須要用路由的方式進行訪問控制了,就算對於Linux自己,nf-HiPAC對filter表作了優化以後,路由的方式進行訪問控制的優點也減小了。

     總之,Linux網絡或者說網絡自己是一個超級複雜的系統,不一樣的實現對於配置方式的選型影響巨大,然而有一個問題,好比像Windows這樣的系統,你還不知道它的網絡協議棧實現的內幕,那麼它的配置確定也就比較固定,那就是Microsoft的建議配置。
     實際上,因爲增長了策略路由表,查表的過程也是遍歷,而且根據策略路由表的match一個一個比較,這個過程和filter表的查詢過程幾乎是同樣的,則策略路由的優點體如今何方?實際上,路由和filter有一個區別,那就是路由是能夠緩存的,而filter則是每包匹配的,有一種基於狀態的防火牆能夠「緩存」過濾結果,可是因爲須要維護鏈接狀態,這筆開銷也是不可小覷的。路由緩存是徹底獨立的,路由徹底緩存在一個hash表當中。
     可是,若是路由緩存hash表的衝突鏈表過長(緩存太大了),或者hash算法太菜,在配置大量策略路由和配置iptables之間權衡的話,後者也不是老是處於劣勢,孰是孰非,只有具體狀況具體分析,只有分析了具體的性能數據纔能有結論,不然只是紙上談兵一紙空文。

4.兩篇文檔

linux-source/Documentation/networking/tproxy.txt
linux-source/Documentation/networking/policy-routing.txt
 
 
http://linux.sheup.com/linux/38/linux23335.htm

懂得網絡配置命令是通常技術人員必備的技術,通過一段時間的研究和學習,總結了一些經常使用的命令和示例以便往後查閱.
傳統的在1--3點,ip高級路由命令在4--12點,二者部分能夠通用,並達到一樣的目的,但ip的功能更強大,能夠實現更多的配置目的。
首先,先了解傳統的網絡配置命令:
1. 使用ifconfig命令配置並查看網絡接口狀況
示例1: 配置eth0的IP,同時激活設備:
# ifconfig eth0 192.168.4.1 netmask 255.255.255.0 up
示例2: 配置eth0別名設備 eth0:1 的IP,並添加路由
# ifconfig eth0:1 192.168.4.2
# route add –host 192.168.4.2 dev eth0:1
示例3:激活(禁用)設備
# ifconfig eth0:1 up(down)
示例4:查看全部(指定)網絡接口配置
# ifconfig (eth0)
2. 使用route 命令配置路由表
示例1:添加到主機路由
# route add –host 192.168.4.2 dev eth0:1
# route add –host 192.168.4.1 gw 192.168.4.250
示例2:添加到網絡的路由
# route add –net IP netmask MASK eth0
# route add –net IP netmask MASK gw IP
# route add –net IP/24 eth1
示例3:添加默認網關
# route add default gw IP
示例4:刪除路由
# route del –host 192.168.4.1 dev eth0:1
示例5:查看路由信息
# route 或 route -n (-n 表示不解析名字,列出速度會比route 快)
3.ARP 管理命令
示例1:查看ARP緩存
# arp
示例2: 添加
# arp –s IP MAC
示例3: 刪除
# arp –d IP
4. ip是iproute2軟件包裏面的一個強大的網絡配置工具,它可以替代一些傳統的網絡管理工具。例如:ifconfig、route等,
上面的示例徹底能夠用下面的ip命令實現,並且ip命令能夠實現更多的功能.下面介紹一些示例:
4.0 ip命令的語法
ip [OPTIONS] OBJECT [COMMAND [ARGUMENTS]]
4.1 ip link set--改變設備的屬性. 縮寫:set、s
示例1:up/down 起動/關閉設備。
# ip link set dev eth0 up
這個等於傳統的 # ifconfig eth0 up(down)
示例2:改變設備傳輸隊列的長度。
參數:txqueuelen NUMBER或者txqlen NUMBER
# ip link set dev eth0 txqueuelen 100
示例3:改變網絡設備MTU(最大傳輸單元)的值。
# ip link set dev eth0 mtu 1500
示例4: 修改網絡設備的MAC地址。
參數: address LLADDRESS
# ip link set dev eth0 address 00:01:4f:00:15:f1
4.2 ip link show--顯示設備屬性. 縮寫:show、list、lst、sh、ls、l
-s選項出現兩次或者更屢次,ip會輸出更爲詳細的錯誤信息統計。
示例:
# ip -s -s link ls eth0 eth0: mtu 1500 qdisc cbq qlen 100 link/ether 00:a0:cc:66:18:78 brd ff:ff:ff:ff:ff:ff RX: bytes packets errors dropped overrun mcast 2449949362 2786187 0 0 0 0 RX errors: length crc frame fifo missed 0 0 0 0 0 TX: bytes packets errors dropped carrier collsns 178558497 1783946 332 0 332 35172 TX errors: aborted fifo window heartbeat 0 0 0 332 這個命令等於傳統的 ifconfig eth0 5.1 ip address add--添加一個新的協議地址. 縮寫:add、a
示例1:爲每一個地址設置一個字符串做爲標籤。爲了和Linux-2.0的網絡別名兼容,這個字符串必須以設備名開頭,接着一個冒號,
# ip addr add local 192.168.4.1/28 brd + label eth0:1 dev eth0
示例2: 在以太網接口eth0上增長一個地址192.168.20.0,掩碼長度爲24位(155.155.155.0),標準廣播地址,標籤爲eth0:Alias:
# ip addr add 192.168.4.2/24 brd + dev eth1 label eth1:1
這個命令等於傳統的: ifconfig eth1:1 192.168.4.2
5.2 ip address delete--刪除一個協議地址. 縮寫:delete、del、d
# ip addr del 192.168.4.1/24 brd + dev eth0 label eth0:Alias1
5.3 ip address show--顯示協議地址. 縮寫:show、list、lst、sh、ls、l
# ip addr ls eth0
5.4.ip address flush--清除協議地址. 縮寫:flush、f
示例1 : 刪除屬於私網10.0.0.0/8的全部地址:
# ip -s -s a f to 10/8
示例2 : 取消全部以太網卡的IP地址
# ip -4 addr flush label "eth0"
6. ip neighbour--neighbour/arp表管理命令
縮寫 neighbour、neighbor、neigh、n
命令 add、change、replace、delete、fulsh、show(或者list)
6.1 ip neighbour add -- 添加一個新的鄰接條目
ip neighbour change--修改一個現有的條目
ip neighbour replace--替換一個已有的條目
縮寫:add、a;change、chg;replace、repl
示例1: 在設備eth0上,爲地址10.0.0.3添加一個permanent ARP條目:
# ip neigh add 10.0.0.3 lladdr 0:0:0:0:0:1 dev eth0 nud perm
示例2:把狀態改成reachable
# ip neigh chg 10.0.0.3 dev eth0 nud reachable
6.2.ip neighbour delete--刪除一個鄰接條目
示例1:刪除設備eth0上的一個ARP條目10.0.0.3
# ip neigh del 10.0.0.3 dev eth0
6.3.ip neighbour show--顯示網絡鄰居的信息. 縮寫:show、list、sh、ls
示例1: # ip -s n ls 193.233.7.254
193.233.7.254. dev eth0 lladdr 00:00:0c:76:3f:85 ref 5 used 12/13/20 nud reachable
6.4.ip neighbour flush--清除鄰接條目. 縮寫:flush、f
示例1: (-s 能夠顯示詳細信息)
# ip -s -s n f 193.233.7.254
7. 路由表管理
7.1.縮寫 route、ro、r
7.5.路由表
從Linux-2.2開始,內核把路由概括到許多路由表中,這些表都進行了編號,編號數字的範圍是1到255。另外,
爲了方便,還能夠在/etc/iproute2/rt_tables中爲路由表命名。
默認狀況下,全部的路由都會被插入到表main(編號254)中。在進行路由查詢時,內核只使用路由表main。
7.6.ip route add -- 添加新路由
ip route change -- 修改路由
ip route replace -- 替換已有的路由
縮寫:add、a;change、chg;replace、repl
示例1: 設置到網絡10.0.0/24的路由通過網關193.233.7.65
# ip route add 10.0.0/24 via 193.233.7.65
示例2: 修改到網絡10.0.0/24的直接路由,使其通過設備dummy
# ip route chg 10.0.0/24 dev dummy
示例3: 實現鏈路負載平衡.加入缺省多路徑路由,讓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
示例5: 實現數據包級負載平衡,容許把數據包隨機從多個路由發出。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
7.7.ip route delete-- 刪除路由
縮寫:delete、del、d
示例1:刪除上一節命令加入的多路徑路由
# ip route del default scope global nexthop dev ppp0 nexthop dev ppp1
7.8.ip route show -- 列出路由
縮寫:show、list、sh、ls、l
示例1: 計算使用gated/bgp協議的路由個數
# ip route ls proto gated/bgp |wc
1413 9891 79010
示例2: 計算路由緩存裏面的條數,因爲被緩存路由的屬性可能大於一行,以此須要使用-o選項
# ip -o route ls cloned |wc
159 2543 18707
示例3: 列出路由表TABLEID裏面的路由。缺省設置是table main。TABLEID或者是一個真正的路由表ID或者是/etc/iproute2/rt_tables文件定義的字符串,
或者是如下的特殊值:
all -- 列出全部表的路由;
cache -- 列出路由緩存的內容。
ip ro ls 193.233.7.82 tab cache
示例4: 列出某個路由表的內容
# ip route ls table fddi153
示例5: 列出默認路由表的內容
# ip route ls
這個命令等於傳統的: route
7.9.ip route flush -- 擦除路由表
示例1: 刪除路由表main中的全部網關路由(示例:在路由監控程序掛掉以後):
# ip -4 ro flush scope global type unicast
示例2:清除全部被克隆出來的IPv6路由:
# ip -6 -s -s ro flush cache
示例3: 在gated程序掛掉以後,清除全部的BGP路由:
# ip -s ro f proto gated/bgp
示例4: 清除全部ipv4路由cache
# ip route flush cache
*** IPv4 routing cache is flushed.
7.10 ip route get -- 得到單個路由 .縮寫:get、g
使用這個命令能夠得到到達目的地址的一個路由以及它的確切內容。
ip route get命令和ip route show命令執行的操做是不一樣的。ip route show命令只是顯示現有的路由,而ip route get命令在必要時會派生出新的路由。
示例1: 搜索到193.233.7.82的路由
# ip route get 193.233.7.82
193.233.7.82 dev eth0 src 193.233.7.65 realms inr.ac cache mtu 1500 rtt 300
示例2: 搜索目的地址是193.233.7.82,來自193.233.7.82,從eth0設備到達的路由(這條命令會產生一條很是有意思的路由,這是一條到193.233.7.82的迴環路由)
# ip r g 193.233.7.82 from 193.233.7.82 iif eth0
193.233.7.82 from 193.233.7.82 dev eth0 src 193.233.7.65 realms inr.ac/inr.ac
cache ; mtu 1500 rtt 300 iif eth0
8. ip route -- 路由策略數據庫管理命令
命令  add、delete、show(或者list)
注意:策略路由(policy routing)不等於路由策略(rouing policy)。
在某些狀況下,咱們不僅是須要經過數據包的目的地址決定路由,可能還須要經過其餘一些域:源地址、IP協議、傳輸層端口甚至數據包的負載。
這就叫作:策略路由(policy routing)。
8.5. ip rule add -- 插入新的規則
ip rule delete -- 刪除規則
縮寫:add、a;delete、del、d
示例1: 經過路由表inr.ruhep路由來自源地址爲192.203.80/24的數據包
ip ru add from 192.203.80/24 table inr.ruhep prio 220
示例2:把源地址爲193.233.7.83的數據報的源地址轉換爲192.203.80.144,並經過表1進行路由
ip ru add from 193.233.7.83 nat 192.203.80.144 table 1 prio 320
示例3:刪除無用的缺省規則
ip ru del prio 32767
8.7. ip rule show -- 列出路由規則
縮寫:show、list、sh、ls、l
示例1: # ip ru ls
0: from all lookup local
32762: from 192.168.4.89 lookup fddi153
32764: from 192.168.4.88 lookup fddi153
32766: from all lookup main
32767: from all lookup 253
9. ip maddress -- 多播地址管理
縮寫:show、list、sh、ls、l
9.3.ip maddress show -- 列出多播地址
示例1: # ip maddr ls dummy
9.4. ip maddress add -- 加入多播地址
ip maddress delete -- 刪除多播地址
縮寫:add、a;delete、del、d
使用這兩個命令,咱們能夠添加/刪除在網絡接口上監聽的鏈路層多播地址。這個命令只能管理鏈路層地址。
示例1: 增長 # ip maddr add 33:33:00:00:00:01 dev dummy
示例2: 查看 # ip -O maddr ls dummy
2: dummy
link 33:33:00:00:00:01 users 2 static
link 01:00:5e:00:00:01
示例3: 刪除 # ip maddr del 33:33:00:00:00:01 dev dummy
10.ip mroute -- 多播路由緩存管理
10.4. ip mroute show -- 列出多播路由緩存條目
縮寫:show、list、sh、ls、l
示例1:查看 # ip mroute ls
(193.232.127.6, 224.0.1.39) Iif: unresolved
(193.232.244.34, 224.0.1.40) Iif: unresolved
(193.233.7.65, 224.66.66.66) Iif: eth0 Oifs: pimreg
示例2:查看 # ip -s mr ls 224.66/16
(193.233.7.65, 224.66.66.66) Iif: eth0 Oifs: pimreg
9383 packets, 300256 bytes
11. ip tunnel -- 通道配置
縮寫 tunnel、tunl
11.4.ip tunnel add -- 添加新的通道
ip tunnel change -- 修改現有的通道
ip tunnel delete -- 刪除一個通道
縮寫:add、a;change、chg;delete、del、d
示例1:創建一個點對點通道,最大TTL是32
# ip tunnel add Cisco mode sit remote 192.31.7.104 local 192.203.80.1 ttl 32
11.4.ip tunnel show -- 列出現有的通道
縮寫:show、list、sh、ls、l
示例1: # ip -s tunl ls Cisco
12. ip monitor和rtmon -- 狀態監視
ip命令能夠用於連續地監視設備、地址和路由的狀態。這個命令選項的格式有點不一樣,命令選項的名字叫作monitor,接着是操做對象:
ip monitor [ file FILE ] [ all | OBJECT-LIST ]
示例1: # rtmon file /var/log/rtmon.log
示例2: # ip monitor file /var/log/rtmon.log r

 

 

http://zhoulifa.bokee.com/6192551.html

高級網絡工具iproute 

做者:  周立發2007-03-29 18:52分類: 默認分類標籤:

 

IPRoute 的內容

安裝的程序: ctstat (連接到 lnstat), ifcfg, ifstat, ip, lnstat, nstat, routef, routel, rtacct, rtmon, rtpr, rtstat (連接到 lnstat), ss, tc

簡要描述

ctstat

鏈接狀態工具

ifcfg

ip 命令的shell腳本包裝

ifstat

顯示網絡接口的統計信息,包括接口發送和接收到的包數量。

ip

主可執行程序,它包含如下幾個功能:

ip link [device] 查看和修改設備狀態

ip addr 查看地址的特性,添加新地址、刪除舊地址。

ip neighbor 查看鄰居的特性,添加新鄰居、刪除舊鄰居。

ip rule 查看和修改路由規則

ip route 查看路由表和修改路由表規則

ip tunnel 查看和修改 IP 隧道及其特性

ip maddr 查看和修改多播地址及其特性

ip mroute 設置、修改、刪除多播路由

ip monitor 不間斷的監視設備狀態、地址、路由

lnstat

提供 Linux 網絡統計信息,用於替代舊的 rtstat 程序。

nstat

顯示網絡統計信息

routef

ip route 的一個組件,用於刷新路由表。

routel

ip route 的一個組件,用於列出路由表。

rtacct

顯示 /proc/net/rt_acct 文件的內容

rtmon

路由監視工具

rtpr

將 ip -o 的輸出轉換爲可讀的格式

rtstat

路由狀態工具

ss

相似於 netstat 命令,顯示活動的鏈接。

tc

流量控制,用於實現服務質量(QOS)和服務級別(COS):

tc qdisc 創建排隊規則

tc class 創建基於級別的隊列調度

tc estimator 估算網絡流量

tc filter 設置 QOS/COS 包過濾器

tc policy 設置 QOS/COS 規則

 

其中ss命令用法以下:

 

Usage: ss [ OPTIONS ]
       ss [ OPTIONS ] [ FILTER ]
   -h, --help           this message
   -V, --version        output version information
   -n, --numeric        don't resolve service names
   -r, --resolve       resolve host names
   -a, --all            display all sockets
   -l, --listening      display listening sockets
   -o, --options       show timer information
   -e, --extended      show detailed socket information
   -m, --memory        show socket memory usage
   -p, --processes      show process using socket
   -i, --info           show internal TCP information
   -s, --summary        show socket usage summary

   -4, --ipv4          display only IP version 4 sockets
   -6, --ipv6          display only IP version 6 sockets
   -0, --packet display PACKET sockets
   -t, --tcp            display only TCP sockets
   -u, --udp            display only UDP sockets
   -d, --dccp           display only DCCP sockets
   -w, --raw            display only RAW sockets
   -x, --unix           display only Unix domain sockets
   -f, --family=FAMILY display sockets of type FAMILY

   -A, --query=QUERY
       QUERY := {all|inet|tcp|udp|raw|unix|packet|netlink}[,QUERY]

   -F, --filter=FILE   read filter information from FILE
       FILTER := [ state TCP-STATE ] [ EXPRESSION ]

 
 
 
 
 
http://m.oschina.net/blog/3046

Linux高級路由---策略路由/捆綁/網橋

企圖穿越 發佈於 5年前,共有 0 條評論

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+多網卡)
    配置工具 brctl  http://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 還需進一步的增強學習和實踐的應用...
#################################################################################################################################

傳統路由器在網絡和需求變得複雜時將沒法知足須要,而一種基於策略的路由給了咱們更好的選擇。本文給出一個Linux下的配置實例,它在2.4G奔 騰4處理器、256M內存的計算機上運行經過,並在160多臺電腦的網絡環境下運轉正常。

 

基於策略的路由比傳統路由更強大,使用更靈活,它使網絡管理者不只可以根據目的地址並且可以根據報文大小、應用或IP源地址來選擇轉發路 徑。在現實的網絡應用中,這種選擇的自由性仍是很須要的。而Linux從2.1版本的內核開始就實現了對策略路由的支持,下面就介紹一個配置實例,以期對 讀者有所幫助。

 

實例背景

 

如圖所示,兩個內部網經過遠端路由器1與因特網相聯,經過遠端路由器2與上級網相聯, Linux服務器作策略路由器,內有4塊網卡。IP地址的分配狀況如表所示。

 

在應用需求方面,內網1容許經過遠端路由器1(172.22.254.254)鏈接因特網,但只容許Http協議、FTP協議常常性經過, 其餘協議分時間段開放(這樣作是爲了不員工在上班時間打網絡遊戲和聊天),例如在上班時間(7:30~16:30)封閉,在下班時間 (16:30~7:30)和周6、日全天開放。並且,內網1無權訪問內網2及上級網,但能夠訪問內網2上的服務器。而容許內網2訪問外網,上級網則只能訪 問內網2上的192.168.1.2服務器。而防火牆主要用來阻止外網主動訪問內網,防止網絡攻擊。

 

實現過程

 

這裏咱們選擇Red Hat Enterprise Linux WS 3操做系統,其內核版本是2.4.21,對策略路由已經有了很好的支持,下面的配置也以此爲基礎。

 

1.設置IP地址

 

首先,執行以下命令:

ifconfig eth0 10.89.9.1 netmask 255.255.255.0

ifconfig eth1 192.168.1.1 netmask 255.255.255.0

ifconfig eth2 172.22.254.14 netmask 255.255.255.0

ifconfig eth3 10.140.133.14 netmask 255.255.255.0

爲了讓計算機啓動時自動設置IP地址,還須要分別修改/etc/sysconfig/network-scripts/下的四個文 件:ifcfg-eth0、ifcfg-eth一、ifcfg-eth二、ifcfg-eth3,將ONBOOT屬性設爲yes,即 「ONBOOT=yes」,文件格式以下:

# Intel Corp.82545EM Gigabit Ethernet Controller (Copper)

DEVICE=eth0

BOOTPROTO=none

HWADDR=00:0c:76:20:54:71

ONBOOT=yes

TYPE=Ethernet

USERCTL=yes

PEERDNS=no

NETMASK=255.255.255.0

IPADDR=10.89.9.1

 

若是你不喜歡命令行模式,也能夠在圖形模式下進行以上操做:主菜單→系統設置→網絡,設好IP地址並激活,而且選中「當計算機啓動時激活設 備」選項。

 

2.打開轉發功能

 

執行命令「echo 「1」 > /proc/sys/net/ipv4/ip_forward」,或者在/etc/sysconfig/network文件中添加 「FORWARD_IPV4=yes」。

 

3.建立路由表

 

編輯 /etc/iproute2/rt_tables 文件,執行以下命令。在這裏新添加了4個路由表,分別爲int1 、int二、int三、int4。

# reserved values

#255 local

#254 main

#253 default

#0 unspec

# local

#1 inr.ruhep

1 int1

2 int2

3 int3

4 int4

 

4.添加路由

 

執行以下命令:

ip route add default via 10.89.9.1 table int1

ip route add default via 192.168.1.1 table int2

ip route add default via 172.22.254.254 table int3

ip route add 192.168.0.0/16 via 10.140.133.254 table int4

ip route add default via 172.22.254.254 table int4

這裏在int4路由表中添加了兩條路由,當進入到該路由表以後,要到192.168.0.0/16的數據包則路由到 10.140.133.254,其餘數據包則路由到172.22.254.254。

5.標記(MARK)特殊包

 

執行以下兩條命令:

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

iptables -t mangle -A PREROUTING -p udp --dport 53 -s 10.89.9.0/24 -j MARK --set-mark 2

這兩條命令是未來自10.89.9.0/24的目的端口是80、8080、20或21的數據包和UDP端口是53的數據包分別標記爲1或 2,而後就能夠針對這些標記過的數據包制定相應的規則了。(對外發出的DNS請求用的是UDP 53端口)

爲了實現防火牆的功能,只容許已經創建聯機的數據包進入內網,就要把進入兩個內網的已經創建聯機的數據包進行標記。執行以下命令:

iptables -t mangle -A PREROUTING -p ALL -d 10.89.9.0/24 -m state --state ESTABLISHED,RELATED -j MARK --set-mark 3

iptables -t mangle -A PREROUTING -p ALL -d 192.168.1.0/24 -m state --state ESTABLISHED,RELATED -j MARK --set-mark 4

 

6.建立路由規則

執行以下命令:

ip rule add from 192.168.1.0/24 pref 11 table int4

ip rule add to 192.168.1.2 pref 21 table int2

ip rule add fwmark 4 pref 31 table int2

ip rule add fwmark 1 pref 41 table int3

ip rule add fwmark 2 pref 42 table int3

ip rule add fwmark 3 pref 51 table int1

接着執行命令「ip route flush cache」,刷新路由緩衝,讓以上的這些命令馬上生效,不然須要等上一段時間。

7.實現分時間段控制

如果按照以上的配置,內網1的用戶只能上網瀏覽網頁和下載,爲了對其餘功能實現分時間段開放,須要作如下工做:

首先編輯命令腳本文件ropen (開放)和rclose (限制)。執行命令「vi /bin/ropen」,ropen文件內容以下:

/sbin/ip rule add from 10.89.9.0/24 pref 40 table int3

/sbin/ip route flush cache

執行命令「vi /bin/rclose」,rclose文件內容以下:

/sbin/ip rule del from 10.89.9.0/24 pref 40

/sbin/ip route flush cache

若是不習慣命令行方式,也能夠在圖形界面下生成這兩個文件,生成文件以後,須要增長可執行屬性方可執行:分別執行命令「chmod +x ropen」和「chmod +x rclose」。

接着,利用crontab命令實現自動運行。這裏須要編輯一個文本文件,格式以下:

minute hour dayofmonth monthofyear dayofweek 「命令」

其中每部分名稱及取值範圍是:minute表明分鐘,取值範圍是00~59;hour表明小時,取值範圍是 00~23;dayofmonth表明某天,取值範圍是01~31;monthofyear表明月份,取值範圍是01~12;dayofweek表明星 期,取值範圍是01~07。若須要忽略其中某一部分就用星號(*)代替。例如,文件名設爲mycron,內容可編輯以下:

 

30 07 * * 01,02,03,04,05 "/bin/ropen"

30 16 * * 01,02,03,04,05 "/bin/rclose"

最後執行crontab命令,將所編輯的文件mycron裝載並啓動,命令爲「crontab mycron」。

 
 
http://rhcss.blog.51cto.com/672018/133812
linux 高級路由及流量控制總結
2009-02-28 22:40:27
版權聲明:原創做品,如需轉載,請與做者聯繫。不然將追究法律責任。
看了這麼多天的關於流量控制的資料後,如今大腦裏仍是很亂,理不清晰,只好將目前所可以理理的暫時總結一下。
在Linux系統中,有一個很是重要的路由的包文件-----iproute,其中包含了兩個最重要的工具ip和tc。
iproute的程序站點爲: http://www.linuxfoundation.org/en/Net:Iproute2
iproute的文檔站點爲: http://lartc.org/
ip命令主要用於配置接口,ARP,tunnel(隧道)以及策略路由等等。
tc命令主要用於配置流量控制和策略管理,二者能夠單獨使用,也能夠相互結合使用。
2、ip命令的使用
root@router:~# ip help
Usage: ip [ OPTIONS ] OBJECT { COMMAND | help }
where OBJECT := { link | addr | route | rule | neigh | tunnel |
maddr | mroute | monitor | xfrm }
OPTIONS := { -V[ersion] | -s[tatistics] | -r[esolve] |
-f[amily] { inet | inet6 | ipx | dnet | link } | -o[neline] }
 
ip link 命令主要用於顯示網絡配置信息,ip link set 主要用於配置網絡信息。
例:顯示當前接口配置信息。
route@linux#  ip  link  list
 
ip addr 命令用於配置IP地址信息,其可以使用ip addr add爲網絡設備添加主或從IP地址,ip addr show用於顯示每一個網絡設備的IP地址,ip addr del用於刪除接口的IP地址,能夠經過不一樣的命令清空相關的IP地址信息,例如:ip addr flush dynamic能夠刪除全部經過動態路由協議加入至linux內核中的路由條目。
例:顯示IP地址信息。
route@linux# ip  address  show
 
ip neighbor用於管理neighbor/arp表,下列的一些命令將會被用到:add, change, replace, delete, and flush。
例:顯示ARP緩存信息以及刪除ARP緩存信息。
route@linux# ip neigh  show
route@linux# ip neigh  delete  10.10.10.1  dev eth0
 
ip tunnel命令用於管理隧道鏈接,隧道協議有gre,ipip,sit等,在後面的章節中將會介紹如何創建IP 隧道的實例。
 
ip route命令是一個很是重要並最常使用的命令,它幾乎能夠在內核路由表上執行任何操做,主要的命令有:add, change, replace, delete, show, flush, and get routes
例:顯示IP路由表。
route@linux# ip  route show
 
ip monitor:監控路由, rtmon:監控地址, rtacct:實時監控網絡設備。
 
關於IP命令的詳細使用請參考: http://www.policyrouting.org/iproute2.doc.html#ss9.1.1
 
此外,在iproute2中最重要的功能就是經過ip rule和ip route來實現linux的策略路由功能。
 
3、策略路由的實現
在實現策略路由的內核上必須支持IP: advanced router"  和 "IP: policy routing"  兩項
 
實現方法:在Linux中能夠設置多張路由表,併爲不一樣的表設置不一樣的出口(即網關),當內核在實現路由選擇時,可讓其平均的經過幾張路由表將數據發送出去或者將不一樣的數據經過不一樣的路由表發送出去。
 
默認狀況下,Linux內核自帶了三張路由表,能夠經過 route@linux# ip rule list進行查看,三張表分另爲local對就編號爲0,main對應編號爲32766,default對應編號爲32766,用戶在正常建立建立條目時若是沒有指定加入哪個表時,數據統統加入至main表,因此當用戶使用route  -n看到的信息所有來自於main表中。
例:顯示當前內核的路由表。
kuznet@amber~ $ ip rule list
0 from all lookup local
32766 from all lookup main
32767 from all lookup default
 
用戶能夠經過 ip route list table 表名 的方法來查看錶中的具體路由條目,以下所示:
router@linux#  ip route list table main
................................................
 
/etc/iproute2/rt_tables 文件用於保存表名和編號的對應關係。這裏須要添加T1和T2兩個表,編號爲200和300,具體操做以下:
echo 200 T1 >> /etc/iproute2/rt_tables
echo 300 T2 >> /etc/iproute2/rt_tables  
 
接下來,使用ip rule add命令來建立具體的表,並能夠在表中添加源地址或目標地址等參數。以下實例,建立表T1和T2。
例: route@linux# ip rule add from 1.1.1.1 table T1
        route@linux# ip rule add from 192.203.80.0/24 table T1
        route@linux# ip rule add to 192.203.80.0/24 table T2
        route@linux# ip rule add  table T2
上述內容表示這些源地址/目的地址/全部地址將應用於T1/T2表中的路由規則。
 
在使用ip rule add建立表時,能夠指定的參數有:type TYPE (default),from PREFIX,to PREFIX,iif NAME,tos TOS or dsfield TOS,fwmark MARK,priority PREFERENCE,table TABLEID,realms FROM/TO,nat ADDRESS。
 
 
最後,建立具體的路由條目至指定的表中(默認爲main表),以下所示:
route@linux# ip route add default via 192.168.0.1 dev eth0 table T1
route@linux# ip route add default via 192.168.1.1 dev eth1 table T2
 
 
4、策略路由配置實例
 
實驗拓撲以下:
 
一、建立兩個表,分別爲dianxin,wangtong,編輯爲300和400.
route@linux#echo  300  dianxin  >>/etc/iproute/rt_tables
route@linux# echo  400  wangtong  >>/etc/iproute/rt_tables
route@linux#ip rule add from $IP1 table dianxing
route@linux#ip rule add from $IP2 table wangtong
 
二、添加相關路由至兩個表中。
 
三、實現負載均衡。
 
策略路由總結:
一、添加路由表,編號至系統中。
二、添加具體的路由條目並指向用戶自定義的路由表中(如默認路由)。
三、添加具體的規則至路由表中,如什麼樣的源地址以及對應的優先級。
四、在路由表中經過nexthop參數實現負載均衡,或者能夠爲數據打mask,而後設置標記1的數據從哪一個表走,標記2的數據從哪一個表。
 
Linux下網通、電信、教育多出口策略路由配置詳解
1、處理流量分割的問題;2、解決雙線負載均衡的問題。原文以下:
一、流量分割
首先是如何保證:迴應來自某一個ISP的數據包時,仍然使用相同的ISP。
讓咱們先定義一些符號。令第一塊網卡的名字叫eth1,而第二塊網卡叫作eth2;而後設置網卡1的IP地址爲221.200.0.2(CNC分配網址),網卡2 的IP地址爲58.56.0.2(CTC分配網址);ISP1(聯通)網關地址爲221.200.0.1,ISP2(電信)網關地址爲58.56.0.1;最後,ISP1(聯通)的網絡地址爲211.200.0.0/30,ISP2(電信)的網絡地址爲58.56.0.0/30。
額外建立兩個路由表,T1 和T2 ,加入到/etc//iproute2/rt_tables中。而後以下設置兩個路由表中的路由:
ip route add 211.200.0.0/30 dev eth1 src 221.200.0.2 table T1
ip route add default via 221.200.0.1 table T1
 
ip route add 58.56.0.0/30 dev eth2 src 58.56.0.2 table T2
ip route add default via 58.56.0.1 table T2
沒什麼大不了的,不過是創建了通向該網關的一臺路由,並使之成爲默認網關,分別負責一個單獨的上行流,而且爲這兩個ISP都做這樣的配置。要指出的是,那條網絡路由是必要條件,由於它能讓咱們找到那個子網內的主機,也包括上述的那臺網關。
下一步,咱們設置「main」路由表,把包經過網卡直接路由到與網卡相連的局域網上不失爲一個好辦法。要注意「src」參數,他們可以保證選擇正確的出口IP地址。
ip route add 211.200.0.0/30 dev eth1 src 221.200.0.2 table main
 
ip route add 58.56.0.0/30 dev eth2 src 58.56.0.2 table main
而後,設置你的缺省路由:
ip route add default via 221.200.0.1
接着,設置路由規則。這實際上在選擇用什麼路由表進行路由。你須要確認當你從一個給定接口路由出數據包時,是否已經有了相應的源地址:你須要保證的就是若是你已經有了相應的源地址,就應該把數據包從相應的網卡路由出去:
ip rule add from 221.200.0.2 table T1
ip rule add from 58.56.0.2 table T2
以上命令保證了全部的迴應數據都會從他們來的那塊網卡原路返回。
如今,完成了很是基本的配置。這將對於全部運行在路由器上的全部進程起做用,實現IP假裝後,對本地局域網也將起做用。若是不進行假裝,那麼你要麼擁有兩個ISP的地址空間,要麼你想對兩個ISP中的一個進行假裝。不管哪一種狀況,你都要添加規則,基於發包的主機在局域網內的IP地址,選擇從哪一個ISP路由出去。
二、負載均衡
第二個問題就是如何對經過兩個ISP流出的數據進行負責均衡。若是你已經成功地實現了流量分割。這件事不難。
與選擇兩個ISP中的一個做爲缺省路由不一樣,此次是設置缺省路由爲多線路路由。在缺省內核中,這會均衡兩個ISP的路由。像下面這樣作(基於前面的流量分割實驗):
ip route add default scope global nexthop via 221.200.0.1 dev eth1 weight 30 \
nexthop via 58.56.0.1 dev eth2 weight 70 (注意:與上面爲同一行命令)
這樣能夠均衡兩個ISP的路由。經過調整「weight」參數咱們能夠指定其中的一個ISP的優先權高於另外一個。(具體:線路1的流量約佔30%,線路1佔70%)
應該指出,因爲均衡是基於路由進行的,而路由是通過緩衝的,因此這樣的均衡並非100%精確。也就是說,對於一個常常訪問的站點,老是會使用同一個ISP。
中國的現狀這樣設置是有缺陷的:由於網通和電信等的線路在溝通上存在問題,就是說從網通線路訪問電信的網址不如直接從電信訪問快,從電信訪問網通也是如此。所以對於擁有不一樣種線路的路由器咱們須要作基於目標地址的策略路由,同種線路的能夠作上面的策略路由。若是你擁有多個ISP且某個ISP有多條線路,則能夠把負載均衡與基於目標的策略路由結合起來。
 
作這樣的策略路由來自於《QEL4.1 網吧版》,其相關說明部分以下:
 
從QEL4.1 版本開始,咱們增長了多線路策略路由的功能。用戶只須要簡單地填寫幾個配置文件便可完成。
策略路由功能由qlcm 程序實現。這個程序在QEL4.0 上爲1.0,包含了內核智能優化、抗DDOS、SYN 洪水攻擊等功能。在4.1 版上,qlcm 版本爲2.0,增長了arp 綁定,多線路策略路由功能。
qlcm 服務是QEL 服務器的核心服務,您能夠restart qlcm 服務,但在任何狀況下您都不該該中止它。關閉它會形成沒法預料的後果,好比出現大量丟包,某些服務中止等。這樣的故障不在咱們技術支持的範圍內。
qlcm 2.0 支持最大8 路外網線路,根據用戶定義的配置文件自動判斷工做模式,能夠爲每一個外網出口單獨定義路由表,也能夠實現實現多條線路的負載均衡(即多鏈路帶寬捆綁)。通常的硬件路由器只能支持23路外網線路,並且價格不菲。硬件路由器使用嵌入式CPU 和少許內存,處理性能有限,在處理過多路由時會超出處理能力。而使用PC作路由則不受此限制。
QEL4.1 內核最大能夠支持到255 路外線,咱們隨時能夠修改qlcm,支持32 路或者更多的外線。
 
咱們再來看一個具體例子的實現:
 
3.咱們有三條固定IP 線路,一條是eth0(電信),網關爲202.102.14.1,一條eth1(網通),網關爲60.12.5.1,一條是教育網線路,網關爲125.216.44.1,將etho(電信線路)做爲默認網關,訪問網通的數據走eth1,訪問教育網的走eth2,
配置以下:
wan1.conf:
interface=eth0
gateway=202.102.14.1
defaultgw=yes
wan2.conf:
interface=eth1
gateway= 60.12.5.1
routefile=/etc/quick/IP_CNC.list
wan3.conf:
interface=eth2
gateway=125.216.44.1
routefile=/etc/quick/IP_EDU.list
這樣就OK 了。新建一個IP_EDU.list 文本文件,其中定義了教育網的IP 段。
在這樣的環境下,defaultgw=yes 只設定在某個網卡接口上。當訪問已定義的路由時,走指定的網卡出去,不然走默認網關。
 
routefile= 後面填該線路對應的路由表文件。在安裝時咱們已經爲您默認安裝了兩個文件:IP_CNC.list 和IP_CTC.list,這兩個文件都在/etc/quick 目錄下,其中IP_CNC.list 文件是網通路由表文件,IP_CTC.list 爲電信路由表文件。
這兩個文件的格式也很簡單,每行一個IP 段,示例以下:
58.16.0.0/16
58.17.0.0/17
58.17.128.0/17
 
qlcm只能運行在《QEL4.1 網吧版》上,若是移植到其它Linux下會由於版本的不一樣而形成系統的崩潰。在不想更換系統的前提下,咱們能夠本身用IP命令來實現qlcm的功能模擬。
咱們仍然以文章開始的實例來進行說明基於目的的策略路由設置。
一、首先創建通向不一樣ISP的路由表
ip route add 211.200.0.0/30 dev eth1 src 221.200.0.2 table 50
ip route add default via 221.200.0.1 table 50
 
ip route add 58.56.0.0/30 dev eth2 src 58.56.0.2 table 51
ip route add default via 58.56.0.1 table 51
沒什麼可說的,與前面相同,只是僅用數字表示路由表。
二、針對咱們要訪問的目標地址,選擇不一樣的路由表,進行路由
由於有大量的網絡地址須要設置不一樣的規則,採用命令模式不便於修改,因此作了一個簡單的腳本文件,配置文件與qlcm採用相同的結構。
 
關於策略路由的詳細使用,能夠參考書籍: Policy Routing Using Linux
 

本文出自 「RHCSS系統安全架構師」 博客,轉載請與做者聯繫!

 
 
http://xjsunjie.blog.51cto.com/999372/1583522
iproute2 策略路由與流量控制筆記
2014-11-27 22:48:47

-- 前提知識: --
若是須要使用策略路由需確認編譯內核時配置中帶有IP:advanced route和IP:policy routing

iproute匹配條件:from源地址,to目的地址,Tos域,Dev物理接口,Fwmark防火牆標記  這些作爲匹配條件

iproute動做:能夠以table指明所用的表,nat網絡地址轉換,prohibit丟棄併發送icmp信息,reject單純丟棄,unreachable丟棄併發送icmp信息.

ip rule首先程序從優先級高到低掃描全部的規則,若是規則匹配,處理該規則的動做。若是是普通的路由尋址或者是nat地址轉換的換,首先從規則獲得路由表,而後對該路由表進行操做。這樣RPDB(routing policy database)終於清晰的顯現出來了。
 
iproute相關的內核編譯選項:CONFIG_IP_ADVANCED_ROUTER=y CONFIG_IP_MULTIPLE_TABLES=y CONFIG_IP_ROUTE_FWMARK=y

/etc/iproute2/rt_tables 保存規則的名字與數字的關聯

iptables -A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu 容許調整tcp syn包裏的MSS域,用於控制鏈接包的最大長度。一些防火牆或主機會很不適當的過濾掉type 三、code 4(須要分片)的icmp包。目前發行的linux的內核從2.4.7開始已經包含了這個補丁。

IMQ 中介隊列設備
被打了特定標記的數據包在netfilter的NF_IP_PRE_ROUTING和NF_IP_POST_ROUTING兩個鉤子函數處被攔截,並被送到一個隊列規定中,該隊列規定附加到一個IMQ設備上。能夠實現對入口流量整形,並且能夠把網卡當成一個個的類來看待而進行全局整形設置。

--應用案例1 --

經過iptables與iproute2協同實現根據 應用 的策略路由
實現要點: iptables根據端口將服務類的數據包打上標示,iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 100 (用這些標記咱們能夠作帶寬限制和基於請求的分類)
根據狀況作nat iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE 
而後設置路由策略ip rule add fwmark 100 table 100  

-- 應用案例2 --

普通雙ISP的設置 外網接口$IF1 IF1接口地址$IP1 ISP1網關地址$P1 ISP1的網絡地址P1_NET
#分別指定兩條默認網關負責單獨的上行流
ip route add $P1_NET dev $IF1 src $IP1 table T1 源地址爲IP1且目的爲ISP1網段從IF1接口發出(必需的,它可以讓咱們找到該子網內的主機及本網關) 將這條路由加入表T1
ip route add default via $P1 table T1
ip route add $P2_NET dev $IF2 src $IP2 table T2 源地址爲IP2且目的爲ISP2網段從IF2接口發出((必需的,它可以讓咱們找到該子網內的主機及本網關) 將這條路由加入表T2
ip route add default via $P2 table T2

#也加入到main路由表
ip route add $P1_NET dev $IF1 src $IP1
ip route add $P2_NET dev $IF2 src $IP2
  main缺省走ISP1
ip route add default via $P1

#設置路由規則
ip rule add from $IP1 table T1
ip rule add from $IP2 table T2
#設置負載均衡
ip route add default scope global nexthop via $P1 dev $IF1 weight 1 \
nexthop via $P2 dev $IF2 weight 1

均衡是基於路由進行的,而路由是通過緩衝的,因此這樣的均衡並非100%精確.

-- 應用案例3 --
 TC帶寬管理的主要實現步驟 主要是在輸出端口處創建一個隊列進行流量控制,控制的方式是基於路由,亦即基於目的IP地址或目的子網的網絡號的流量控制。
1 編譯內核時注意事項
如下實例:發往A主機8M帶寬 發往B主機1M帶寬 發往C主機1M帶寬
2  1) 針對網絡物理設備(如以太網卡eth0)綁定一個CBQ隊列;
 tc qdisc add dev eth0 root handle 1: cbq bandwidth 10Mbit avpkt 1000 cell 8 mpu 64 
  2) 在該隊列上創建分類;
 tc class add dev eth0 parent 1:0 classid 1:1 cbq bandwidth 10Mbit rate 10Mbit maxburst 20 allot \ 1514 prio 8 avpkt 1000 cell 8 weight 1Mbit 
 tc class add dev eth0 parent 1:1 classid 1:2 cbq bandwidth 10Mbit rate 8Mbit maxburst 20 allot \ 1514 prio 2 avpkt 1000 cell 8 weight 800Kbit split 1:0 bounded 
 tc class add dev eth0 parent 1:1 classid 1:3 cbq bandwidth 10Mbit rate 1Mbit maxburst 20 allot \ 1514 prio 1 avpkt 1000 cell 8 weight 100Kbit split 1:0
 tc class add dev eth0 parent 1:1 classid 1:4 cbq bandwidth 10Mbit rate 1Mbit maxburst 20 allot \ 1514 prio 6 avpkt 1000 cell 8 weight 100Kbit split 1:0 
  3) 爲每一分類創建一個基於路由的過濾器;
tc filter add dev eth0 parent 1:0 protocol ip prio 100 route
tc filter add dev eth0 parent 1:0 protocol ip prio 100 route to 2 flowid 1:2 
tc filter add dev eth0 parent 1:0 protocol ip prio 100 route to 3 flowid 1:3 
tc filter add dev eth0 parent 1:0 protocol ip prio 100 route to 4 flowid 1:4 
  4) 最後與過濾器相配合,創建特定的路由表。
ip route add 192.168.1.24 dev eth0 via 192.168.1.66 realm 2 
ip route add 192.168.1.30 dev eth0 via 192.168.1.66 realm 3
ip route add 192.168.1.0/24 dev eth0 via 192.168.1.66 realm 4 
3 應用,監控

--關於負載平衡--
關於負載平衡 CONFIG_IP_ROUTE_MULTIPATH內核選項將把全部這些路徑(缺省路由)等同看待,而後再根據/usr/src/linux /Documentation/Configure.help來選擇其特定的方式。Ip route命令的equalize選項,會讓Linux內核基於IP地址平衡外部鏈接。對於一個特定的IP地址,內核會選擇一個接口用於傳輸流出的數據包,而後內核會爲該IP地址在路由緩衝中建一個記錄。這樣,其它到達的有相同IP地址的數據包就會使用同一個接口,直到該記錄從路由緩衝中刪除。咱們能夠使用ip route list cache命令來查看路由緩衝。


經過DNS循環來實現的服務的負載平衡
各類不一樣的服務(DNS、SMTP、HTTP、LDAP、SSH等) 能夠經過DNS循環來實現。
循環複用DNS還有太多的限制(DNS緩存,忽略TTL值,修改後的刷新時間,不能意識到服務器的可用性),只能算是一種勉強可接受的負載平衡方案

--相關命令 --
ip link list 顯示鏈路
ip address show 顯示IP地址 對於PPP0接口還會告訴咱們鏈路另外一端的地址
ip route show 輸出結果之一default via x.x.x.x dev x

ip neigh show 查看緩存的ARP表
ip neigh delete x.x.x.x dev x

--TC流量控制:--
咱們只能對發送數據進行整形
默認整形方式是Pfifo_fast隊列規定。特色爲先進先出。只看數據包的TOS字節節來判斷應該放到哪一個頻道(優先).通常的應用程序會如何設置他們的TOS值。
HTB分層的令牌桶 
HTB 能夠保障提供給每一個類帶寬的數量是它所需求的最小需求或者等於分配給它的數量.當一個類須要的帶寬少於分配的帶寬時,剩餘的帶寬被分配給其餘須要服務的類. 

SFQ隨機公平隊列 
簡單輪轉。使用一個散列算法,把全部的會話映射到有限的幾個隊列中去。(只有當你的出口網卡確實已經擠滿了的時候,SFQ纔會起做用)
 
(若是你並不但願進行流量整形,只是想看看你的網卡是否有比較高的負載而須要使用隊列,可以使用pfifo隊列。它缺少內部頻道可是能夠統計backlog)

--HTB應用案例4--
1)
tc qdisc add dev eth0 root handle 1: htb default 12 
2)
tc class add dev eth0 parent 1: classid 1:1 htb rate 100kbps ceil 100kbps
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 30kbps ceil 100kbps
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 10kbps ceil 100kbps
tc class add dev eth0 parent 1:1 classid 1:12 htb rate 60kbps ceil 100kbps 
3)爲隊列規定分配子類, 若是沒有指定缺省是pfifo
tc qdisc add dev eth0 parent 1:10 handle 20: pfifo limit 5
tc qdisc add dev eth0 parent 1:11 handle 30: pfifo limit 5
tc qdisc add dev eth0 parent 1:12 handle 40: sfq perturb 10 
1:12隊列的類不定義時,即全部不匹配其它類規則的數據包。

--流量分析與故障診斷--
tc -s -d qdisc show dev eth0 隊列狀態
tc -s class show dev eth0 類狀態
tc filter show dev eth0 過濾器狀態

 
 
http://xjsunjie.blog.51cto.com/999372/1575090
linux策略路由iproute2
2014-11-10 17:17:20

策略性路由

  策略性是指對於IP包的路由是以網絡管理員根據須要定下的一些策略爲主要依據進行路由的。例如咱們能夠有這樣的策略:「全部來直自網A的包,選擇X路徑;其餘選擇Y路徑」,或者是「全部TOS爲A的包選擇路徑F;其餘選者路徑K」。
  Cisco 的網絡操做系統 (Cisco IOS) 從11.0開始就採用新的策略性路由機制。而Linux是在內核2.1開始採用策略性路由機制的。策略性路由機制與傳統的路由算法相比主要是引入了多路由表以及規則的概念。

多路由表(multiple Routing Tables)

  傳統的路由算法是僅使用一張路由表的。可是在有些情形底下,咱們是須要使用多路由表的。例如一個子網經過一個路由器與外界相連,路由器與外界有兩條線路相連,其中一條的速度比較快,一條的速度比較慢。對於子網內的大多數用戶來講對速度並無特殊的要求,因此可讓他們用比較慢的路由;可是子網內有一些特殊的用戶倒是對速度的要求比較苛刻,因此他們須要使用速度比較快的路由。若是使用一張路由表上述要求是沒法實現的,而若是根據源地址或其它參數,對不一樣的用戶使用不一樣的路由表,這樣就能夠大大提升路由器的性能。

規則(rule)

  規則是策略性的關鍵性的新的概念。咱們能夠用天然語言這樣描述規則,例如我門能夠指定這樣的規則:
  規則一:「全部來自192.16.152.24的IP包,使用路由表10, 本規則的優先級別是1500」
  規則二:「全部的包,使用路由表253,本規則的優先級別是32767」

  咱們能夠看到,規則包含3個要素:
  什麼樣的包,將應用本規則(所謂的SELECTOR,多是filter更能反映其做用);
  符合本規則的包將對其採起什麼動做(ACTION),例如用那個表;
  本規則的優先級別。優先級別越高的規則越先匹配(數值越小優先級別越高)。

策略性路由的配置方法

  傳統的linux下配置路由的工具是route,而實現策略性路由配置的工具是iproute2工具包。這個軟件包是由Alexey Kuznetsov開發的,軟件包所在的主要網址爲ftp://ftp.inr.ac.ru/ip-routing/。
這裏簡單介紹策略性路由的配置方法,以便能更好理解第二部分的內容。詳細的使用方法請參考Alexey Kuznetsov寫的 ip-cfref文檔。策略性路由的配置主要包括接口地址的配置、路由的配置、規則的配置。

接口地址的配置IP Addr

對於接口的配置能夠用下面的命令進行:
 

Usage: ip addr [ add | del ] IFADDR dev STRING


  例如:

router># ip addr add 192.168.0.1/24 broadcast 192.168.0.255 label eth0 dev eth0


  上面表示,給接口eth0賦予地址192.168.0.1 掩碼是255.255.255.0(24表明掩碼中1的個數),廣播地址是192.168.0.255

 

路由的配置IP Route

  Linux最多能夠支持255張路由表,其中有3張表是內置的:
  表255 本地路由表(Local table) 本地接口地址,廣播地址,已及NAT地址都放在這個表。該路由表由系統自動維護,管理員不能直接修改。
  表254 主路由表(Main table) 若是沒有指明路由所屬的表,全部的路由都默認都放在這個表裏,通常來講,舊的路由工具(如route)所添加的路由都會加到這個表。通常是普通的路由。
  表253 默認路由表 (Default table) 通常來講默認的路由都放在這張表,可是若是特別指明放的也能夠是全部的網關路由。
  表 0 保留

  路由配置命令的格式以下:
 

Usage: ip route list SELECTOR
ip route { change | del | add | append | replace | monitor } ROUTE


  若是想查看路由表的內容,能夠經過命令:

  ip route list table table_number


  對於路由的操做包括change、del、add 、append 、replace 、 monitor這些。例如添加路由能夠用:

router># ip route add 0/0 via 192.168.0.4 table main
router># ip route add 192.168.3.0/24 via 192.168.0.3 table 1


  第一條命令是向主路由表(main table)即表254添加一條路由,路由的內容是設置192.168.0.4成爲網關。
  第二條命令表明向路由表1添加一條路由,子網192.168.3.0(子網掩碼是255.255.255.0)的網關是192.168.0.3。

 

  在多路由表的路由體系裏,全部的路由的操做,例如網路由表添加路由,或者在路由表裏尋找特定的路由,須要指明要操做的路由表,全部沒有指明路由表,默認是對主路由表(表254)進行操做。而在單表體系裏,路由的操做是不用指明路由表的。

規則的配置IP Rule

  在Linux裏,總共能夠定義 個優先級的規則,一個優先級別只能有一條規則,即理論上總共能夠有 條規則。其中有3個規則是默認的。命令用法以下:
 

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


  首先咱們能夠看看路由表默認的全部規則:

root@netmonster# ip rule list
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
<code>
  規則0,它是優先級別最高的規則,規則規定,全部的包,都必須首先使用local表(254)進行路由。本規則不能被更改和刪除。
  規則32766,規定全部的包,使用表main進行路由。本規則能夠被更改和刪除。
  規則32767,規定全部的包,使用表default進行路由。本規則能夠被更改和刪除。

  在默認狀況下進行路由時,首先會根據規則0在本地路由表裏尋找路由,若是目的地址是本網絡,或是廣播地址的話,在這裏就能夠找到合適的路由;若是路由失敗,就會匹配下一個不空的規則,在這裏只有32766規則,在這裏將會在主路由表裏尋找路由;若是失敗,就會匹配32767規則,即尋找默認路由表。若是失敗,路由將失敗。重這裏能夠看出,策略性路由是往前兼容的。

  還能夠添加規則:
<code>
router># ip rule add [from 0/0] table 1 pref 32800
router >#ip rule add from 192.168.3.112/32 [tos 0x10] table 2 pref 1500 prohibit


  第一條命令將向規則鏈增長一條規則,規則匹配的對象是全部的數據包,動做是選用路由表1的路由,這條規則的優先級是32800。
  第二條命令將向規則鏈增長一條規則,規則匹配的對象是IP爲192.168.3.112,tos等於0x10的包,使用路由表2,這條規則的優先級是1500,動做是prohibit。添加之後,咱們能夠看看系統規則的變化。

router># ip rule
0: from all lookup local
1500 from 192.168.3.112/32 [tos 0x10] lookup 2
32766: from all lookup main
32767: from all lookup default
32800: from all lookup 1


  上面的規則是以源地址爲關鍵字,做爲是否匹配的依據的。除了源地址外,還能夠用如下的信息:
  From -- 源地址
  To -- 目的地址(這裏是選擇規則時使用,查找路由表時也使用)
  Tos -- IP包頭的TOS(type of sevice)域
  Dev -- 物理接口
  Fwmark -- 防火牆參數

 

  採起的動做除了指定表,還能夠指定下面的動做:
   Table 指明所使用的表
   Nat 透明網關
   Action prohibit 丟棄該包,併發送 COMM.ADM.PROHIITED的ICMP信息
   Reject 單純丟棄該包
   Unreachable丟棄該包, 併發送 NET UNREACHABLE的ICMP信息

策略性路由的應用

  基於源地址選路( Source-Sensitive Routing)
  若是一個網絡經過兩條線路接入互聯網,一條是比較快的ADSL,另一條是比較慢的普通的調制解調器。這樣的話,網絡管理員既能夠提供無差異的路由服務,也能夠根據源地址的不一樣,使一些特定的地址使用較快的線路,而普通用戶則使用較慢的線路,即基於源址的選路。

  根據服務級別選路(Quality of Service)
  網絡管理員能夠根據IP報頭的服務級別域,對於不一樣的服務要求能夠分別對待對於傳送速率、吞吐量以及可靠性的有不一樣要求的數據報根據網絡的情況進行不一樣的路由。

  節省費用的應用
  網絡管理員能夠根據通訊的情況,讓一些比較大的陣發性通訊使用一些帶寬比較高可是比較貴的路徑一段短的時間,而後讓基本的通訊繼續使用原來比較便宜的基本線路。例如,管理員知道,某一臺主機與一個特定的地址通訊一般是伴隨着大量的陣發性通訊的,那麼網絡管理員能夠安排一些策略,使得這些主機使用特別的路由,這些路由是按需撥號,帶寬比較高的線路,通訊完成之後就中止使用,而普通的通訊則不受影響。這樣既提升網絡的性能,又能節省費用。

  負載平衡(Load Sharing)
  根據網絡交通的特徵,網絡管理員能夠在不一樣的路徑之間分配負荷實現負載平衡。

Linux下策略性路由的實現--RPDB(Routing Policy DataBase)

  在Linux下,策略性路由是由RPDB實現的。對於RPDB的內部機制的理解,能夠加深對於策略性路由使用的理解。這裏分析的是linux 2.4.18的RPDB實現的細節。主要的實現文件包括:
 

fib_hash.c
fib_rules.c
fib_sematic
fib_frontend.c
route.c


  RDPB主要由多路由表和規則組成。路由表以及對其的操做和其對外的接口是整個RPDB的核心部分。路由表主要由table,zone,node這些主要的數據結構構成。對路由表的操做主要包含物理的操做以及語義的操做。路由表除了向IP層提供路由尋找的接口之外還必須與幾個元素提供接口:與用戶的接口(即更改路由)、proc的接口、IP層控制接口、以及和硬件的接口(網絡接口的改變會致使路由表內容的改變)。處在RDPB的中心的規則,由規則選取表。IP層並不直接使用路由表,而是經過一個路由適配層,路由適配層提供爲IP層提供高性能的路由服務。

 

路由表(Fib Table)

  數據結構:
  在整個策略性路由的框架裏,路由表是最重要的的數據結構,咱們在上面以及對路由表的概念和結構進行了清楚的說明。Linux裏經過下面這些主要的數據結構進行實現的。
 

主要的數據結構 做用 位置
struct fib_table 路由表 ip_fib.h 116
struct fn_hash 路由表的哈希數據 fib_hash.c 104
struct fn_zone zone域 fib_hash.c 85
struct fib_node 路由節點 fib_hash.c 68
struct fib_info 路由信息 ip_fib.h 57
struct fib_result 路由結果 ip_fib.h 86


數據結構之間的主要關係以下。路由表由路由表號以及路由表的操做函數指針還有表數據組成。這裏須要注意的是,路由表結構裏並不直接定義zone域,而是經過一個數據指針指向fn_hash。只有當zone裏有數據纔會鏈接到fn_zone_list裏。(如圖)
系統的全部的路由表由數組變量*fib_tables[RT_TABLE_MAX+1]維護,其中系統定義RT_TABLE_MAX爲254,也就是說系統最大的路由表爲255張,全部的路由表的操做都是對這個數組進行的。。同時系統還定義了三長路由表*local_table; *main_table。

 

路由表的操做:

  Linux策略路由代碼的主要部分是對路由表的操做。對於路由表的操做,物理操做是直觀的和易於理解的。對於表的操做不外乎就是添加、刪除、更新等的操做。還有一種操做,是所謂的語義操做,語義操做主要是指諸如計算下一條的地址,把節點轉換爲路由項,尋找指定信息的路由等。

  一、物理操做(operation):
  路由表的物理操做主要包括以下這些函數:
 

路由標操做 實現函數 位置
新建路由表
刪除路由表
搜索路由 fn_hash_lookup fib_hash.c 269
插入路由到路由表 fn_hash_insert fib_hash.c 341
刪除路由表的路由 fn_hash_delete
fn_hash_dump
fib_hash.c 433
fib_hash.c 614
更新路由表的路由 fn_hash_flush fib_hash.c 729
顯示路由表的路由信息 fn_hash_get_info fib_hash.c 750
選擇默認路由 fn_hash_select_default fib_hash.c 842


  二、語義操做(semantics operation):
  語義操做並不涉及路由表總體框架的理解,並且,函數名也是不言自明的,因此請你們參考fib_semantics.c。

 

  三、接口(front end)
  對於路由表接口的理解,關鍵在於理解那裏有

  IP
  首先是路由表於IP層的接口。路由在目前linux的意義上來講,最主要的仍是IP層的路由,因此和IP層的的接口是最主要的接口。和ip層的銜接主要是向IP層提供尋找路由、路由控制、尋找指定ip的接口。
 

Fil_lookup
ip_rt_ioctl fib_frontend.c 286;" f
ip_dev_find 145


  Inet
  路由表還必須提供配置接口,即用戶直接操做路由的接口,例如增長和刪除一條路由。固然在策略性路由裏,還有規則的添加和刪除。

inet_rtm_delroute 351
inet_rtm_newroute 366
inet_check_attr 335


  proc
  在/proc/net/route裏顯示路由信息。
  fib_get_procinfo

 

  四、網絡設備(net dev event)
  路由是和硬件關聯的,當網絡設備啓動或關閉的時候,必須通知路由表的管理程序,更新路由表的信息。
 

fib_disable_ip 567
fib_inetaddr_event 575
fib_netdev_event


  五、內部維護( magic)
  上面咱們提到,本地路由表(local table)的維護是由系統自動進行的。也就是說當用戶爲硬件設置IP地址等的時候,系統自動在本地路由表裏添加本地接口地址以及廣播地址。

fib_magic 417
fib_add_ifaddr 459
fib_del_ifaddr 498

 

Rule

  一、數據結構
  規則在fib_rules.c的52行裏定義爲 struct fib_rule。而RPDB裏全部的路由是保存在101行的變量fib_rules裏的,注意這個變量很關鍵,它掌管着全部的規則,規則的添加和刪除都是對這個變量進行的。

  二、系統定義規則:
  fib_rules被定義之後被賦予了三條默認的規則:默認規則,本地規則以及主規則。
 

u 本地規則local_rule
94 static struct fib_rule local_rule = {
r_next: &main_rule, /*下一條規則是主規則*/
r_clntref: ATOMIC_INIT(2),
r_table: RT_TABLE_LOCAL, /*指向本地路由表*/
r_action: RTN_UNICAST, /*動做是返回路由*/
};

 

u 主規則main_rule
86 static struct fib_rule main_rule = {
r_next: &default_rule,/*下一條規則是默認規則*/
r_clntref: ATOMIC_INIT(2),
r_preference: 0x7FFE, /*默認規則的優先級32766*/
r_table: RT_TABLE_MAIN, /*指向主路由表*/
r_action: RTN_UNICAST, /*動做是返回路由*/
};

 

u 默認規則default rule
79 static struct fib_rule default_rule = {
r_clntref: ATOMIC_INIT(2),
r_preference: 0x7FFF,/*默認規則的優先級32767*/
r_table: RT_TABLE_DEFAULT,/*指默認路由表*/
r_action: RTN_UNICAST,/*動做是返回路由*/
};


  規則鏈的鏈頭指向本地規則。

 

RPDB的中心函數fib_lookup

  如今到了討論RPDB的實現的的中心函數fib_lookup了。RPDB經過提供接口函數fib_lookup,做爲尋找路由的入口點,在這裏有必要詳細討論這個函數,下面是源代碼:
 

310 int fib_lookup(const struct rt_key *key, struct fib_result *res)
311 {
312 int err;
313 struct fib_rule *r, *policy;
314 struct fib_table *tb;
315
316 u32 daddr = key->dst;
317 u32 saddr = key->src;
318
321 read_lock(&fib_rules_lock);
322 for (r = fib_rules; r; r=r->r_next) {/*掃描規則鏈fib_rules裏的每一條規則直到匹配爲止*/
323 if (((saddr^r->r_src) & r->r_srcmask) ||
324 ((daddr^r->r_dst) & r->r_dstmask) ||
325 #ifdef CONFIG_IP_ROUTE_TOS
326 (r->r_tos && r->r_tos != key->tos) ||
327 #endif
328 #ifdef CONFIG_IP_ROUTE_FWMARK
329 (r->r_fwmark && r->r_fwmark != key->fwmark) ||
330 #endif
331 (r->r_ifindex && r->r_ifindex != key->iif))
332 continue;/*以上爲判斷規則是否匹配,若是不匹配則掃描下一條規則,不然繼續*/

335 switch (r->r_action) {/*好了,開始處理動做了*/
336 case RTN_UNICAST:/*沒有設置動做*/
337 case RTN_NAT: /*動做nat ADDRESS*/
338 policy = r;
339 break;
340 case RTN_UNREACHABLE: /*動做unreachable*/
341 read_unlock(&fib_rules_lock);
342 return -ENETUNREACH;
343 default:
344 case RTN_BLACKHOLE:/* 動做reject */
345 read_unlock(&fib_rules_lock);
346 return -EINVAL;
347 case RTN_PROHIBIT:/* 動做prohibit */
348 read_unlock(&fib_rules_lock);
349 return -EACCES;
350 }
351 /*選擇路由表*/
352 if ((tb = fib_get_table(r->r_table)) == NULL)
353 continue;
/*在路由表裏尋找指定的路由*/
354 err = tb->tb_lookup(tb, key, res);
355 if (err == 0) {/*命中目標*/
356 res->r = policy;
357 if (policy)
358 atomic_inc(&policy->r_clntref);
359 read_unlock(&fib_rules_lock);
360 return 0;
361 }
362 if (err < 0 && err != -EAGAIN) {/*路由失敗*/
363 read_unlock(&fib_rules_lock);
364 return err;
365 }
366 }
368 read_unlock(&fib_rules_lock);
369 return -ENETUNREACH;
370 }


  上面的這段代碼的思路是很是的清晰的。首先程序從優先級高到低掃描全部的規則,若是規則匹配,處理該規則的動做。若是是普通的路由尋址或者是nat地址轉換的換,首先從規則獲得路由表,而後對該路由表進行操做。這樣RPDB終於清晰的顯現出來了。

 

IP層路由適配(IP route)

  路由表以及規則組成的系統,能夠完成路由的管理以及查找的工做,可是爲了使得IP層的路由工做更加的高效,linux的路由體系裏,route.c裏完成大多數IP層與RPDB的適配工做,以及路由緩衝(route cache)的功能。

調用接口

  IP層的路由接口分爲發送路由接口以及接收路由接口:

發送路由接口

  IP層在發送數據時若是須要進行路由工做的時候,就會調用ip_route_out函數。這個函數在完成一些鍵值的簡單轉換之後,就會調用 ip_route_output_key函數,這個函數首先在緩存裏尋找路由,若是失敗就會調用 ip_route_output_slow,ip_route_output_slow裏調用fib_lookup在路由表裏尋找路由,若是命中,首先在緩存裏添加這個路由,而後返回結果。
 

ip_route_out route.h
ip_route_output_key route.c 1984;
ip_route_output_slow route.c 1690;"

 

接收路由接口

  IP層接到一個數據包之後,若是須要進行路由,就調用函數ip_route_input,ip_route_input如今緩存裏尋找,若是失敗則 ip_route_inpu調用ip_route_input_slow, ip_route_input_slow裏調用fib_lookup在路由表裏尋找路由,若是命中,首先在緩存裏添加這個路由,而後返回結果。
 

ip_route_input_slow route.c 1312;" f
ip_route_input route.c 1622;" f

 

cache

  路由緩存保存的是最近使用的路由。當IP在路由表進行路由之後,若是命中就會在路由緩存裏增長該路由。同時系統還會定時檢查路由緩存裏的項目是否失效,若是失效則清除。

 
 
 
http://www.tanpao.com/archives/26

Linux高級路由技術-實現雙線服務器

19

背景:兩個網卡,兩條線路:電信和網通

之前:
         /eth0 3.3.3.2  ——> 3.3.3.1 router1
server
        \eth1 4.4.4.2  ——> 4.4.4.1 router2
 eth0 3.3.3.2 
 eth1 4.4.4.2
 共用一個網關: 3.3.3.1 
 缺點:只能有一個網關,沒法智能判斷線路來源。

實驗拓撲圖
 /eth0 —– eth0[Router_1]eth1 —– eth0\
Client                                                                       Server
 \eth1 —– eth0[Router_2]eth1 —– eth1/
Client
 eth0 1.1.1.2  vmnet1
 eth1 2.2.2.2  vmnet2

Router_1
 eth0 1.1.1.1  vmnet1
 eth1 3.3.3.1  vmnet3

Router_2
 eth0 2.2.2.1  vmnet2
 eth1 4.4.4.1  vmnet4

Server
 eth0 3.3.3.2  vmnet3
 eth1 4.4.4.2  vmnet4
須要運行vmware-config.pl增長這些虛擬網卡,類型爲hostonly
1、Server配置:
 
# ifconfig eth0 3.3.3.2 netmask 255.255.255.0
# ifconfig eth1 4.4.4.2 netmask 255.255.255.0

設定前路由表
# ip route
4.4.4.0/24 dev eth1  proto kernel  scope link  src 4.4.4.2
3.3.3.0/24 dev eth0  proto kernel  scope link  src 3.3.3.2
10.1.1.0/24 dev eth2  proto kernel  scope link  src 10.1.1.138
169.254.0.0/16 dev eth2  scope link
default via 10.1.1.1 dev eth2  <—全部網卡公用一個網關

思路:是爲兩個網卡創建獨立的路由表,他們有本身的網關
一、額外添加兩個路由表
# ip route add 3.3.3.0 dev eth0 src 3.3.3.2  table 1
 <—新建路由條目,關於3.3.3.0網絡的,放到一個編號爲1的路由表
# ip route add default via 3.3.3.1 table 1
 <—爲路由表 1 增長一個默認網關
# ip route list table 1
3.3.3.0 dev eth0  scope link  src 3.3.3.2
default via 3.3.3.1 dev eth0
# ip route add 4.4.4.0 dev eth1 src 4.4.4.2  table 2
# ip route add default via 4.4.4.1 table 2
# ip route list table 2
4.4.4.0 dev eth1  scope link  src 4.4.4.2
default via 4.4.4.1 dev eth1

二、設定main主路由表(ip route 看到的路由表)

# ip route add 3.3.3.0 dev eth0 src 3.3.3.2
# ip route add 4.4.4.0 dev eth1 src 4.4.4.2

三、設定默認路由
做用:給本身主動發數據包的時候選擇一個默認的網關

若是原來存在默認網關,而不是你想設定的那個,那麼先刪除
# ip route del default via 10.1.1.1

# ip route add default via 3.3.3.1
四、設定路由規則,保證數據包從原網卡回去
# ip rule add from 3.3.3.2 table 1
 <— from 指定數據包的源IP
 <— 若是數據包的源IP是3.3.3.2,那麼就使用路由表1里路由條目對數據包進行路由

# ip rule add from 4.4.4.2 table 2

路由器的配置:
 一、打開路由轉發
 二、配置IP

客戶端配置:
 一、配置IP
 二、網關根據實驗改變
驗證:
A:
一、把客戶端的默認網關設置爲1.1.1.1 ,模擬電信線路
二、ping 3.3.3.2 <–Server電信線路的IP
三、捉包
在router_1: tcpdump icmp -n -i eth1
在router_2:  tcpdump icmp -n -i eth1

B:
一、把客戶端的默認網關設置爲2.2.2.1 ,模擬電信線路
二、ping 4.4.4.2 <–Server網通線路的IP
三、捉包
在router_1: tcpdump icmp -n -i eth1
在router_2:  tcpdump icmp -n -i eth1

 
 
http://itoedr.blog.163.com/blog/static/12028429720135237643677/

linux路由工具:iproute2/iptables(路由配置實例)  

2013-06-23 19:07:01|  分類: 路由負載均衡 |  標籤:路由方案  linuxk路由技術  |舉報|字號 訂閱

下載LOFTER客戶端
 
 

一、ip route add 和 ip rule add to之間的區別

ip route add 是往main表中增長目的地址路由表項.ip route add*****此處只能以源地址來區分路由;


ip rule add to,往指定表增長目的地址路由表項. 咱們能夠建多個表,能夠以目標地址區分路由;
ip rule add from,往指定表中增長源地址路由表項 ;

2、Linux下基於路由策略的IP地址控制實例

 

1、背景描述

 

LINUX是一臺網關服務器,內有3塊網卡。

eth1綁定172.17.0.0/16的IP,該網段IP能夠經過172.17.1.1上網。

eth0綁定192.168.10.0/24的IP,該網段IP能夠經過192.168.10.1上網。

eth2綁定192.168.1.1,是內網用戶的網關。

 

2、需求分析

 

內網用戶應該走172.17.1.1這個路由上網。

但因爲工做須要,部分用戶應該有訪問圖中「專用網絡」的權限。

也就是說,應該走192.168.10.1這個路由。

 

另一點,全部人應該能夠訪問FTP服務器,這個服務器的IP是192.168.10.96

也就是說,走172.17.1.1路由的人,也應該能訪問192.168.10.96,且能夠上網。

 

3、解決方案

 

要解決這個問題,用到了一下幾個命令,具體使用方法須要另查資料。

ip route

ip rule

arp

 

注:關於ip命令的用法,請查閱ip中文手冊。

 

一、綁定IP

ifconfig eth1 172.17.3.x netmask 255.255.0.0

ifconfig eth0 192.168.10.2 netmask 255.255.255.0

ifconfig eth2 192.168.1.1 netmask 255.255.255.0

而後分別修改/etc/sysconfig/network-script/ifcfg-ethx文件,以使計算機啓動自動設置IP地址。 

在ubuntu下,使用interfaces來定義;

 

 

二、建立特殊路由表(手中建立)

vi /etc/iproute2/rt_table

代碼:

 

#

# reserved values

#

255 local

254 main

253 default

0 unspec

 

200 NET10

#

# local

#

#1 inr.ruhep

 

 

上面那個200 NET10爲新添加,自定義編號爲200,名字爲NET10

 

三、向NET10路由中添加它本身的默認路由。

代碼:

 

ip route add default via 192.168.10.1 table NET10

 

 

注意,這個table NET10必定不要忘了寫,不然寫到了主路由表中。

 

四、建立特殊路由規則

 

用ip rule能夠看到計算機當前的路由規則。

引用:

 

0: from all lookup local

32766: from all lookup main

32767: from all lookup default

 

 

能夠看到,規則中走了3個路由表,local、main、default

咱們日常用route看到的,實際是路由表main

這些規則是按序號大小順序走的,一個不一樣,則走下一個,知道通路或走完爲止。

開始添加咱們本身的路由NET10到路由表中。

代碼:

 

ip rule add from 192.168.1.222 pref 10000 table NET10

 

 

這個意思是說,若是來自IP地址爲192.168.1.222的訪問,則啓用NET10的路由表中的路由規則。

而NET10的路由規則是什麼呢?上面已經設置了,走的是192.168.10.1的網段。

接下來,使LINUX能夠NAT(這裏再也不細說HOW TO了)

 

五、讓全部人能夠訪問192.168.10.xx(這個IP不便說出來)

 

由於其他人都走了172.17.1.1這個路由,因此他們是沒法訪問192.168.10.xx的 。

怎麼才能實現呢?再添加個策略就能夠了!

代碼:

 

ip rule add to 192.168.10.xx pref 10001 table NET10

 

 

這句話的意思是說,全部人,若是目的IP是192.168.10.xx,則臨時使用NET10的路由表。

這樣作,安全會不會有安全問題呢?路由變了,他們會不會訪問到專用網絡呢?

不會的,由於路由規則是to 192.168.10.xx,也就是目標是96時,才該路由的,訪問別的網站仍是走原來的路由。

若是說訪問到專用網絡的機器,也就只有10.xx這一臺而已。

這裏,咱們還能夠作一個小技巧,不告訴別人192.168.10.xx的地址,只告訴他們網關192.168.1.1上有這個服務

iptables -t nat -A PREROUTING -d 192.168.1.1/32 --dport 21 -j DNAT --to 192.168.10.xx:21

 

六、防止其餘人篡改IP地址而得到特殊權限

 

arp有個靜態功能CM,不是C,你們可能知道。

若是給一個IP地址強行綁定一個非他本身的MAC,會怎麼樣呢?雙方會話將會失敗!

好,咱們來利用這一點!

 

首先,我寫了一個文件iproute.c

代碼:

 

#include

#include

main ()

{

int i;

for(i=2;i<255;i++)

printf("192.168.1.%d\t\t00:00:00:00:00:00\n",i);

}

 

 

gcc iproute.c -o iproute

將編譯出一個可執行文件

注:不該該包括主機IP地址自己,因此從2循環到254(255是廣播)

 

其次,生成一個C的IP地址和全爲00的MAC地址。

代碼:

 

./iproute > /etc/ethers

 

 

 

再次,修改IP-MAC匹配列表。

vi /etc/ethers

具體怎麼該我就不用細說了,相信你們都會。

 

最後,作靜態IP-MAC綁定。

arp -f

 

七、爲了安全,創建防火牆,修改main路由表

 

默認的路由表應該有192.168.10.0/24和172.17.0.0/16網段的內容,爲了安全,能夠去掉。

參考實例:

ip route add 58.14.0.0/15 via 192.168.33.1 table cnline

此處會新建路由表cnline;ip route add 58.16.0.0/16 via 192.168.33.1 table cnline

ip route del default #操做的是路由表main; ip route add default via 192.168.33.1 #也給主路由表main加上了cnline相同的網關,單網卡狀況,只能如此,多網卡便可出於不一樣網卡了,使用ebtables也能夠實現相似功能; ip rule add from 192.168.2.6 pref 1000 lookup cnline #表示主機源192.168.2.6的請求都去cnline表的規定路由; ip rule add from 192.168.2.4 pref 1000 lookup cnline ip rule add from 192.168.2.32 pref 1000 lookup cnline ip rule add to 10.10.10.189 pref 1000 lookup cnline      #即去目標地址爲10.10.10.189的數據包也在cnline中找出路;其中lookup能夠省去,不過筆者喜歡寫着,意義更明確。
相關文章
相關標籤/搜索