1. ip rule,ip route,iptables 三者之間的關(guān)系
以一例子來說明:公司內(nèi)網(wǎng)要求192.168.0.100 以內(nèi)的使用 10.0.0.1 網(wǎng)關(guān)上網(wǎng) (電信),其他IP使用 20.0.0.1 (網(wǎng)通)上網(wǎng)。
- 首先要在網(wǎng)關(guān)服務(wù)器上添加一個(gè)默認(rèn)路由,當(dāng)然這個(gè)指向是絕大多數(shù)的IP的出口網(wǎng)關(guān):
ip route add default gw 20.0.0.1 - 之后通過 ip route 添加一個(gè)路由表:
ip route add table 3 via 10.0.0.1 dev ethX(ethx 是 10.0.0.1 所在的網(wǎng)卡, 3 是路由表的編號(hào)) - 之后添加 ip rule 規(guī)則:
ip rule add fwmark 3 table 3(fwmark 3 是標(biāo)記,table 3 是路由表3 上邊。 意思就是凡事標(biāo)記了 3 的數(shù)據(jù)使用 table3 路由表) - 之后使用 iptables 給相應(yīng)的數(shù)據(jù)打上標(biāo)記:
iptables -A PREROUTING -t mangle -i eth0 -s 192.168.0.1 - 192.168.0.100 -j MARK --set-mark 3
因?yàn)?mangle 的處理是優(yōu)先于 nat 和 fiter 表的,所以在數(shù)據(jù)包到達(dá)之后先打上標(biāo)記,之后再通過 ip rule 規(guī)則,對(duì)應(yīng)的數(shù)據(jù)包使用相應(yīng)的路由表進(jìn)行路由,最后讀取路由表信息,將數(shù)據(jù)包送出網(wǎng)關(guān)。

這里可以看出 Netfilter 處理網(wǎng)絡(luò)包的先后順序:接收網(wǎng)絡(luò)包,先 DNAT,然后查路由策略,查路由策略指定的路由表做路由,然后 SNAT,再發(fā)出網(wǎng)絡(luò)包。
2. 路由策略 (使用 ip rule 命令操作路由策略數(shù)據(jù)庫)
基于策略的路由比傳統(tǒng)路由在功能上更強(qiáng)大,使用更靈活,它使網(wǎng)絡(luò)管理員不僅能夠根據(jù)目的地址而且能夠根據(jù)報(bào)文大小、應(yīng)用或IP源地址等屬性來選擇轉(zhuǎn)發(fā)路徑。
ip rule 命令:
- Usage: ip rule [ list | add | del ] SELECTOR ACTION (add 添加;del 刪除; llist 列表)
- SELECTOR := [ from PREFIX 數(shù)據(jù)包源地址] [ to PREFIX 數(shù)據(jù)包目的地址] [ tos TOS 服務(wù)類型][ dev STRING 物理接口] [ pref NUMBER ] [fwmark MARK iptables 標(biāo)簽]
- ACTION := [ table TABLE_ID 指定所使用的路由表] [ nat ADDRESS 網(wǎng)絡(luò)地址轉(zhuǎn)換][ prohibit 丟棄該表| reject 拒絕該包| unreachable 丟棄該包]
- [ flowid CLASSID ]
- TABLE_ID := [ local | main | default | new | NUMBER ]
例子:
- ip rule add from 192.203.80/24 table inr.ruhep prio 220 通過路由表 inr.ruhep 路由來自源地址為192.203.80/24的數(shù)據(jù)包
- ip rule add from 193.233.7.83 nat 192.203.80.144 table 1 prio 320 把源地址為 193.233.7.83的數(shù)據(jù)報(bào)的源地址轉(zhuǎn)換為192.203.80.144,并通過表1進(jìn)行路由
在 Linux 系統(tǒng)啟動(dòng)時(shí),內(nèi)核會(huì)為路由策略數(shù)據(jù)庫配置三條缺省的規(guī)則:
- 0 匹配任何條件 查詢路由表local(ID 255) 路由表local是一個(gè)特殊的路由表,包含對(duì)于本地和廣播地址的高優(yōu)先級(jí)控制路由。rule 0非常特殊,不能被刪除或者覆蓋。
- 32766 匹配任何條件 查詢路由表main(ID 254) 路由表main(ID 254)是一個(gè)通常的表,包含所有的無策略路由。系統(tǒng)管理員可以刪除或者使用另外的規(guī)則覆蓋這條規(guī)則。
- 32767 匹配任何條件 查詢路由表default(ID 253) 路由表default(ID 253)是一個(gè)空表,它是為一些后續(xù)處理保留的。對(duì)于前面的缺省策略沒有匹配到的數(shù)據(jù)包,系統(tǒng)使用這個(gè)策略進(jìn)行處理。這個(gè)規(guī)則也可以刪除。
不要混淆路由表和策略:規(guī)則指向路由表,多個(gè)規(guī)則可以引用一個(gè)路由表,而且某些路由表可以沒有策略指向它。如果系統(tǒng)管理員刪除了指向某個(gè)路由表的所有規(guī)則,這個(gè)表就沒有用了,但是仍然存在,直到里面的所有路由都被刪除,它才會(huì)消失。
3 路由表 (使用 ip route 命令操作靜態(tài)路由表)
所謂路由表,指的是路由器或者其他互聯(lián)網(wǎng)網(wǎng)絡(luò)設(shè)備上存儲(chǔ)的表,該表中存有到達(dá)特定網(wǎng)絡(luò)終端的路徑,在某些情況下,還有一些與這些路徑相關(guān)的度量。路由器的主要工作就是為經(jīng)過路由器的每個(gè)數(shù)據(jù)包尋找一條最佳的傳輸路徑,并將該數(shù)據(jù)有效地傳送到目的站點(diǎn)。由此可見,選擇最佳路徑的策略即路由算法是路由器的關(guān)鍵所在。為了完成這項(xiàng)工作,在路由器中保存著各種傳輸路徑的相關(guān)數(shù)據(jù)——路由表(Routing Table),供路由選擇時(shí)使用,表中包含的信息決定了數(shù)據(jù)轉(zhuǎn)發(fā)的策略。打個(gè)比方,路由表就像我們平時(shí)使用的地圖一樣,標(biāo)識(shí)著各種路線,路由表中保存著子網(wǎng)的標(biāo)志信息、網(wǎng)上路由器的個(gè)數(shù)和下一個(gè)路由器的名字等內(nèi)容。路由表根據(jù)其建立的方法,可以分為動(dòng)態(tài)路由表和靜態(tài)路由表。
linux 系統(tǒng)中,可以自定義從 1-252個(gè)路由表,其中,linux系統(tǒng)維護(hù)了4個(gè)路由表:
- 0#表: 系統(tǒng)保留表
- 253#表: defulte table 沒特別指定的默認(rèn)路由都放在改表
- 254#表: main table 沒指明路由表的所有路由放在該表
- 255#表: locale table 保存本地接口地址,廣播地址、NAT地址 由系統(tǒng)維護(hù),用戶不得更改
路由表的查看可有以下二種方法:
ip route list table table_number
ip route list table table_name
路由表序號(hào)和表名的對(duì)應(yīng)關(guān)系在 /etc/iproute2/rt_tables 文件中,可手動(dòng)編輯。路由表添加完畢即時(shí)生效,下面為實(shí)例:
- ip route add default via 192.168.1.1 table 1 在一號(hào)表中添加默認(rèn)路由為192.168.1.1
- ip route add 192.168.0.0/24 via 192.168.1.2 table 1 在一號(hào)表中添加一條到192.168.0.0網(wǎng)段的路由為192.168.1.2