早期在管理Linux系统的网络时,常使用ifconfig及route之类的命令,不过若是你准备开始使用Linux强大的基于策略的路由机制,那么,就请不要使用这类工具了,由于这类工具根本没法用于功能强大的基于策略的路由机制,取而代之的工具是iproute。iproute这个软件在RedHat系列的Linux系统中是默认安装的,所以,你一般能够找到这个工具。若是真由于某些缘由找不到这个软件,只要在使用Fedora或CentOS Linux时,在联网的状况下,用yum install iproute命令便可顺利安装;或者也可使用ip -V命令来检查iproute软件是否已经安装,再次请注意,-V参数为大写的英语字母:数据库
[root@localhost /]# ip -V
ip utility, iproute2-ss091226
在Linux下,基于策略路由的策略数据库是由ip命令来管理的,下面讨论“管理”的几个方面:网络
要查看策略数据库的内容,可使用ip rule show命令,或者可使用ip rule ls。以下是命令执行后所获得的输出结果,在这些数据中,能够看到系统的三条默认规则,而这三条规则默认分别对应于local、mail及default三个路由表。ssh
[root@localhost /]# ip rule show 0: from all lookup local 32766: from all lookup main 32767: from all lookup default
在添加规则时,必须先肯定好“条件”、“优先级别”及“路由表ID”,此后才能够执行添加规则的操做。tcp
条件工具
条件是用来决定哪类数据包能够符合这项规则,而可用来匹配的字段为Source IP、Destination IP、Type of Service、fwmark及dev等,这些字段的使用方式以下:测试
Source IPspa
根据来源端IP来决定数据包参考哪一个路由表发送出去。如下两个示例分别指出,若是数据包的来源端IP是192.168.1.10,就参考路由表10;若是来源端IP为192.168.2.0/24网段的IP,就参考路由表20。操作系统
ip rule add from 192.168.1.10 table 10 ip rule add from 192.168.2.0/24 table 20
Destination IPcode
根据目的端IP来决定数据包参考哪一个路由表发送出去。如下两个示例分别指出,若是数据包的目的端IP是168.95.1.1,就参考路由表10;若是目的端IP是168.95.0.0/24网段的IP,就参考路由表20。blog
ip rule add to 168.95.1.1 table 10 ip rule add to 168.96.0.0/24 table 20
fwmark
将fwmark做为匹配条件时,必须搭配Netfilter一块儿使用, 这看起来很麻烦, 倒是最灵活的匹配条件。如图10-8所示,某公司对外有三条ADSL,咱们但愿全部HT T P 协议经由第一条ADS L ,SMTP及POP3经由第二条ADSL,其他流量则经由第三条ADSL。可使用以下的命令组合来达到这样的目的:
iptables -t mangle -A FORWARD -i eth3 -p tcp --dport 80 -j MARK --set-mark 1 iptables -t mangle -A FORWARD -i eth3 -p tcp --dport 25 -j MARK --set-mark 2 iptables -t mangle -A FORWARD -i eth3 -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
首先使用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接口转发出去。如下命令组合将能知足咱们的要求:
ip rule add dev eth2 table 1 ip rule add dev eth3 table 3
前面介绍了规则中“条件”的使用方式,接下来要讨论的是优先级别。优先级别用数字来表示,其范围可由0~4亿多,堪称天文数字,咱们实际上不可能在一台PC上设置如此庞大的路由机制。
[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 [root@localhost ~]# ip rule add from 192.168.2.0/24 table 2 [root@localhost ~]# [root@localhost ~]# ip rule show 0: from all lookup local 32764: from 192.168.2.0/24 lookup 2 32765: from 192.168.1.0/24 lookup 1 32766: from all lookup main 32767: from all lookup default
如以上示例,咱们执行ip rule show命令所显示内容的第一个字段就是优先级别,数字越小,表明优先级别越高,也表明这条规则能够排得越靠前,如此数据包在进行条件匹配时,就会越早匹配到这条规则,从输出的数据中,默认优先级别0、32766及32767已被占用,所以,在添加规则时,若是没有特别设置优先级别,那么,优先级别默认会从32766开始递减,如3276五、32764……,若是咱们须要特别设置优先级别,能够在ip rule add命令的最后加上prio XXX参数。以下例所示:
[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
路由表ID
在Linux的基于策略的路由中,路由表用ID来表示,但若有必要,还能够用ID与名称对照表将ID转换成名称。
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
[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
因为route -n命令已经彻底不适合在基于策略的路由使用,所以,route命令仅能操做一个特定的路由表,但在基于策略的路由中,会同时存在多个路由表,请放弃这个路由管理工具,取而代之的依然是ip命令。接下来将讨论如何使用ip命令来管理路由表。
在查看路由表以前,首先使用ip rule show命令来查看目前使用了哪些路由表,接着,再使用ip route show [table id | name]命令来查看路由表的内容。例如,可使用ip route showtable main来查看路由表main的内容,若是省略路由表名称(如ip route show),会默认地查看路由表main的内容。
[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 route show table main 10.10.15.0/25 dev eth0 proto kernel scope link src 10.10.15.46 192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.10 default via 10.10.15.1 dev eth0
在默认状况下,系统有三个路由表,这三个路由表的功能以下:
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就是咱们在网络配置中所设置的“默认网关”。
[root@localhost /]# ip route show table main 10.10.15.0/25 dev eth0 proto kernel scope link src 10.10.15.46 192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.10 default via 10.10.15.1 dev eth0
添加路由在此仍是同样采用ip命令而不是route命令,下例首先使用ip route show.命令显示路由表main的内容,接着再使用ip route add命令将所需的路由添加到路由表main中.,最后再次使用ip route show命令将路由表main的内容打印出来,此时就能够在路由表main之中看到刚才添加的路由了。
[root@localhost /]# ip route show table main 10.10.15.0/25 dev eth0 proto kernel scope link src 10.10.15.46 192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.10 default via 10.10.15.1 dev eth0 [root@localhost /]# [root@localhost /]# ip route add 192.168.2.0/24 via 10.10.15.50 table main [root@localhost /]# [root@localhost /]# ip route show table main 10.10.15.0/25 dev eth0 proto kernel scope link src 10.10.15.46 192.168.2.0/24 via 10.10.15.50 dev eth0 192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.10 default via 10.10.15.1 dev eth0
若是要添加的路由并未出如今现有的路由表中,又该如何处理呢?在此请先有一个概念,单纯添加路由表并没有意义,由于新增出来的路由表,系统默认是不会去使用的,若是要将路由添加到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的内容。
[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.2.0/24 table 10 [root@localhost ~]# [root@localhost ~]# ip route show table 10 [root@localhost ~]# [root@localhost ~]# ip route add 192.168.1.0/24 dev eth1 table 10 [root@localhost ~]# ip route add default via 192.168.1.254 table 10 [root@localhost ~]# [root@localhost ~]# ip route show table 10 192.168.1.0/24 dev eth1 scope link default via 192.168.1.254 dev eth1
可使用ip命令来方便地删除路由,咱们使用如下示例来讲明如何删除路由。首先将路由表10的内容显示出来.,能够看到路由表10中当前有两条路由,接着使用ip route del命令删除默认路由.,在此别忘了指定咱们所要删除的是路由表10,不然默认会删除路由表main的默认路由,接着再使用ip route show 命令查看路由表10.,此时路由表10的默认路由已经不存在了,再次使用ip route del命令删除192.168.122.0/24的路由.,最后能够看到路由表10中已经没有任何路由了。
[root@localhost ~]# ip route show table 10 192.168.1.0/24 dev virbr0 scope link default via 192.168.1.254 dev eth1 [root@localhost ~]# [root@localhost ~]# ip route del default table 10 [root@localhost ~]# [root@localhost ~]# ip route show table 10 192.168.1.0/24 dev virbr0 scope link [root@localhost ~]# [root@localhost ~]# ip route del 192.168.1.0/24 table 10 [root@localhost ~]# [root@localhost ~]# ip route show table 10
本机操做系统:
[root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core)
一共2张网卡,IP地址分别为:
192.168.10.100/24 192.168.3.100/24
其中192.168.10.100在配置网卡过程当中已经配置了默认网关
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens160 TYPE=Ethernet BOOTPROTO=static DEFROUTE=yes PEERDNS=yes PEERROUTES=yes NAME=ens160 DEVICE=ens160 ONBOOT=yes IPADDR=192.168.10.100 NETMASK=255.255.255.0 GATEWAY=192.168.10.1 DNS1=218.2.135.1
192.168.3.100没有配置默认网关(不能配置,由于在同一张路由表中不能存在2条默认路由)
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens192 TYPE=Ethernet BOOTPROTO=static DEFROUTE=yes PEERDNS=yes PEERROUTES=yes NAME=ens192 DEVICE=ens192 ONBOOT=yes IPADDR=192.168.3.100 NETMASK=255.255.255.0
如今我只能使用192.168.10.100进行远程,我想实现也能够经过192.168.3.100进行跨网段远程。考虑使用策略路由
ip rule add from 192.168.3.0/24 table 10 ip route add default via 192.168.3.1 table 10 说明: 第一条表示来自192.168.3.0/24网关的走路由表10. 第二条表示给路由表10设置默认网关为192.168.3.1
上面只是临时添加,系统重启会配置失效
下面使用永久添加办法:
# 正常的作法是临时添加和永久添加都作,这样既不须要重启机器生效,重启后也生效 echo "252 storage" >> /etc/iproute2/rt_tables ip rule add from 192.168.3.0/24 table storage ip route add default via 192.168.3.1 table storage echo "ip rule add from 192.168.3.0/24 table storage" >> /etc/rc.local echo "ip route add default via 192.168.3.1 table storage" >> /etc/rc.local chmod +x /etc/rc.d/rc.local