轉自ToToSun 协议森林
概念
Linux中策略路由實作原理
傳統路由只使用一張路由表,但在某些情況下,需要使用多路由表(multiple Routing Tables)。策略路由指對IP包根據特定策略進行路由,例如“所有來自網路A的包,選擇X路徑;其他選擇Y路徑”,或者是“所有TOS為A的包選擇路徑X;其他選號路徑Y” 。
規則是策略路由關鍵概念,什麼樣的包,將應用本規則(RULE),符合本規則的包將對其採取什麼動作(ACTION);本規則優先級別越高,規則越先匹配,數值越小優先等級越高。
iproute2工具
實作策略路由配置工具一般用iproute2工具包。 Linux最多可以支援255張路由表,其中有3張表是內建的:
表255:本地路由表(Local table)本地介面位址,廣播位址以及NAT位址都存放在這張表。此路由表由系統自動維護,管理員不能直接修改。
表254:主路由表(Main table)如果沒有指明路由所屬表,所有的路由都預設放在這個表裡,一般來說,舊路由工具(如route)所新增的路由都會加到這個表。一般是普通路由。
表253:預設路由表(Default table)一般來說預設路由都放在這張表。
root:/# ip rule show
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
root:/#
root:/# ip route show table local
broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1
broadcast 192.168.1.0 dev enp9s0f0 proto kernel scope link src 192.168.1.182
local 192.168.1.182 dev enp9s0f0 proto kernel scope host src 192.168.1.182
broadcast 192.168.1.255 dev enp9s0f0 proto kernel scope link src 192.168.1.182
broadcast 192.168.2.0 dev enp9s0f1 proto kernel scope link src 192.168.2.182 linkdown
local 192.168.2.182 dev enp9s0f1 proto kernel scope host src 192.168.2.182
broadcast 192.168.2.255 dev enp9s0f1 proto kernel scope link src 192.168.2.182 linkdown
broadcast 192.168.3.0 dev enp9s0f2 proto kernel scope link src 192.168.3.182 linkdown
local 192.168.3.182 dev enp9s0f2 proto kernel scope host src 192.168.3.182
broadcast 192.168.3.255 dev enp9s0f2 proto kernel scope link src 192.168.3.182 linkdown
broadcast 192.168.6.0 dev enp52s0f1 proto kernel scope link src 192.168.6.183 linkdown
local 192.168.6.183 dev enp52s0f1 proto kernel scope host src 192.168.6.183
broadcast 192.168.6.255 dev enp52s0f1 proto kernel scope link src 192.168.6.183 linkdown
root:/
root:/
root:/# ip route show table main
192.168.1.0/24 dev enp9s0f0 proto kernel scope link src 192.168.1.182
192.168.1.0/24 dev enp9s0f0 proto kernel scope link src 192.168.1.182 metric 101
192.168.2.0/24 dev enp9s0f1 proto kernel scope link src 192.168.2.182 linkdown
192.168.3.0/24 dev enp9s0f2 proto kernel scope link src 192.168.3.182 linkdown
192.168.6.0/24 dev enp52s0f1 proto kernel scope link src 192.168.6.183 linkdown
规则配置
在添加规则时,必须先确定好“条件”、“优先级别”及“路由表”,此后才可执行添加规则操作。条件是用来决定哪类数据包可以符合这项规则,而可用来匹配的字段为Source IP、Destination IP、Type of Service、fwmark及dev等,这些字段的使用方式如下:
#根据源IP
ip rule add from 192.168.1.10 table 100
ip rule add from 192.168.2.0/24 table 200
#根据目的IP
ip rule add to 10.0.2.1 table 100
ip rule add to 10.0.2.0/24 table 200
将fwmark作为匹配条件时,必须搭配Netfilter一起使用。某公司对外有三种路由,希望所有HTTP协议经由第一条ADSL ,SMTP及POP3经由第二条VDSL,其余流量则经由第三条ETH。可以使用如下命令实现策略路由:
iptables -t mangle -A FORWARD -i adsl -p tcp –dport 80 -j MARK –set-mark 1
iptables -t mangle -A FORWARD -i vdsl -p tcp –dport 25 -j MARK –set-mark 2
iptables -t mangle -A FORWARD -i vdsl -p tcp –dport 110 -j MARK –set-mark 2
iptables -t mangle -A FORWARD -i eth3 -j MARK –set-mark 3
ip rule add fwmark 1 table 1
ip rule add fwmark 2 table 2
ip rule add fwmark 3 table 3
由eth2接口送入的数据包都由eth0接口转发出去,由eth3接口送入的数据包都由eth1接口转发出去,可以使用如下命令实现策略路由:
ip rule add dev eth2 table 1
ip rule add dev eth3 table 3
ip rule show命令所显示内容的第一个字段就是优先级别,数字越小,代表优先级别越高,也代表这条规则可以排得越靠前,如此数据包在进行条件匹配时,就会越早匹配到这条规则。
[root@localhost ~]# ip rule show
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
[root@localhost ~]#
[root@localhost ~]# ip rule add from 192.168.1.0/24 table 1 prio 10
[root@localhost ~]# ip rule add from 192.168.2.0/24 table 2 prio 20
[root@localhost ~]#
[root@localhost ~]# ip rule show
0: from all lookup local
10: from 192.168.1.0/24 lookup 1
20: from 192.168.2.0/24 lookup 2
32766: from all lookup main
32767: from all lookup default
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