简述linux路由表

要理解基本的linux网络,除了iptables之外最重要的就是路由表了。

路由表用于决定数据包从哪个网口发出,其判断依据则主要是IP地址。

Linux路由表其实有2个主要概念:

  • 路由策略(rule)
  • 路由表(table)

Linux可以配置很多很多策略,数据包将依次通过各个策略,一旦匹配某个策略则进一步应用策略对应的路由表,如果当前路由表无法匹配到路由则继续执行后续策略匹配。

从网上找了一张很形象的图片:

下面就从命令出发,了解一下rule和table是如何协作的。

路由策略

从上图我们知道,路由策略是串行判定的。

利用如下命令查看系统自带的策略:

系统自带了3个策略,序号分别是0、32766、32767,策略匹配过程是从小到大执行的。

以0号策略为例,它表示匹配任意来源IP的数据包,然后用名字叫做local的路由表进行路由匹配。

如果local路由表里的规则能匹配成功,那么后续的rule就不会执行了,否则还会继续匹配32766等后续策略。

每1条策略最终都会关联到1张路由表,同1个路由表可以被N个策略关联,路由表总是随着路由策略的添加而生成的。

如果要了解如何管理路由策略,可以执行help:

比如,我添加一个序号为1的策略(它紧跟在0之后),它匹配所有数据包,并且对应一个全新的路由表10:

该命令组成:

  • ip rule add:添加策略的意思,所有策略相关的命令都是ip rule开头的。
  • from all to all:分别匹配全部来源IP和全部目标IP,其实就是匹配规则,更多规则大家可以看上面的help
  • pref 1:pref表示策略序号,其实也是优先级的意思,越小的序号越先被匹配。
  • table 10:如果匹配该策略,那么去查10号路由表。

其实不仅路由策略是序号指定的,路由表也是序号指定的。

但是也可以看到系统自带的路由表都是有名字的,比如local、main、default。

这是因为linux支持给路由表起名字,可以查看/etc/iproute2/rt_tables得知真实的table序号:

其实table/lookup local就相当于table 255。

删除刚刚添加的这条规则也很简单,可以利用匹配条件去匹配到它,或者直接利用pref 1指定策略序号删除:

不过我现在还是把它加了回来,因为接下来还要讲路由表。

我们通过table 10指定了一个新的路由表,它会被自动创建出来,而且是空的,因此当前这条策略什么也没做就会继续执行下一个策略了。

路由表

路由策略可以配好几万条都是没有问题的,但是路由表的数量有限。

所有路由表相关的命令都是ip route开头的,没有办法利用累死ip route list命令列出所有的路由表。

我们只能通过ip rule list查看策略对应的路由表,然后利用ip route list table序号/名字来查看具体的1张路由表:

如果ip route list没有指定table,那么其效果相当于table main,而table main则是Linux默认的路由表,其内的规则来自于局域网DHCP广播下发。

而类似proto kernel,scope link先不需要关注,遇到特殊的再说。

添加规则

接下来,我尝试利用ip route add命令,将我的table 10配置成和main表完全一样的样子,这样就可以用我自己配置的路由策略完成路由了。

因为网线直连了192.168.2.0/24网段,所以这个网段的可以直接通过eth0网卡通讯:

  • ip route add:添加路由规则
  • 192.168.2.0/24:用于匹配目标IP,判断是否应用该路由规则。
  • dev eth0:一旦匹配网段,则直接基于eth0所在的LAN通讯即可,也就是经过ARP广播得到目标IP的MAC地址,然后直接基于二层链路通讯即可。
  • table 10:表示添加该路由规则到10号路由表。

对于不在eth0直连网段内的设备,则发给网关192.168.2.1,由它进一步路由向外转发:

  • default:可以匹配任意目标IP,因此也称为默认路由。
  • via 192.168.2.1:匹配了default,那么就将数据包从eth0网口直接发给192.168.2.1的MAC地址,让其进一步路由转发,这里192.168.2.1就是网关。
  • table 10:该规则属于序号10的路由表。

现在可以测试一下是不是真的应用了我的table 10:

  • 可见请求192.168.2.100时,IP属于eth0直连LAN,所以走了table 10的对应网段规则。
  • 而请求外网的8.8.8.8时,该IP只能走default匹配,先发往网关192.168.2.1的MAC地址(这一步直接在eth0网卡上ARP就能拿到),再由192.168.2.1做自己的路由判定并forward数据包到更远方,这也是互联网这个大蜘蛛网的基本工作原理。

删除规则

删除规则可以通过ip route del后面跟着规则内容即可,比如:sudo ip route del default via 192.168.2.1 dev eth0 table 10。

关于路由表的工作原理与基本操作就说到这里,网络基础非常重要,共勉。

 

如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~