轉載於:https://blog.csdn.net/freeking101/article/details/68939059
From: http://blog.jobbole.com/97270/
From: https://linux.cn/article-3144-1.html
From: http://chrinux.blog.51cto.com/6466723/1188108
From: http://www.linuxdiyf.com/linux/23935.html
iproute基本介紹:https://segmentfault.com/a/1190000000638244
iproute2 之 ip命令使用教程手冊:https://www.iamle.com/archives/1750.html
iproute2 github地址(GitHub上有英文版使用文檔):https://github.com/dmbaturin/iproute2-cheatsheet
《iproute2 對決 net-tools》(英文原文:Linux TCP/IP networking: net-tools vs. iproute2)
net-tools 和 iproute2 對比
如今很多系統管理員依然通過組合使用諸如ifconfig、route、arp和netstat等命令行工具(統稱為net-tools)來配置網絡功能,解決網絡故障。net-tools起源於BSD的TCP/IP工具箱,后來成為老版本Linux內核中配置網絡功能的工具。但自2001年起,Linux社區已經對其停止維護。同時,一些Linux發行版比如Arch Linux和CentOS/RHEL 7則已經完全拋棄了net-tools,只支持iproute2。
作為網絡配置工具的一份子,iproute2是linux下管理控制TCP/IP網絡和流量控制的新一代工具包,旨在替代老派的工具鏈net-tools,即大家比較熟悉的ifconfig,arp,route,netstat等命令。。net-tools通過procfs(/proc)和ioctl系統調用去訪問和改變內核網絡配置,而iproute2則通過netlink套接字接口與內核通訊。拋開性能而言,net-tools的用法給人的感覺是比較亂,而iproute2的用戶接口相對net-tools來說相對來說,更加直觀。比如,各種網絡資源(如link、IP地址、路由和隧道等)均使用合適的對象抽象去定義,使得用戶可使用一致的語法去管理不同的對象。。更重要的是,到目前為止,iproute2仍處在持續開發中。
所以,net-tools和iproute2都需要去學習掌握了。
如果你仍在使用net-tools,而且尤其需要跟上新版Linux內核中的最新最重要的網絡特性的話,那么是時候轉到iproute2的陣營了。原因就在於使用iproute2可以做很多net-tools無法做到的事情。
對於那些想要轉到使用iproute2的用戶,有必要了解下面有關net-tools和iproute2的眾多對比。
iproute2的核心命令是ip:

root@astrol:~# ifconfig eth0
root@astrol:~# ip addr add 192.168.6.140/24 brd + dev eth0:1
root@astrol:~# ip addr flush dev eth0

linux的ip命令和ifconfig類似,但前者功能更強大,並旨在取代后者。使用ip命令,只需一個命令,你就能很輕松地執行一些網絡管理任務。ifconfig是net-tools中已被廢棄使用的一個命令,許多年前就已經沒有維護了。iproute2套件里提供了許多增強功能的命令,ip命令即是其中之一。
Net tools vs Iproute2
要安裝ip,請點擊這里下載iproute2套裝工具 。不過,大多數Linux發行版已經預裝了iproute2工具。
顯示所有已連接的網絡接口
下面的命令顯示出所有可用網絡接口的列表(無論接口是否激活)。
激活或停用網絡接口
使用這些命令來激活或停用某個指定的網絡接口。
為網絡接口分配IPv4地址
可以使用iproute2給同一個接口分配多個IP地址,ifconfig則無法這么做。使用ifconfig的變通方案是使用IP別名。
移除網絡接口的IPv4地址
就IP地址的移除而言,除了給接口分配全0地址外,net-tools沒有提供任何合適的方法來移除網絡接口的IPv4地址。而 iproute2則能很好地完成。
顯示網絡接口的IPv4地址
為網絡接口分配IPv6地址
使用這些命令為網絡接口添加IPv6地址。net-tools和iproute2都允許用戶為一個接口添加多個IPv6地址。
顯示網絡接口的IPv6地址
net-tools和iproute2都可以顯示出所有已分配的IPv6地址。

