早期在管理Linux系统的网络时,常使用ifconfig及route之类的命令,不过如果你准备开始使用Linux强大的基于策略的路由机制,那么,就请不要使用这类工具了,因为这类工具根本无法用于功能强大的基于策略的路由机制,取而代之的工具是iproute。iproute这个软件在RedHat系列的Linux系统中是默认安装的,因此,你通常可以找到这个工具。如果真因为某些原因找不到这个软件,只要在使用Fedora或CentOS Linux时,在联网的情况下,用yum install iproute命令即可顺利安装;或者也可以使用ip -V命令来检查iproute软件是否已经安装,再次请注意,-V参数为大写的英语字母:

  1. [root@localhost /]# ip -V
  2. ip utility, iproute2-ss091226

一、管理策略数据库

在Linux下,基于策略路由的策略数据库是由ip命令来管理的,下面讨论“管理”的几个方面:

1、查看策略数据库

要查看策略数据库的内容,可以使用ip rule show命令,或者可以使用ip rule ls。如下是命令执行后所得到的输出结果,在这些数据中,可以看到系统的三条默认规则,而这三条规则默认分别对应于local、mail及default三个路由表。

  1. [root@localhost /]# ip rule show
  2. : from all lookup local
  3. : from all lookup main
  4. : from all lookup default

2、添加规则

在添加规则时,必须先确定好“条件”、“优先级别”及“路由表ID”,此后才可以执行添加规则的操作。

条件

条件是用来决定哪类数据包可以符合这项规则,而可用来匹配的字段为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
  2. ip rule add from 192.168.2.0/ table

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
  2. ip rule add to 168.96.0.0/ table

fwmark

将fwmark作为匹配条件时,必须搭配Netfilter一起使用, 这看起来很麻烦, 却是最灵活的匹配条件。如图10-8所示,某公司对外有三条ADSL,我们希望所有HT T P 协议经由第一条ADS L ,SMTP及POP3经由第二条ADSL,其余流量则经由第三条ADSL。可以使用如下的命令组合来达到这样的目的:

  1. iptables -t mangle -A FORWARD -i eth3 -p tcp --dport -j MARK --set-mark
  2. iptables -t mangle -A FORWARD -i eth3 -p tcp --dport -j MARK --set-mark
  3. iptables -t mangle -A FORWARD -i eth3 -p tcp --dport -j MARK --set-mark
  4. iptables -t mangle -A FORWARD -i eth3 -j MARK --set-mark
  5. ip rule add fwmark table
  6. ip rule add fwmark table
  7. ip rule add fwmark table

首先使用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
  2. ip rule add dev eth3 table

3、优先级别

前面介绍了规则中“条件”的使用方式,接下来要讨论的是优先级别。优先级别用数字来表示,其范围可由0~4亿多,堪称天文数字,我们实际上不可能在一台PC上设置如此庞大的路由机制。

  1. [root@localhost ~]# ip rule show
  2. : from all lookup local
  3. : from all lookup main
  4. : from all lookup default
  5. [root@localhost ~]#
  6. [root@localhost ~]# ip rule add from 192.168.1.0/ table
  7. [root@localhost ~]# ip rule add from 192.168.2.0/ table
  8. [root@localhost ~]#
  9. [root@localhost ~]# ip rule show
  10. : from all lookup local
  11. : from 192.168.2.0/ lookup
  12. : from 192.168.1.0/ lookup
  13. : from all lookup main
  14. : 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. : from all lookup local
  3. : from all lookup main
  4. : from all lookup default
  5. [root@localhost ~]#
  6. [root@localhost ~]# ip rule add from 192.168.1.0/ table prio
  7. [root@localhost ~]# ip rule add from 192.168.2.0/ table prio
  8. [root@localhost ~]#
  9. [root@localhost ~]# ip rule show
  10. : from all lookup local
  11. : from 192.168.1.0/ lookup
  12. : from 192.168.2.0/ lookup
  13. : from all lookup main
  14. : from all lookup default

路由表ID

在Linux的基于策略的路由中,路由表用ID来表示,但如有必要,还可以用ID与名称对照表将ID转换成名称。

4、删除规则

ip命令提供的删除规则的方式十分灵活,例如,要删除下列第2条规则,可以分别使用“优先级别”、“条件”及“路由表”当中任何一个唯一的值来设置所需删除的规则,如下:

  1. ip rule del prio
  2. ip rule del from 192.168.1.0/
  3. ip rule del table
  4. ip rule del from 192.168.1.0/ table prio
  1. [root@localhost ~]# ip rule show
  2. : from all lookup local
  3. : from 192.168.1.0/ lookup
  4. : from 192.168.2.0/ lookup
  5. : from all lookup main
  6. : from all lookup default

二、路由表管理

由于route -n命令已经完全不适合在基于策略的路由使用,因此,route命令仅能操作一个特定的路由表,但在基于策略的路由中,会同时存在多个路由表,请放弃这个路由管理工具,取而代之的依然是ip命令。接下来将讨论如何使用ip命令来管理路由表。

