Linux策略路由简介(翻译)


最近想回忆一下之前研究过的linux下的策略路由,想对linux的策略路由来一个简单的介绍,不过看了来自Scott’s Weblog 的这篇博客之后,觉得它还真是够简单,好在概念还很清晰,对于理解linux的策略路由的基本的概念和框架足够了。所以我突然想翻译一下(不知道是不是有人也会翻译别人的博客的内容,翻译博客是不是层次太低了一点。。),贴在自己的博客里。从来没试过翻译,这次来试试吧。Let’s Go!以下是原文的翻译。

在这篇博客里,我要来介绍一下在最新的Ubuntu版本里面实现的Linux策略路由机制(可能在其他Linux的发行版里也已经同样实现了,不过我使用的是Ubuntu 12.04 LTS版本)。实际上,由于Linux的策略路由机制的引入,给Linux机器的网络数据路由功能提供了极大的灵活性。在后续的博客里面,我会讨论一个相当实际的Linux策略路由的配置用例。不过在这篇文章中,我们还是现在关注一下Linux策略路由的概念以及怎么使用吧。

策略路由包含了好几方面:

  • 策略路由表(table):Linux系统中包含了三个默认的路由表:local表(这个路由表不能人为的编辑或者删除),main表,和default表。有一点需要注意的是,如果我们增加一个路由,但是没有指定它是属于哪个路由表的情况下,这个路由实际上是被加入到了main表中,而不是default表。这一点跟我们直观的想象是不一样的。
  • 策略路由规则(rule):同样的,Linux系统中有三个默认的rule,分别对应于三个默认的路由表。

在我们应用Linux的策略路机制实现我们的特殊的需求时,一般我们需要做三件事情:

  1. 我们需要创建一张定制的策略路由表(table)。
  2. 我们需要创建一个或者多个定制的策略路由规则(rule)。
  3. 我们需要在创建的策略路由表中加入一个或者多个路由信息(route)。

让我们一步一步的介绍一下上面的三个步骤。

创建一个自己定制的策略路由表

第一步就是要创建一个自己定制的策略路由表。实际上,创建一个路由表,等同于在文件/etc/iproute2/rt_tables里面添加一行新的记录。所以比如我们想要创建一个叫custom的路由表的话,实际上也就可以使用下面的命令直接对rt_tables文件进行操作。

# echo 200 custom >> /etc/iproute2/rt_tables

上面的这个命令创建了一个名字叫做custom, id为200的路由表。请记住这个路由表的名字,因为我们在下面介绍路由规则(rule)和以及编辑路由表的时候,就是用的这个路由表。需要知道的是,因为这个路由表是直接存放在rt_tables文件中的,所以,在Linux机器重启之后,这个路由表也会仍然存在。

创建策略路由规则(rule)

在创建了路由表之后,下一步就是创建路由规则(rule),路由规则会告诉系统使用哪个路由表(table)去做路由。在本文中,作为一个例子,我想根据数据的源地址来制定一个路由规则。这其实是策略路由的一个很常见的应用,而且因为这个路由规则是依据源地址的,所以这样的场景也叫作源地址路由(source routing).

使用下面的命令来创建一个策略路由规则:

# ip rule add from "source_address" lookup "table_name"

假设我们有这样的需求,对于所有的从IP地址192.168.30.200来的数据,我们希望系统将其交给我们之前创建的叫做custom的路由表去做路由。那么我们只要使用下面的命令来创建这个rule就可以了。

# ip rule add from 192.168.30.200 lookup custom

我们可以使用下面的命令来查看当前系统中所有有效的路由规则:

# ip rule list

我在这篇文章的开头也说过,对应于local, main和default这三个系统中的路由表,分别也各自有一个对应的规则。在我们新增了自己的路由规则之后,在上面的命令的输出中,应该也能够看到它。

但是,这里还有一个小问题,那就是用这样的方式创建的路由规则(rule)并不是永久的,也就是说,如果系统重启之后(或者是网络重启),使用上面这样的命令创建的rule就会随之丢失了。如果想要创建的路由规则在重启系统或者重启网络之后也不会丢失,那么我们需要在/etc/network/interfaces这个文件里面加入一行:

 post-up ip rule add from 192.168.30.200 lookup custom

填充路由表

前面我们创建了自己的策略路由表,并且我们也创建了相应的rule去使用这个路由表。接下来,很显然就是要填充路由表了,因为之前我们只是创建了这个路由表,但是路由表里面还是什么路由都没有,空的一个。一般我们在路由表里面添加路由时,使用ip route add这样的命令,而且需要指定一个table参数,表明是在哪个路由表里面添加路由。

还是回到我们刚才的例子,我们假设,我们需要对从源地址192.168.30.200来的数据添加一个默认路由。我们已经创建了一个叫做custom的路由表,而且我们也创建了一个规则,在处理源地址是192.168.30.200的数据时,指定使用custom这个路由表的路由。那么现在我们需要在这个custom路由表里面添加路由了。使用下面的命令来添加一个路由.

# ip route add default via 192.168.30.1 dev eth1 table custom

上面命令里面的参数只是一个例子,我们当然需要将默认网关192.168.30.1替换为我们实际的网关地址,同样的要将eth1这个设备名替换为实际系统中的设备名。但是从上面的命令,相信你已经能够了解这个命令的含义了。当然,你也可以不使用默认路由,你也可以在你自己的路由表里面指定特定的路由。甚至在VLAN里面这也是可以的,所以你可以创建如下所示的对应于每个VLAN的路由。

# ip route add default via 192.168.30.1 dev eth0.30 table vlan30

上面的命令为vlan30这个路由表创建了一个通过eth0.30 经过网关192.168.30.1的路由(需要注意的是,你需要先创建路由表,然后才能在路由表里面添加路由)。

跟创建策略路由表一样,这样创建的路由同样也不是保持的。所以我们如果希望在系统重启或者网络重启之后路由还保持的话,就需要在/etc/network/interface这个配置文件中加入类似下面一行的配置:

post-up ip route add default via 192.168.30.1 dev eth1 table custom

上面这一行配置能够保证在网络接口起来的时候,命令中指定的路由能够被正确的加载到对应的路由表里面去。

总结

在策略路由中,还有大量的功能我们这边文章没有涉及,但是至少这篇文章能够给你一些基本的概念,让你了解策略路由是如何工作的。


Leave a Reply

Your email address will not be published. Required fields are marked *