建体彩网|中彩网双色球连号|
?
快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

永樂國際樂在其中尤文:Linux策略性路由應用及深入分析

?

策略性路由

策略性是指對付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

首先我們可以看看路由表默認的所有規則:

[email protected]# ip rule list

0: from all lookup local

32766: from all lookup main

32767: from all lookup default

規則0,它是優先級別最高的規則,規則規定,所有的包,都必須首先應用local表(254)進行路由。本規則不能被變動和刪除。

規則32766,規定所有的包,應用表main進行路由。本規則可以被變動和刪除。

規則32767,規定所有的包,應用表default進行路由。本規則可以被變動和刪除。

在默認環境下進行路由時,首先會根據規則0在本地路由表里探求路由,假如目的地址是本收集,或是廣播地址的話,在這里就可以找到相宜的路由;假如路由掉敗,就會匹配下一個不空的規則,在這里只有32766規則,在這里將會在主路由表里探求路由;假如掉敗,就會匹配32767規則,即探求默認路由表。假如掉敗,路由將掉敗。重這里可以看出,策略性路由是往前兼容的。

還可以添加規則:

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,動作是。添加今后,我們可以看看系統規則的變更。

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策略路由代碼的主要部分是對路由表的操作。對付路由表的操作,物理操作是直不雅的和易于理解的。對付表的操作不外乎便是添加、刪除、更新等的操作。還有一種操作,是所謂的語義操作,語義操作主如果指諸如謀略下一條的地址,把節點轉換為路由項,探求指定信息的路由等。

1、物理操作(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

2、語義操作(semantics operation):

語義操作并不涉及路由表整體框架的理解,而且,函數名也是不言自明的,以是請大年夜家參考fib_semantics.c。

3、接口(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

4、收集設備(net dev event)

路由是和硬件關聯的,當收集設備啟動或關閉的時刻,必須看護路由表的治理法度榜樣,更新路由表的信息。

fib_disable_ip 567

fib_inetaddr_event 575

fib_netdev_event

5、內部掩護( magic)

上面我們提到,本地路由表(local table)的掩護是由系統自動進行的。也便是說當用戶為硬件設置IP地址等的時刻,系統自動在本地路由表里添加本地接口地址以及廣播地址。

fib_magic 417

fib_add_ifaddr 459

fib_del_ifaddr 498

Rule

1、數據布局

規則在fib_rules.c的52行里定義為 struct fib_rule。而RPDB里所有的路由是保存在101行的變量fib_rules里的,留意這個變量很關鍵,它掌管著所有的規則,規則的添加和刪除都是對這個變量進行的。

2、系統定義規則:

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

上面的這段代碼的思路是異常的清晰的。首先法度榜樣從優先級高到低掃描所有的規則,假如規則匹配,處置懲罰該規則的動作。假如是通俗的路由尋址或者是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在路由表進行路由今后,假如射中就會在路由緩存里增添該路由。同時系統還會準時反省路由緩存里的項目是否掉效,假如掉效則清除。

免責聲明:以上內容源自網絡,版權歸原作者所有,如有侵犯您的原創版權請告知,我們將盡快刪除相關內容。

您可能還會對下面的文章感興趣:

建体彩网
玩哪个直播间好赚钱 中国足彩网即时指数 跪求用手机赚钱稳定的工作 广东南粤风采坐标图 特码生肖走势图 广东36选7 棋牌游戏安全下载 新世纪娱乐城 足彩半全场 辽宁快乐12预测一定牛