移除網絡設備的IPv6地址
使用這些命令可移除接口中不必要的IPv6地址。
改變網絡接口的MAC地址
使用下面的命令可篡改網絡接口的MAC地址,請注意在更改MAC地址前,需要停用接口。
查看IP路由表
net-tools中有兩個選擇來顯示內核的IP路由表:route和netstat。在iproute2中,使用命令ip route。

添加和修改默認路由
這里的命令用來添加或修改內核IP路由表中的默認路由規則。請注意在net-tools中可通過添加新的默認路由、刪除舊的默認路由來實現修改默認路由。在iproute2使用ip route命令來代替。
添加和移除靜態路由
查看套接字統計信息
這里的命令用來查看套接字統計信息(比如活躍或監聽狀態的TCP/UDP套接字)。
查看ARP表

添加或刪除靜態ARP項
添加、刪除或查看多播地址
iproute2中ip命令
你也可以使用git命令來下載最新源代碼來編譯:
$ git clone https://kernel.googlesource.com/pub/scm/linux/kernel/git/shemminger/iproute2.git
iproute2 git clone
設置和刪除Ip地址
要給你的機器設置一個IP地址,可以使用下列ip命令:
$ sudo ip addr add 192.168.0.193/24 dev wlan0
請注意IP地址要有一個后綴,比如/24。這種用法用於在無類域內路由選擇(CIDR)中來顯示所用的子網掩碼。在這個例子中,子網掩碼是255.255.255.0。
在你按照上述方式設置好IP地址后,需要查看是否已經生效。
$ ip addr show wlan0
set ip address
你也可以使用相同的方式來刪除IP地址,只需用del代替add。
$ sudo ip addr del 192.168.0.193/24 dev wlan0
delete ip address
列出路由表條目
ip命令的路由對象的參數還可以幫助你查看網絡中的路由數據,並設置你的路由表。第一個條目是默認的路由條目,你可以隨意改動它。
在這個例子中,有幾個路由條目。這個結果顯示有幾個設備通過不同的網絡接口連接起來。它們包括WIFI、以太網和一個點對點連接。
$ ip route show
ip route show
假設現在你有一個IP地址,你需要知道路由包從哪里來。可以使用下面的路由選項(譯注:列出了路由所使用的接口等):
$ ip route get 10.42.0.47
ip route get
更改默認路由
要更改默認路由,使用下面ip命令:
$ sudo ip route add default via 192.168.0.196
default route
顯示網絡統計數據
使用ip命令還可以顯示不同網絡接口的統計數據。
ip statistics all interfaces
當你需要獲取一個特定網絡接口的信息時,在網絡接口名字后面添加選項ls即可。使用多個選項-s會給你這個特定接口更詳細的信息。特別是在排除網絡連接故障時,這會非常有用。
$ ip -s -s link ls p2p1
ip link statistics
ARP條目
地址解析協議(ARP)用於將一個IP地址轉換成它對應的物理地址,也就是通常所說的MAC地址。使用ip命令的neigh或者neighbour選項,你可以查看接入你所在的局域網的設備的MAC地址。
$ ip neighbour
ip neighbour
監控netlink消息
也可以使用ip命令查看netlink消息。monitor選項允許你查看網絡設備的狀態。比如,所在局域網的一台電腦根據它的狀態可以被分類成REACHABLE或者STALE。使用下面的命令:
$ ip monitor all
ip monitor all
激活和停止網絡接口
你可以使用ip命令的up和down選項來激某個特定的接口,就像ifconfig的用法一樣。
在這個例子中,當ppp0接口被激活和在它被停止和再次激活之后,你可以看到相應的路由表條目。這個接口可能是wlan0或者eth0。將ppp0更改為你可用的任意接口即可。
ip link set up and down
獲取幫助
當你陷入困境,不知道某一個特定的選項怎么用的時候,你可以使用help選項。man頁面並不會提供許多關於如何使用ip選項的信息,因此這里就是獲取幫助的地方。
比如,想知道關於route選項更多的信息:
$ ip route help
ip route help
小結:對於網絡管理員們和所有的Linux使用者們,ip命令是必備工具。是時候拋棄ifconfig命令了,特別是當你寫腳本時。
net-tools 中 ifconfig 詳細解釋
許多windows非常熟悉ipconfig命令行工具,它被用來獲取網絡接口配置信息並對此進行修改。Linux系統擁有一個類似的工具,也就是ifconfig(interfaces config)。通常需要以root身份登錄或使用sudo以便在Linux機器上使用ifconfig工具。依賴於ifconfig命令中使用一些選項屬性,ifconfig工具不僅可以被用來簡單地獲取網絡接口配置信息,還可以修改這些配置。
1.命令格式:
ifconfig [網絡設備] [參數]
2.命令功能:
ifconfig 命令用來查看和配置網絡設備。當網絡環境發生改變時可通過此命令對網絡進行相應的配置。
3.命令參數:
up 啟動指定網絡設備/網卡。
down 關閉指定網絡設備/網卡。該參數可以有效地阻止通過指定接口的IP信息流,如果想永久地關閉一個接口,我們還需要從核心路由表中將該接口的路由信息全部刪除。
arp 設置指定網卡是否支持ARP協議。
-promisc 設置是否支持網卡的promiscuous模式,如果選擇此參數,網卡將接收網絡中發給它所有的數據包
-allmulti 設置是否支持多播模式,如果選擇此參數,網卡將接收網絡中所有的多播數據包
-a 顯示全部接口信息
-s 顯示摘要信息(類似於 netstat -i)
add 給指定網卡配置IPv6地址
del 刪除指定網卡的IPv6地址
<硬件地址> 配置網卡最大的傳輸單元
mtu<字節數> 設置網卡的最大傳輸單元 (bytes)
netmask<子網掩碼> 設置網卡的子網掩碼。掩碼可以是有前綴0x的32位十六進制數,也可以是用點分開的4個十進制數。如果不打算將網絡分成子網,可以不管這一選項;如果要使用子網,那么請記住,網絡中每一個系統必須有相同子網掩碼。
tunel 建立隧道
dstaddr 設定一個遠端地址,建立點對點通信
-broadcast<地址> 為指定網卡設置廣播協議
-pointtopoint<地址> 為網卡設置點對點通訊協議
multicast 為網卡設置組播標志
address 為網卡設置IPv4地址
txqueuelen<長度> 為網卡設置傳輸列隊的長度
4.使用實例:
實例1:顯示網絡設備信息(激活狀態的)
命令:ifconfig
實例2:啟動關閉指定網卡
命令:
ifconfig eth0 up
ifconfig eth0 down
實例3:為網卡配置和刪除IPv6地址
命令:
ifconfig eth0 add 33ffe:3240:800:1005::2/64
ifconfig eth0 del 33ffe:3240:800:1005::2/64
實例4:用ifconfig修改MAC地址
命令:
ifconfig eth0 hw ether 00:AA:BB:CC:DD:EE
實例5:配置IP地址
[root@localhost ~] # ifconfig eth0 192.168.120.56 netmask 255.255.255.0
[root@localhost ~] # ifconfig eth0 192.168.120.56 netmask 255.255.255.0 broadcast 192.168.120.255
說明:
ifconfig eth0 192.168.120.56
給eth0網卡配置IP地:192.168.120.56
ifconfig eth0 192.168.120.56 netmask 255.255.255.0
給eth0網卡配置IP地址:192.168.120.56 ,並加上子掩碼:255.255.255.0
ifconfig eth0 192.168.120.56 netmask 255.255.255.0 broadcast 192.168.120.255
/給eth0網卡配置IP地址:192.168.120.56,加上子掩碼:255.255.255.0,加上個廣播地址: 192.168.120.255
實例6:啟用和關閉ARP協議
命令:
ifconfig eth0 arp
ifconfig eth0 -arp
輸出:
[root@localhost ~] # ifconfig eth0 -arp
說明:
ifconfig eth0 arp 開啟網卡eth0 的arp協議;
ifconfig eth0 -arp 關閉網卡eth0 的arp協議;
實例7:設置最大傳輸單元
命令:
ifconfig eth0 mtu 1500
net-tools中ifconfig 和 route 與 iproute2 中 ip
- ⑴、命令配置法:ifconfig和ip
- Ifconfig ethx:x IP/netmask
- ip addr add IP dev ethx label ethX:X
- 利用命令配置的只是暫時的IP地址,如果重啟網絡服務和系統都會失效的。
- ⑵、配置文件配置法:
- 修改/etc/sysconfig/network-scripts/ifcfg-ethx:x
- DEVICE=ethx:x
- BOOTPROTO=static
- IPIPADDR= IP地址
- NETMASK= 子網掩碼
- GATEWAY= 網關
- ONBOOT=YES 是否開機啟用
- HWADDR=...... MAC
- 非主要地址不能用DHCP服務獲得,必須為靜止的。
- ⑴、DNS配置文件位置:/etc/resolv.conf
- ⑵、DNS配置格式:
- nameserver DNS_IP1
- nameserver DNS_IP2
- 指定本地解析:
- /etc/hosts下添加
- 目標主機IP 主機名
- fg:172.16.36.1 www.chris.com
- DNS解析過程-->/etc/hosts-->DNS 服務器
- ⑴、配置文件位置: /etc/sysconfig/network
- ⑵、配置格式:
- HOSTNAME=名稱
- NETWORKING={yes|no}:是否開啟網絡功能
Linux策略性路由應用及分析(iproute2)
http://blog.chinaunix.net/uid-738429-id-2057370.html
Linux策略性路由應用及分析(iproute2)
策略性路由
策略性是指對於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
規則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,動作是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策略路由代碼的主要部分是對路由表的操作。對於路由表的操作,物理操作是直觀的和易於理解的。對於表的操作不外乎就是添加、刪除、更新等的操作。還有一種操作,是所謂的語義操作,語義操作主要是指諸如計算下一條的地址,把節點轉換為路由項,尋找指定信息的路由等。
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,作為尋找路由的入口點,在這里有必要詳細討論這個函數,下面是源代碼:
上面的這段代碼的思路是非常的清晰的。首先程序從優先級高到低掃描所有的規則,如果規則匹配,處理該規則的動作。如果是普通的路由尋址或者是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在路由表進行路由以后,如果命中就會在路由緩存里增加該路由。同時系統還會定時檢查路由緩存里的項目是否失效,如果失效則清除。
From: http://blog.jobbole.com/97270/
From: https://linux.cn/article-3144-1.html
From: http://chrinux.blog.51cto.com/6466723/1188108
From: http://www.linuxdiyf.com/linux/23935.html
iproute基本介紹:https://segmentfault.com/a/1190000000638244
iproute2 之 ip命令使用教程手冊:https://www.iamle.com/archives/1750.html
iproute2 github地址(GitHub上有英文版使用文檔):https://github.com/dmbaturin/iproute2-cheatsheet
《iproute2 對決 net-tools》(英文原文:Linux TCP/IP networking: net-tools vs. iproute2)
net-tools 和 iproute2 對比
如今很多系統管理員依然通過組合使用諸如ifconfig、route、arp和netstat等命令行工具(統稱為net-tools)來配置網絡功能,解決網絡故障。net-tools起源於BSD的TCP/IP工具箱,后來成為老版本Linux內核中配置網絡功能的工具。但自2001年起,Linux社區已經對其停止維護。同時,一些Linux發行版比如Arch Linux和CentOS/RHEL 7則已經完全拋棄了net-tools,只支持iproute2。
作為網絡配置工具的一份子,iproute2是linux下管理控制TCP/IP網絡和流量控制的新一代工具包,旨在替代老派的工具鏈net-tools,即大家比較熟悉的ifconfig,arp,route,netstat等命令。。net-tools通過procfs(/proc)和ioctl系統調用去訪問和改變內核網絡配置,而iproute2則通過netlink套接字接口與內核通訊。拋開性能而言,net-tools的用法給人的感覺是比較亂,而iproute2的用戶接口相對net-tools來說相對來說,更加直觀。比如,各種網絡資源(如link、IP地址、路由和隧道等)均使用合適的對象抽象去定義,使得用戶可使用一致的語法去管理不同的對象。。更重要的是,到目前為止,iproute2仍處在持續開發中。
所以,net-tools和iproute2都需要去學習掌握了。
如果你仍在使用net-tools,而且尤其需要跟上新版Linux內核中的最新最重要的網絡特性的話,那么是時候轉到iproute2的陣營了。原因就在於使用iproute2可以做很多net-tools無法做到的事情。
對於那些想要轉到使用iproute2的用戶,有必要了解下面有關net-tools和iproute2的眾多對比。
iproute2的核心命令是ip:

