Linux系列—策略路由、ip rule、ip route
早期在管理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命令来管理的,下面讨论“管理”的几个方面:
1、查看策略数据库
要查看策略数据库的内容,可以使用ip rule show命令,或者可以使用ip rule ls。如下是命令执行后所得到的输出结果,在这些数据中,可以看到系统的三条默认规则,而这三条规则默认分别对应于local、mail及default三个路由表。
- [root@localhost /]# ip rule show
- : from all lookup local
- : from all lookup main
- : 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。
- ip rule add from 192.168.1.10 table
- 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。
- ip rule add to 168.95.1.1 table
- ip rule add to 168.96.0.0/ table
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 -j MARK --set-mark
- iptables -t mangle -A FORWARD -i eth3 -p tcp --dport -j MARK --set-mark
- iptables -t mangle -A FORWARD -i eth3 -p tcp --dport -j MARK --set-mark
- iptables -t mangle -A FORWARD -i eth3 -j MARK --set-mark
- ip rule add fwmark table
- ip rule add fwmark table
- 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接口转发出去。以下命令组合将能满足我们的要求:
- ip rule add dev eth2 table
- ip rule add dev eth3 table
3、优先级别
前面介绍了规则中“条件”的使用方式,接下来要讨论的是优先级别。优先级别用数字来表示,其范围可由0~4亿多,堪称天文数字,我们实际上不可能在一台PC上设置如此庞大的路由机制。
- [root@localhost ~]# ip rule show
- : from all lookup local
- : from all lookup main
- : from all lookup default
- [root@localhost ~]#
- [root@localhost ~]# ip rule add from 192.168.1.0/ table
- [root@localhost ~]# ip rule add from 192.168.2.0/ table
- [root@localhost ~]#
- [root@localhost ~]# ip rule show
- : from all lookup local
- : from 192.168.2.0/ lookup
- : from 192.168.1.0/ lookup
- : from all lookup main
- : from all lookup default
如以上示例,我们执行ip rule show命令所显示内容的第一个字段就是优先级别,数字越小,代表优先级别越高,也代表这条规则可以排得越靠前,如此数据包在进行条件匹配时,就会越早匹配到这条规则,从输出的数据中,默认优先级别0、32766及32767已被占用,因此,在添加规则时,如果没有特别设置优先级别,那么,优先级别默认会从32766开始递减,如32765、32764……,如果我们需要特别设置优先级别,可以在ip rule add命令的最后加上prio XXX参数。如下例所示:
- [root@localhost ~]# ip rule show
- : from all lookup local
- : from all lookup main
- : from all lookup default
- [root@localhost ~]#
- [root@localhost ~]# ip rule add from 192.168.1.0/ table prio
- [root@localhost ~]# ip rule add from 192.168.2.0/ table prio
- [root@localhost ~]#
- [root@localhost ~]# ip rule show
- : from all lookup local
- : from 192.168.1.0/ lookup
- : from 192.168.2.0/ lookup
- : from all lookup main
- : from all lookup default
路由表ID
在Linux的基于策略的路由中,路由表用ID来表示,但如有必要,还可以用ID与名称对照表将ID转换成名称。
4、删除规则
ip命令提供的删除规则的方式十分灵活,例如,要删除下列第2条规则,可以分别使用“优先级别”、“条件”及“路由表”当中任何一个唯一的值来设置所需删除的规则,如下:
- ip rule del prio
- ip rule del from 192.168.1.0/
- ip rule del table
- ip rule del from 192.168.1.0/ table prio
- [root@localhost ~]# ip rule show
- : from all lookup local
- : from 192.168.1.0/ lookup
- : from 192.168.2.0/ lookup
- : from all lookup main
- : 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的内容。
- [root@localhost /]# ip rule show
- : from all lookup local
- : from all lookup main
- : from all lookup default
- [root@localhost /]#
- [root@localhost /]# ip route show table main
- 10.10.15.0/ dev eth0 proto kernel scope link src 10.10.15.46
- 192.168.1.0/ 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/ dev eth0 proto kernel scope link src 10.10.15.46
- 192.168.1.0/ dev eth1 proto kernel scope link src 192.168.1.10
- default via 10.10.15.1 dev eth0
2、添加路由
添加路由在此还是一样采用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/ dev eth0 proto kernel scope link src 10.10.15.46
- 192.168.1.0/ 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/ via 10.10.15.50 table main
- [root@localhost /]#
- [root@localhost /]# ip route show table main
- 10.10.15.0/ dev eth0 proto kernel scope link src 10.10.15.46
- 192.168.2.0/ via 10.10.15.50 dev eth0
- 192.168.1.0/ 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
- : from all lookup local
- : from all lookup main
- : from all lookup default
- [root@localhost ~]#
- [root@localhost ~]# ip rule add from 192.168.2.0/ table
- [root@localhost ~]#
- [root@localhost ~]# ip route show table
- [root@localhost ~]#
- [root@localhost ~]# ip route add 192.168.1.0/ dev eth1 table
- [root@localhost ~]# ip route add default via 192.168.1.254 table
- [root@localhost ~]#
- [root@localhost ~]# ip route show table
- 192.168.1.0/ dev eth1 scope link
- 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中已经没有任何路由了。
- [root@localhost ~]# ip route show table
- 192.168.1.0/ dev virbr0 scope link
- default via 192.168.1.254 dev eth1
- [root@localhost ~]#
- [root@localhost ~]# ip route del default table
- [root@localhost ~]#
- [root@localhost ~]# ip route show table
- 192.168.1.0/ dev virbr0 scope link
- [root@localhost ~]#
- [root@localhost ~]# ip route del 192.168.1.0/ table
- [root@localhost ~]#
- [root@localhost ~]# ip route show table
三、测试
本机操作系统:
- [root@localhost ~]# cat /etc/redhat-release
- CentOS Linux release 7.2. (Core)
一共2张网卡,IP地址分别为:
- 192.168.10.100/
- 192.168.3.100/
其中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/ table
- ip route add default via 192.168.3.1 table
- 说明:
- 第一条表示来自192.168.3./24网关的走路由表10.
- 第二条表示给路由表10设置默认网关为192.168.3.
上面只是临时添加,系统重启会配置失效
下面使用永久添加办法:
- # 正常的做法是临时添加和永久添加都做,这样既不需要重启机器生效,重启后也生效
- echo "252 storage" >> /etc/iproute2/rt_tables
- ip rule add from 192.168.3.0/ 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
Linux系列—策略路由、ip rule、ip route的更多相关文章
- Linux下ip route、ip rule、iptables的关系(转)
1.基础知识 1.1 路由 (Routing) 1.1.1 路由策略 (使用 ip rule 命令操作路由策略数据库) 基于策略的路由比传统路由在功能上更强大,使用更灵活,它使网络管理员不仅能够根据目 ...
- ip rule 策略路由
1. 工具安装 yum install iproute 查看工具是否安装 ip -V 2. ip rule 和 ip route ip命令中和策略路由相关的OBJECT有 rule 和 route. ...
- ip route,ip rule, iptables和docker的端口映射
iptables 默认5个表, 不可增加其他表 raw 用于配置数据包,raw 中的数据包不会被系统跟踪. filter 是用于存放所有与防火墙相关操作的默认表. nat 用于 网络地址转换(例如:端 ...
- .Neter玩转Linux系列之四:Linux下shell介绍以及TCP、IP基础
基础篇 .Neter玩转Linux系列之一:初识Linux .Neter玩转Linux系列之二:Linux下的文件目录及文件目录的权限 .Neter玩转Linux系列之三:Linux下的分区讲解 .N ...
- Linux系列:Fedora虚拟机设置固定IP上网(配置IP、网关、DNS、防止resolv.conf被重写)
首先声明:该方法在Fedora 17和18版本下有效,其它版本也许可行也许有所差异. 1. 虚拟机相关配置 如果不是虚拟机系统,则这步不需要,若是相关配置详细信息请看“Linux系列:Ubuntu虚 ...
- Linux 基础教程 27-ss和ip命令
什么是netstat 在Linux系统中输入 man netstat,显示的结果如下所示: netstat - Print network connections, routing table ...
- Linux服务器绑定多网卡IP
需求:在1台Linux上绑定两个公网IP,实现扩展IP用于专用的服务 问题:添加了一个网卡上绑定1个弹性IP,主网卡绑定的公网ip可以正常访问,但是扩展网卡的公网ip无法访问. 原因:没有设置路由规则 ...
- linux包之iproute之ip命令
[root@localhost ~]# rpm -qf /sbin/ipiproute-2.6.32-31.el6.x86_64ip 是个命令, ip 命令的功能很多!基本上它整合了 ifconfig ...
- Linux 静态IP动态IP设置
1.设置动态IP ifconfig eth0 192.168.1.12 设置后立即生效,重启机器后就无效了 2.设置静态IP 编辑文件 /etc/sysconfig/network-scripts/i ...
随机推荐
- Django之html-模板继承
在编程的过程中,我们经常会重复性的写了很多的代码,比如一个页面的框架部分,这样我又多少个页面就得写上多少次,这样既不好维护,也不够高效,所以我们引出了html的模板继承部分. 1.写好一个html文件 ...
- python常用方法详解
1,讲序列分解为单独的变量 p=(4,5) x,y=p print(x,y) 如果在分解中想丢弃某些特定的值,可以采用_来进行 data=['A','B','c','d'] _,name,age,_= ...
- oracle 禁用索引
同步数据的时候 有索引会比较慢 可以暂时禁用索引 --禁用索引 ALTER INDEX PK_T_AUTH_USERROLE_ID UNUSABLE; --恢复索引ALTER INDEX UK_T_A ...
- NIO服务端和客户端通信demo
代码转自 https://www.jianshu.com/p/a9d030fec081 服务端: package nio; import java.io.IOException; import jav ...
- xaml可扩展应用程序标记语言
xaml 类似于 html,但不是html,它是基于xml语言的:’html可以呈现在浏览器中而xaml 可以现实 3d动画等特效. xaml 是强类型语言, 是解释性语言,虽然他可以被编译.
- Lightroom’s Clarity Slider – What Does It Do?
http://digital-photography-school.com/lightrooms-clarity-slider-what-does-it-do/ With the introducti ...
- Apache 访问控制
Apache访问控制 通过设置访问控制,可对网站进行权限管理,提高安全性. 参数介绍 <Directory />: 行为对根目录的限制 Options:允许使用控制目录特征的指令.他们包括 ...
- wyx20162314实验报告1
北京电子科技学院BESTI实验报告 课程:程序设计与数据结构 班级: 1623 姓名: 王译潇 学号:20162310 指导教师:娄佳鹏老师.王志强老师 实验日期:2017年3月26号 实验密级: 非 ...
- 【bzoj5452】[Hnoi2016]大数(莫队)
题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=4542 首先若p=2,5则这题就是道傻逼题,前缀和搞一下没了.如果p为其他质数,那么可以 ...
- 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 ...