1、查看路由表内容

在查看路由表之前,首先使用ip rule show命令来查看目前使用了哪些路由表,接着,再使用ip route show [table id | name]命令来查看路由表的内容。例如,可以使用ip route showtable main来查看路由表main的内容,如果省略路由表名称(如ip route show),会默认地查看路由表main的内容。

  1. [root@localhost /]# ip rule show
  2. : from all lookup local
  3. : from all lookup main
  4. : from all lookup default
  5. [root@localhost /]#
  6. [root@localhost /]# ip route show table main
  7. 10.10.15.0/ dev eth0 proto kernel scope link src 10.10.15.46
  8. 192.168.1.0/ dev eth1 proto kernel scope link src 192.168.1.10
  9. 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就是我们在网络配置中所设置的“默认网关”。

  1. [root@localhost /]# ip route show table main
  2. 10.10.15.0/ dev eth0 proto kernel scope link src 10.10.15.46
  3. 192.168.1.0/ dev eth1 proto kernel scope link src 192.168.1.10
  4. default via 10.10.15.1 dev eth0

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/ dev eth0 proto kernel scope link src 10.10.15.46
  3. 192.168.1.0/ 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/ via 10.10.15.50 table main
  7. [root@localhost /]#
  8. [root@localhost /]# ip route show table main
  9. 10.10.15.0/ dev eth0 proto kernel scope link src 10.10.15.46
  10. 192.168.2.0/ via 10.10.15.50 dev eth0
  11. 192.168.1.0/ dev eth1 proto kernel scope link src 192.168.1.10
  12. 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的内容。

  1. [root@localhost ~]# ip rule show
  2. : from all lookup local
  3. : from all lookup main
  4. : from all lookup default
  5. [root@localhost ~]#
  6. [root@localhost ~]# ip rule add from 192.168.2.0/ table
  7. [root@localhost ~]#
  8. [root@localhost ~]# ip route show table
  9. [root@localhost ~]#
  10. [root@localhost ~]# ip route add 192.168.1.0/ dev eth1 table
  11. [root@localhost ~]# ip route add default via 192.168.1.254 table
  12. [root@localhost ~]#
  13. [root@localhost ~]# ip route show table
  14. 192.168.1.0/ dev eth1 scope link
  15. default via 192.168.1.254 dev eth1

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
  2. 192.168.1.0/ dev virbr0 scope link
  3. default via 192.168.1.254 dev eth1
  4. [root@localhost ~]#
  5. [root@localhost ~]# ip route del default table
  6. [root@localhost ~]#
  7. [root@localhost ~]# ip route show table
  8. 192.168.1.0/ dev virbr0 scope link
  9. [root@localhost ~]#
  10. [root@localhost ~]# ip route del 192.168.1.0/ table
  11. [root@localhost ~]#
  12. [root@localhost ~]# ip route show table

三、测试

本机操作系统:

  1. [root@localhost ~]# cat /etc/redhat-release
  2. CentOS Linux release 7.2. (Core)

一共2张网卡,IP地址分别为:

  1. 192.168.10.100/
  2.  
  3. 192.168.3.100/