root@astrol:~# ifconfig eth0
root@astrol:~# ip addr add 192.168.6.140/24 brd + dev eth0:1
root@astrol:~# ip addr flush dev eth0

linux的ip命令和ifconfig類似,但前者功能更強大,並旨在取代后者。使用ip命令,只需一個命令,你就能很輕松地執行一些網絡管理任務。ifconfig是net-tools中已被廢棄使用的一個命令,許多年前就已經沒有維護了。iproute2套件里提供了許多增強功能的命令,ip命令即是其中之一。
Net tools vs Iproute2
要安裝ip,請點擊這里下載iproute2套裝工具 。不過,大多數Linux發行版已經預裝了iproute2工具。
顯示所有已連接的網絡接口
下面的命令顯示出所有可用網絡接口的列表(無論接口是否激活)。
激活或停用網絡接口
使用這些命令來激活或停用某個指定的網絡接口。
為網絡接口分配IPv4地址
可以使用iproute2給同一個接口分配多個IP地址,ifconfig則無法這么做。使用ifconfig的變通方案是使用IP別名。
移除網絡接口的IPv4地址
就IP地址的移除而言,除了給接口分配全0地址外,net-tools沒有提供任何合適的方法來移除網絡接口的IPv4地址。而 iproute2則能很好地完成。
顯示網絡接口的IPv4地址
為網絡接口分配IPv6地址
使用這些命令為網絡接口添加IPv6地址。net-tools和iproute2都允許用戶為一個接口添加多個IPv6地址。
顯示網絡接口的IPv6地址
net-tools和iproute2都可以顯示出所有已分配的IPv6地址。

