摘自:https://blog.csdn.net/chengxuyuanyonghu/article/details/39558643
一、高級路由的基礎IP ROUTE2
基本命令:
ip link list 顯示ip鏈路狀態信息
ip address show 除顯示所有網絡地址
ip route show 顯示主路由表信息
ip neigh show 顯示鄰居表
linux系統路由表
linux可以自定義從1-252個路由表,
linux系統維護了4個路由表:
0#表 系統保留表
253#表 defulte table 沒特別指定的默認路由都放在改表
254#表 main table 沒指明路由表的所有路由放在該表
255#表 locale table 保存本地接口地址,廣播地址、NAT地址 由系統維護,用戶不得更改
路由表的查看可有以下二種方法:
ip route list table table_number
ip route list table table_name
路由表序號和表名的對應關系在/etc/iproute2/rt_tables中,可手動編輯
路由表添加完畢即時生效,下面為實例
ip route add default via 192.168.1.1 table 1 在一號表中添加默認路由為192.168.1.1
ip route add 192.168.0.0/24 via 192.168.1.2 table 1 在一號表中添加一條到192.168.0.0網段的路由為192.168.1.2
注:各路由表中應當指明默認路由,盡量不回查路由表.路由添加完畢,即可在路由規則中應用..
二、高級路由重點之一路由規則 ip rule
進行路由時,根據路由規則來進行匹配,按優先級(pref)從低到高匹配,直到找到合適的規則.所以在應用中配置默認路由是必要的..
ip rule show 顯示路由規則
路由規則的添加
ip rule add from 192.168.1.10/32 table 1 pref 100
如果pref值不指定,則將在已有規則最小序號前插入
注:創建完路由規則若需立即生效須執行#ip route flush cache;刷新路由緩沖
可參數解析如下: &n
From -- 源地址
To -- 目的地址(這里是選擇規則時使用,查找路由表時也使用)
Tos -- IP包頭的TOS(type of sevice)域Linux高級路由-
Dev -- 物理接口
Fwmark -- iptables標簽
采取的動作除了指定路由表外,還可以指定下面的動作:
Table 指明所使用的表
Nat 透明網關
Prohibit 丟棄該包,並發送 COMM.ADM.PROHIITED的ICMP信息
Reject 單純丟棄該包
Unreachable丟棄該包, 並發送 NET UNREACHABLE的ICMP信息
具體格式如下:更強大,使用更靈活,它使網絡管理員不僅能
Usage: ip rule [ list | add | del ] SELECTOR ACTION
SELECTOR := [ from PREFIX ] [ to PREFIX ] [ tos TOS ][ dev STRING ] [ pref NUMBER ]
ACTION := [ table TABLE_ID ] [ nat ADDRESS ][ prohibit | reject | unreachable ]
[ flowid CLASSID ]
TABLE_ID := [ local | main | default | new | NUMBER ]
-
策略路由
基於策略的路由比傳統路由在功能上更強大,使用更靈活,它使網絡管理員不僅能夠根據目的地址而且能夠根據報文大小、應用或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 show 顯示路由規則
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
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才能充分體現其功能
查看路由表內容在查看路由表之前,首先使用ip rule show命令來查看目前使用了哪些路由表,接着,再使用ip route show [table id | name]命令來查看路由表的內容。例如,可以使用ip route show table main來查看路由表main的內容,如果省略路由表名稱(如ip route show),會默認地查看路由表main的內容。
1. [root@localhost /]# ip rule show
2. 0: from all lookup local
3. 32766: from all lookup main
4. 32767: from all lookup default
5. [root@localhost /]#
6. [root@localhost /]# ip route show table main
7. 10.10.15.0/25 dev eth0 proto kernel scope link src 10.10.15.46
8. 192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.10
9. default via 10.10.15.1 dev eth0
10. [root@localhost /]#
在默認情況下,系統有三個路由表,這三個路由表的功能如下:
local:路由表local包含本機路由及廣播信息。例如,在本機上執行ssh 127.0.0.1時,就會參考這份路由表的內容,在正常情況下,只要配置好網卡的網絡設置,就會自動生成local路由表的內容,我們應該也不必修改其內容。
main:使用傳統命令route -n所看到的路由表就是main的內容。Linux系統在默認情況下使用這份路由表的內容來傳輸數據包,因此,其內容極為重要,在正常情況下,只要配置好網卡的網絡設置,就會自動生成main路由表的內容。
default:最后是default路由表,這個路由表在默認情況下內容為空;除非有特別的要求,否則保持其內容為空即可。
在此使用路由表main的內容進行解釋,以下是圖10-10路由表main的內容,因為在主機上有eth0及eth1兩塊網卡,且為其設置的IP分別是10.10.15.46/25及192.168.1.10/24,因此,路由表內的第.行即是告訴系統,如果有數據包要送到10.10.15.0/25這個網段,就直接將數據包由eth0接口送出即可,而本機臨近這個網段的IP是10.10.15.46,第.行則是設置到192.168.1.0/24的路由,其含義與第.行完全相同;以上這兩行是只要將計算機網卡上的IP設置好,並在網絡服務重啟之后,默認就會生成的路由,無需特別的設置。最后一行.則指:如果數據包不是送往10.10.15.0/25及192.168.1.0/24網段,那么數據包將統一轉發給10.10.15.1主機去處理,而10.10.15.1就是我們在網絡配置中所設置的“默認網關”。
1. [root@localhost /]# ip route show table main
2. 10.10.15.0/25 dev eth0 proto kernel scope link src 10.10.15.46
3. 192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.10
4. default via 10.10.15.1 dev eth0
5. [root@localhost /]#
2. 添加路由
添加路由在此還是一樣采用ip命令而不是route命令,下例首先使用ip route show.命令顯示路由表main的內容,接着再使用ip route add命令將所需的路由添加到路由表main中.,最后再次使用ip route show命令將路由表main的內容打印出來,此時就可以在路由表main之中看到剛才添加的路由了。
1. [root@localhost /]# ip route show table main
2. 10.10.15.0/25 dev eth0 proto kernel scope link src 10.10.15.46
3. 192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.10
4. default via 10.10.15.1 dev eth0
5. [root@localhost /]#
6. [root@localhost /]# ip route add 192.168.2.0/24 via 10.10.15.50 table main
7. [root@localhost /]#
8. [root@localhost /]# ip route show table main
9. 10.10.15.0/25 dev eth0 proto kernel scope link src 10.10.15.46
10. 192.168.2.0/24 via 10.10.15.50 dev eth0
11. 192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.10
12. default via 10.10.15.1 dev eth0
13. [root@localhost /]#
如果要添加的路由並未出現在現有的路由表中,又該如何處理呢?在此請先有一個概念,單純添加路由表並無意義,因為新增出來的路由表,系統默認是不會去使用的,如果要將路由添加到main以外的路由表,只有先添加“規則”才能確定新的路由表名稱(Table ID),有了新的路由表之后,才會把路由添加到新的路由表中。
我們使用下列示例來說明這個過程。首先使用ip rule show.來查詢RPDB的當前狀態,可以看到目前只有三條默認規則,接着,再使用ip rule add命令來添加一條規則.,此時系統內就多了一個有用的路由表,其路由表ID為10,我們可以立即使用ip route show命令來查看這個新的路由表.,其內容默認為空,接着可以在這個新路由表中添加路由,在此使用iproute add命令來添加路由,我們決定凡是來自於192.168.2.0/24網段的數據包,都從eth1接口將數據包送離本機,因此,必須完整編寫eth1接口的路由。首先將臨近eth1接口的路由填入.,告訴系統本機與192.168.1.0/24網段的通信都通過eth1接口來處理,接着填入這個路由表的默認路由.,最后使用ip route show命令顯示路由表10的內容。
1. [root@localhost ~]# ip rule show
2. 0: from all lookup local
3. 32766: from all lookup main
4. 32767: from all lookup default
5. [root@localhost ~]#
6. [root@localhost ~]# ip rule add from 192.168.2.0/24 table 10
7. [root@localhost ~]#
8. [root@localhost ~]# ip route show table 10
9. [root@localhost ~]#
10. [root@localhost ~]# ip route add 192.168.1.0/24 dev eth1 table 10
11. [root@localhost ~]# ip route add default via 192.168.1.254 table 10
12. [root@localhost ~]#
13. [root@localhost ~]# ip route show table 10
14. 192.168.1.0/24 dev eth1 scope link
15. default via 192.168.1.254 dev eth1
16. [root@localhost ~]#
3. 刪除路由
可以使用ip命令來方便地刪除路由,我們使用以下示例來說明如何刪除路由。首先將路由表10的內容顯示出來.,可以看到路由表10中當前有兩條路由,接着使用ip route del命令刪除默認路由.,在此別忘了指定我們所要刪除的是路由表10,否則默認會刪除路由表main的默認路由,接着再使用ip route show 命令查看路由表10.,此時路由表10的默認路由已經不存在了,再次使用ip route del命令刪除192.168.122.0/24的路由.,最后可以看到路由表10中已經沒有任何路由了。
1. [root@localhost ~]# ip route show table 10
2. 192.168.1.0/24 dev virbr0 scope link
3. default via 192.168.1.254 dev eth1
4. [root@localhost ~]#
5. [root@localhost ~]# ip route del default table 10
6. [root@localhost ~]#
7. [root@localhost ~]# ip route show table 10
8. 192.168.1.0/24 dev virbr0 scope link
9. [root@localhost ~]#
10. [root@localhost ~]# ip route del 192.168.1.0/24 table 10
11. [root@localhost ~]#
12. [root@localhost ~]# ip route show table 10
13. [root@localhost ~]#
1. 查看策略數據庫
要查看策略數據庫的內容,可以使用ip rule show命令,或者可以使用ip rule ls。如下是命令執行后所得到的輸出結果,在這些數據中,可以看到系統的三條默認規則,而這三條規則默認分別對應於local、mail及default三個路由表。
1. [root@localhost /]# ip rule show
2. 0: from all lookup local
3. 32766: from all lookup main
4. 32767: from all lookup default
2. 添加規則
在添加規則時,必須先確定好“條件”、“優先級別”及“路由表ID”,此后才可以執行添加規則的操作。關於這三個參數的含義,我們根據圖10-5再說明一次:
條件
條件是用來決定哪類數據包可以符合這項規則,而可用來匹配的字段為Source IP、Destination IP、Type of Service、fwmark及dev等,這些字段的使用方式如下:
Source IP:
根據來源端IP來決定數據包參考哪個路由表發送出去。以下兩個示例分別指出,如果數據包的來源端IP是192.168.1.10,就參考路由表10;如果來源端IP為192.168.2.0/24網段的IP,就參考路由表20。
1. ip rule add from 192.168.1.10 table 10
2. ip rule add from 192.168.2.0/24 table 20
Destination IP:
根據目的端IP來決定數據包參考哪個路由表發送出去。以下兩個示例分別指出,如果數據包的目的端IP是168.95.1.1,就參考路由表10;如果目的端IP是168.95.0.0/24網段的IP,就參考路由表20。
1. ip rule add to 168.95.1.1 table 10
2. ip rule add to 168.96.0.0/24 table 20
fwmark:
fwmark指第3章所提到過的nfmark,如果你已忘了nfmark的含義,不妨參考第2.2.6節。將fwmark作為匹配條件時,必須搭配Netfilter一起使用, 這看起來很麻煩, 卻是最靈活的匹配條件。如圖10-8所示,某公司對外有三條ADSL,我們希望所有HT T P 協議經由第一條ADS L ,SMTP及POP3經由第二條ADSL,其余流量則經由第三條ADSL。可以使用如下的命令組合來達到這樣的目的:
圖10-8 fwmark示例
1. iptables -t mangle -A FORWARD -i eth3 -p tcp --dport 80 -j MARK --set-mark 1
2. iptables -t mangle -A FORWARD -i eth3 -p tcp --dport 25 -j MARK --set-mark 2
3. iptables -t mangle -A FORWARD -i eth3 -p tcp --dport 110 -j MARK --set-mark 2
4. iptables -t mangle -A FORWARD -i eth3 -j MARK --set-mark 3
5. ip rule add fwmark 1 table 1
6. ip rule add fwmark 2 table 2
7. ip rule add fwmark 3 table 3
首先使用Netfilter的managle機制針對特定的數據包設置MARK值,在此將HTTP數據包的MARK值設置為1,SMTP及POP3數據包的MARK值設置為2,其余數據包則設置MARK值為3。接着,再根據fwmark條件來判斷數據包的MARK值,如果MARK值為1,則參考路由表1將數據包送出;MAKR值為2時,則參考路由表2將數據包送出;最后,MARK值為3的數據包則參考路由表3送出。
以上示例只是一個概念而已,如果真要完整體現出這個示例的所有功能,還需要注意許多細節,稍后將使用詳細的示例講解這部分內容,在此只要首先了解fwmark與Netfilter結合使用的概念即可。
dev:
最后,還可以使用數據包輸入的接口來作為判斷依據,如圖10-9所示,我們希望凡是由eth2接口送入的數據包都由eth0接口轉發出去,由eth3接口送入的數據包都由eth1接口轉發出去。以下命令組合將能滿足我們的要求:
1. ip rule add dev eth2 table 1
2. ip rule add dev eth3 table 3
圖10-9 接口示例
3. 優先級別
前面介紹了規則中“條件”的使用方式,接下來要討論的是優先級別。優先級別用數字來表示,其范圍可由0~4億多,堪稱天文數字,我們實際上不可能在一台PC上設置如此龐大的路由機制。
1. [root@localhost ~]# ip rule show
2. 0: from all lookup local
3. 32766: from all lookup main
4. 32767: from all lookup default
5. [root@localhost ~]#
6. [root@localhost ~]# ip rule add from 192.168.1.0/24 table 1
7. [root@localhost ~]# ip rule add from 192.168.2.0/24 table 2
8. [root@localhost ~]#
9. [root@localhost ~]# ip rule show
10. 0: from all lookup local
11. 32764: from 192.168.2.0/24 lookup 2
12. 32765: from 192.168.1.0/24 lookup 1
13. 32766: from all lookup main
14. 32767: from all lookup default
如以上示例,我們執行ip rule show命令所顯示內容的第一個字段就是優先級別,數字越小,代表優先級別越高,也代表這條規則可以排得越靠前,如此數據包在進行條件匹配時,就會越早匹配到這條規則,從輸出的數據中,默認優先級別0、32766及32767已被占用,因此,在添加規則時,如果沒有特別設置優先級別,那么,優先級別默認會從32766開始遞減,如32765、32764……,如果我們需要特別設置優先級別,可以在ip rule add命令的最后加上prio XXX參數。如下例所示:
1. [root@localhost ~]# ip rule show
2. 0: from all lookup local
3. 32766: from all lookup main
4. 32767: from all lookup default
5. [root@localhost ~]#
6. [root@localhost ~]# ip rule add from 192.168.1.0/24 table 1 prio 10
7. [root@localhost ~]# ip rule add from 192.168.2.0/24 table 2 prio 20
8. [root@localhost ~]#
9. [root@localhost ~]# ip rule show
10. 0: from all lookup local
11. 10: from 192.168.1.0/24 lookup 1
12. 20: from 192.168.2.0/24 lookup 2
13. 32766: from all lookup main
14. 32767: from all lookup default
路由表ID
在Linux的基於策略的路由中,路由表用ID來表示,但如有必要,還可以用ID與名稱對照表將ID轉換成名稱,關於這部分請參考第10.2.1節。
4. 刪除規則
ip命令提供的刪除規則的方式十分靈活,例如,要刪除下列第2條規則,可以分別使用“優先級別”、“條件”及“路由表”當中任何一個唯一的值來設置所需刪除的規則,如下:
ip rule del prio 10
ip rule del from 192.168.1.0/24
ip rule del table 1
ip rule del from 192.168.1.0/24 table 1 prio 10
1. [root@localhost ~]# ip rule show
2. 0: from all lookup local
3. 10: from 192.168.1.0/24 lookup 1
4. 20: from 192.168.2.0/24 lookup 2
5. 32766: from all lookup main
6. 32767: from all lookup default
7. [root@localhost ~]#