其中192.168.10.100在配置网卡过程中已经配置了默认网关

  1. [root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens160
  2. TYPE=Ethernet
  3. BOOTPROTO=static
  4. DEFROUTE=yes
  5. PEERDNS=yes
  6. PEERROUTES=yes
  7. NAME=ens160
  8. DEVICE=ens160
  9. ONBOOT=yes
  10. IPADDR=192.168.10.100
  11. NETMASK=255.255.255.0
  12. GATEWAY=192.168.10.1
  13. DNS1=218.2.135.1

192.168.3.100没有配置默认网关(不能配置,因为在同一张路由表中不能存在2条默认路由)

  1. [root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens192
  2. TYPE=Ethernet
  3. BOOTPROTO=static
  4. DEFROUTE=yes
  5. PEERDNS=yes
  6. PEERROUTES=yes
  7. NAME=ens192
  8. DEVICE=ens192
  9. ONBOOT=yes
  10. IPADDR=192.168.3.100
  11. NETMASK=255.255.255.0

现在我只能使用192.168.10.100进行远程,我想实现也可以通过192.168.3.100进行跨网段远程。考虑使用策略路由

  1. ip rule add from 192.168.3.0/ table
  2. ip route add default via 192.168.3.1 table
  3.  
  4. 说明:
  5. 第一条表示来自192.168.3./24网关的走路由表10.
  6. 第二条表示给路由表10设置默认网关为192.168.3.

上面只是临时添加,系统重启会配置失效

下面使用永久添加办法:

  1. # 正常的做法是临时添加和永久添加都做,这样既不需要重启机器生效,重启后也生效
  2.  
  3. echo "252 storage" >> /etc/iproute2/rt_tables
  4.  
  5. ip rule add from 192.168.3.0/ table storage
  6. ip route add default via 192.168.3.1 table storage
  7.  
  8. echo "ip rule add from 192.168.3.0/24 table storage" >> /etc/rc.local
  9. echo "ip route add default via 192.168.3.1 table storage" >> /etc/rc.local
  10. chmod +x /etc/rc.d/rc.local

Linux系列—策略路由、ip rule、ip route的更多相关文章

  1. Linux下ip route、ip rule、iptables的关系(转)

    1.基础知识 1.1 路由 (Routing) 1.1.1 路由策略 (使用 ip rule 命令操作路由策略数据库) 基于策略的路由比传统路由在功能上更强大,使用更灵活,它使网络管理员不仅能够根据目 ...

  2. ip rule 策略路由

    1. 工具安装 yum install iproute 查看工具是否安装 ip -V 2. ip rule 和 ip route ip命令中和策略路由相关的OBJECT有 rule 和 route. ...

  3. ip route,ip rule, iptables和docker的端口映射

    iptables 默认5个表, 不可增加其他表 raw 用于配置数据包,raw 中的数据包不会被系统跟踪. filter 是用于存放所有与防火墙相关操作的默认表. nat 用于 网络地址转换(例如:端 ...

  4. .Neter玩转Linux系列之四:Linux下shell介绍以及TCP、IP基础

    基础篇 .Neter玩转Linux系列之一:初识Linux .Neter玩转Linux系列之二:Linux下的文件目录及文件目录的权限 .Neter玩转Linux系列之三:Linux下的分区讲解 .N ...

  5. Linux系列:Fedora虚拟机设置固定IP上网(配置IP、网关、DNS、防止resolv.conf被重写)

    首先声明:该方法在Fedora 17和18版本下有效,其它版本也许可行也许有所差异. 1.  虚拟机相关配置 如果不是虚拟机系统,则这步不需要,若是相关配置详细信息请看“Linux系列:Ubuntu虚 ...

  6. Linux 基础教程 27-ss和ip命令

    什么是netstat     在Linux系统中输入 man netstat,显示的结果如下所示: netstat - Print network connections, routing table ...

  7. Linux服务器绑定多网卡IP

    需求:在1台Linux上绑定两个公网IP,实现扩展IP用于专用的服务 问题:添加了一个网卡上绑定1个弹性IP,主网卡绑定的公网ip可以正常访问,但是扩展网卡的公网ip无法访问. 原因:没有设置路由规则 ...

  8. linux包之iproute之ip命令

    [root@localhost ~]# rpm -qf /sbin/ipiproute-2.6.32-31.el6.x86_64ip 是个命令, ip 命令的功能很多!基本上它整合了 ifconfig ...

  9. Linux 静态IP动态IP设置

    1.设置动态IP ifconfig eth0 192.168.1.12 设置后立即生效,重启机器后就无效了 2.设置静态IP 编辑文件 /etc/sysconfig/network-scripts/i ...

随机推荐

  1. Django之html-模板继承

    在编程的过程中,我们经常会重复性的写了很多的代码,比如一个页面的框架部分,这样我又多少个页面就得写上多少次,这样既不好维护,也不够高效,所以我们引出了html的模板继承部分. 1.写好一个html文件 ...

  2. python常用方法详解

    1,讲序列分解为单独的变量 p=(4,5) x,y=p print(x,y) 如果在分解中想丢弃某些特定的值,可以采用_来进行 data=['A','B','c','d'] _,name,age,_= ...

  3. oracle 禁用索引

    同步数据的时候 有索引会比较慢 可以暂时禁用索引 --禁用索引 ALTER INDEX PK_T_AUTH_USERROLE_ID UNUSABLE; --恢复索引ALTER INDEX UK_T_A ...

  4. NIO服务端和客户端通信demo

    代码转自 https://www.jianshu.com/p/a9d030fec081 服务端: package nio; import java.io.IOException; import jav ...

  5. xaml可扩展应用程序标记语言

    xaml 类似于 html,但不是html,它是基于xml语言的:’html可以呈现在浏览器中而xaml 可以现实 3d动画等特效. xaml  是强类型语言,  是解释性语言,虽然他可以被编译.

  6. Lightroom’s Clarity Slider – What Does It Do?

    http://digital-photography-school.com/lightrooms-clarity-slider-what-does-it-do/ With the introducti ...

  7. Apache 访问控制

    Apache访问控制 通过设置访问控制,可对网站进行权限管理,提高安全性. 参数介绍 <Directory />: 行为对根目录的限制 Options:允许使用控制目录特征的指令.他们包括 ...

  8. wyx20162314实验报告1

    北京电子科技学院BESTI实验报告 课程:程序设计与数据结构 班级: 1623 姓名: 王译潇 学号:20162310 指导教师:娄佳鹏老师.王志强老师 实验日期:2017年3月26号 实验密级: 非 ...

  9. 【bzoj5452】[Hnoi2016]大数(莫队)

    题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=4542 首先若p=2,5则这题就是道傻逼题,前缀和搞一下没了.如果p为其他质数,那么可以 ...

  10. LeetCode——Sum of Two Integers

    LeetCode--Sum of Two Integers Question Calculate the sum of two integers a and b, but you are not al ...