移除網絡設備的IPv6地址
使用這些命令可移除接口中不必要的IPv6地址。
改變網絡接口的MAC地址
使用下面的命令可篡改網絡接口的MAC地址,請注意在更改MAC地址前,需要停用接口。
查看IP路由表
net-tools中有兩個選擇來顯示內核的IP路由表:route和netstat。在iproute2中,使用命令ip route。

添加和修改默認路由
這里的命令用來添加或修改內核IP路由表中的默認路由規則。請注意在net-tools中可通過添加新的默認路由、刪除舊的默認路由來實現修改默認路由。在iproute2使用ip route命令來代替。
添加和移除靜態路由
查看套接字統計信息
這里的命令用來查看套接字統計信息(比如活躍或監聽狀態的TCP/UDP套接字)。
查看ARP表

添加或刪除靜態ARP項
添加、刪除或查看多播地址
iproute2中ip命令
你也可以使用git命令來下載最新源代碼來編譯:
$ git clone https://kernel.googlesource.com/pub/scm/linux/kernel/git/shemminger/iproute2.git
iproute2 git clone
設置和刪除Ip地址
要給你的機器設置一個IP地址,可以使用下列ip命令:
$ sudo ip addr add 192.168.0.193/24 dev wlan0
請注意IP地址要有一個后綴,比如/24。這種用法用於在無類域內路由選擇(CIDR)中來顯示所用的子網掩碼。在這個例子中,子網掩碼是255.255.255.0。
在你按照上述方式設置好IP地址后,需要查看是否已經生效。
$ ip addr show wlan0
set ip address
你也可以使用相同的方式來刪除IP地址,只需用del代替add。
$ sudo ip addr del 192.168.0.193/24 dev wlan0
delete ip address
列出路由表條目
ip命令的路由對象的參數還可以幫助你查看網絡中的路由數據,並設置你的路由表。第一個條目是默認的路由條目,你可以隨意改動它。
在這個例子中,有幾個路由條目。這個結果顯示有幾個設備通過不同的網絡接口連接起來。它們包括WIFI、以太網和一個點對點連接。
$ ip route show
ip route show
假設現在你有一個IP地址,你需要知道路由包從哪里來。可以使用下面的路由選項(譯注:列出了路由所使用的接口等):
$ ip route get 10.42.0.47
ip route get
更改默認路由
要更改默認路由,使用下面ip命令:
$ sudo ip route add default via 192.168.0.196
default route
顯示網絡統計數據
使用ip命令還可以顯示不同網絡接口的統計數據。
ip statistics all interfaces
當你需要獲取一個特定網絡接口的信息時,在網絡接口名字后面添加選項ls即可。使用多個選項-s會給你這個特定接口更詳細的信息。特別是在排除網絡連接故障時,這會非常有用。
$ ip -s -s link ls p2p1
ip link statistics
ARP條目
地址解析協議(ARP)用於將一個IP地址轉換成它對應的物理地址,也就是通常所說的MAC地址。使用ip命令的neigh或者neighbour選項,你可以查看接入你所在的局域網的設備的MAC地址。
$ ip neighbour
ip neighbour
監控netlink消息
也可以使用ip命令查看netlink消息。monitor選項允許你查看網絡設備的狀態。比如,所在局域網的一台電腦根據它的狀態可以被分類成REACHABLE或者STALE。使用下面的命令:
$ ip monitor all
ip monitor all
激活和停止網絡接口
你可以使用ip命令的up和down選項來激某個特定的接口,就像ifconfig的用法一樣。
在這個例子中,當ppp0接口被激活和在它被停止和再次激活之后,你可以看到相應的路由表條目。這個接口可能是wlan0或者eth0。將ppp0更改為你可用的任意接口即可。
ip link set up and down
獲取幫助
當你陷入困境,不知道某一個特定的選項怎么用的時候,你可以使用help選項。man頁面並不會提供許多關於如何使用ip選項的信息,因此這里就是獲取幫助的地方。
比如,想知道關於route選項更多的信息:
$ ip route help
ip route help
小結:對於網絡管理員們和所有的Linux使用者們,ip命令是必備工具。是時候拋棄ifconfig命令了,特別是當你寫腳本時。
net-tools 中 ifconfig 詳細解釋
許多windows非常熟悉ipconfig命令行工具,它被用來獲取網絡接口配置信息並對此進行修改。Linux系統擁有一個類似的工具,也就是ifconfig(interfaces config)。通常需要以root身份登錄或使用sudo以便在Linux機器上使用ifconfig工具。依賴於ifconfig命令中使用一些選項屬性,ifconfig工具不僅可以被用來簡單地獲取網絡接口配置信息,還可以修改這些配置。
1.命令格式:
ifconfig [網絡設備] [參數]
2.命令功能:
ifconfig 命令用來查看和配置網絡設備。當網絡環境發生改變時可通過此命令對網絡進行相應的配置。
3.命令參數:
up 啟動指定網絡設備/網卡。
down 關閉指定網絡設備/網卡。該參數可以有效地阻止通過指定接口的IP信息流,如果想永久地關閉一個接口,我們還需要從核心路由表中將該接口的路由信息全部刪除。
arp 設置指定網卡是否支持ARP協議。
-promisc 設置是否支持網卡的promiscuous模式,如果選擇此參數,網卡將接收網絡中發給它所有的數據包
-allmulti 設置是否支持多播模式,如果選擇此參數,網卡將接收網絡中所有的多播數據包
-a 顯示全部接口信息
-s 顯示摘要信息(類似於 netstat -i)
add 給指定網卡配置IPv6地址
del 刪除指定網卡的IPv6地址
<硬件地址> 配置網卡最大的傳輸單元
mtu<字節數> 設置網卡的最大傳輸單元 (bytes)
netmask<子網掩碼> 設置網卡的子網掩碼。掩碼可以是有前綴0x的32位十六進制數,也可以是用點分開的4個十進制數。如果不打算將網絡分成子網,可以不管這一選項;如果要使用子網,那么請記住,網絡中每一個系統必須有相同子網掩碼。
tunel 建立隧道
dstaddr 設定一個遠端地址,建立點對點通信
-broadcast<地址> 為指定網卡設置廣播協議
-pointtopoint<地址> 為網卡設置點對點通訊協議
multicast 為網卡設置組播標志
address 為網卡設置IPv4地址
txqueuelen<長度> 為網卡設置傳輸列隊的長度
4.使用實例:
實例1:顯示網絡設備信息(激活狀態的)
命令:ifconfig
實例2:啟動關閉指定網卡
命令:
ifconfig eth0 up
ifconfig eth0 down
實例3:為網卡配置和刪除IPv6地址
命令:
ifconfig eth0 add 33ffe:3240:800:1005::2/64
ifconfig eth0 del 33ffe:3240:800:1005::2/64
實例4:用ifconfig修改MAC地址
命令:
ifconfig eth0 hw ether 00:AA:BB:CC:DD:EE
實例5:配置IP地址
[root@localhost ~] # ifconfig eth0 192.168.120.56 netmask 255.255.255.0
[root@localhost ~] # ifconfig eth0 192.168.120.56 netmask 255.255.255.0 broadcast 192.168.120.255
說明:
ifconfig eth0 192.168.120.56
給eth0網卡配置IP地:192.168.120.56
ifconfig eth0 192.168.120.56 netmask 255.255.255.0
給eth0網卡配置IP地址:192.168.120.56 ,並加上子掩碼:255.255.255.0
ifconfig eth0 192.168.120.56 netmask 255.255.255.0 broadcast 192.168.120.255
/給eth0網卡配置IP地址:192.168.120.56,加上子掩碼:255.255.255.0,加上個廣播地址: 192.168.120.255
實例6:啟用和關閉ARP協議
命令:
ifconfig eth0 arp
ifconfig eth0 -arp
輸出:
[root@localhost ~] # ifconfig eth0 -arp
說明:
ifconfig eth0 arp 開啟網卡eth0 的arp協議;
ifconfig eth0 -arp 關閉網卡eth0 的arp協議;
實例7:設置最大傳輸單元
命令:
ifconfig eth0 mtu 1500
net-tools中ifconfig 和 route 與 iproute2 中 ip
- ⑴、命令配置法:ifconfig和ip
- Ifconfig ethx:x IP/netmask
- ip addr add IP dev ethx label ethX:X
- 利用命令配置的只是暫時的IP地址,如果重啟網絡服務和系統都會失效的。
- ⑵、配置文件配置法:
- 修改/etc/sysconfig/network-scripts/ifcfg-ethx:x
- DEVICE=ethx:x
- BOOTPROTO=static
- IPIPADDR= IP地址
- NETMASK= 子網掩碼
- GATEWAY= 網關
- ONBOOT=YES 是否開機啟用
- HWADDR=...... MAC
- 非主要地址不能用DHCP服務獲得,必須為靜止的。
- ⑴、DNS配置文件位置:/etc/resolv.conf
- ⑵、DNS配置格式:
- nameserver DNS_IP1
- nameserver DNS_IP2
- 指定本地解析:
- /etc/hosts下添加
- 目標主機IP 主機名
- fg:172.16.36.1 www.chris.com
- DNS解析過程-->/etc/hosts-->DNS 服務器
- ⑴、配置文件位置: /etc/sysconfig/network
- ⑵、配置格式:
- HOSTNAME=名稱
- NETWORKING={yes|no}:是否開啟網絡功能
Linux策略性路由應用及分析(iproute2)
http://blog.chinaunix.net/uid-738429-id-2057370.html
Linux策略性路由應用及分析(iproute2)
策略性路由
策略性是指對於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
規則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,動作是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策略路由代碼的主要部分是對路由表的操作。對於路由表的操作,物理操作是直觀的和易於理解的。對於表的操作不外乎就是添加、刪除、更新等的操作。還有一種操作,是所謂的語義操作,語義操作主要是指諸如計算下一條的地址,把節點轉換為路由項,尋找指定信息的路由等。
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,作為尋找路由的入口點,在這里有必要詳細討論這個函數,下面是源代碼:
上面的這段代碼的思路是非常的清晰的。首先程序從優先級高到低掃描所有的規則,如果規則匹配,處理該規則的動作。如果是普通的路由尋址或者是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在路由表進行路由以后,如果命中就會在路由緩存里增加該路由。同時系統還會定時檢查路由緩存里的項目是否失效,如果失效則清除。