要理解基本的linux网络,除了iptables之外最重要的就是路由表了。
路由表用于决定数据包从哪个网口发出,其判断依据则主要是IP地址。
Linux路由表其实有2个主要概念:
- 路由策略(rule)
- 路由表(table)
Linux可以配置很多很多策略,数据包将依次通过各个策略,一旦匹配某个策略则进一步应用策略对应的路由表,如果当前路由表无法匹配到路由则继续执行后续策略匹配。
从网上找了一张很形象的图片:
下面就从命令出发,了解一下rule和table是如何协作的。
路由策略
从上图我们知道,路由策略是串行判定的。
利用如下命令查看系统自带的策略:
1 2 3 4 |
pi@raspberrypi:~ $ ip rule list 0: from all lookup local 32766: from all lookup main 32767: from all lookup default |
系统自带了3个策略,序号分别是0、32766、32767,策略匹配过程是从小到大执行的。
以0号策略为例,它表示匹配任意来源IP的数据包,然后用名字叫做local的路由表进行路由匹配。
如果local路由表里的规则能匹配成功,那么后续的rule就不会执行了,否则还会继续匹配32766等后续策略。
每1条策略最终都会关联到1张路由表,同1个路由表可以被N个策略关联,路由表总是随着路由策略的添加而生成的。
如果要了解如何管理路由策略,可以执行help:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
pi@raspberrypi:~ $ ip rule help Usage: ip rule { add | del } SELECTOR ACTION ip rule { flush | save | restore } ip rule [ list [ SELECTOR ]] SELECTOR := [ not ] [ from PREFIX ] [ to PREFIX ] [ tos TOS ] [ fwmark FWMARK[/MASK] ] [ iif STRING ] [ oif STRING ] [ pref NUMBER ] [ l3mdev ] ACTION := [ table TABLE_ID ] [ nat ADDRESS ] [ realms [SRCREALM/]DSTREALM ] [ goto NUMBER ] SUPPRESSOR SUPPRESSOR := [ suppress_prefixlength NUMBER ] [ suppress_ifgroup DEVGROUP ] TABLE_ID := [ local | main | default | NUMBER ] |
比如,我添加一个序号为1的策略(它紧跟在0之后),它匹配所有数据包,并且对应一个全新的路由表10:
1 2 3 4 5 6 |
pi@raspberrypi:~ $ sudo ip rule add from all to all pref 1 table 10 pi@raspberrypi:~ $ sudo ip rule list 0: from all lookup local 1: from all lookup 10 32766: from all lookup main 32767: from all lookup default |
该命令组成:
- 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序号:
1 2 3 4 5 6 7 8 9 10 11 12 |
pi@raspberrypi:~ $ cat /etc/iproute2/rt_tables # # reserved values # 255 local 254 main 253 default 0 unspec # # local # #1 inr.ruhep |
其实table/lookup local就相当于table 255。
删除刚刚添加的这条规则也很简单,可以利用匹配条件去匹配到它,或者直接利用pref 1指定策略序号删除:
1 2 3 4 5 |
pi@raspberrypi:~ $ sudo ip rule del pref 1 pi@raspberrypi:~ $ sudo ip rule list 0: from all lookup local 32766: from all lookup main 32767: from all lookup default |
不过我现在还是把它加了回来,因为接下来还要讲路由表。
我们通过table 10指定了一个新的路由表,它会被自动创建出来,而且是空的,因此当前这条策略什么也没做就会继续执行下一个策略了。
路由表
路由策略可以配好几万条都是没有问题的,但是路由表的数量有限。
所有路由表相关的命令都是ip route开头的,没有办法利用累死ip route list命令列出所有的路由表。
我们只能通过ip rule list查看策略对应的路由表,然后利用ip route list table序号/名字来查看具体的1张路由表:
1 2 3 4 5 |
pi@raspberrypi:~ $ ip route list table main default via 192.168.2.1 dev eth0 src 192.168.2.101 metric 202 192.168.2.0/24 dev eth0 proto kernel scope link src 192.168.2.101 metric 202 pi@raspberrypi:~ $ ip route list table 10 pi@raspberrypi:~ $ |
如果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网卡通讯:
1 2 3 |
pi@raspberrypi:~ $ sudo ip route add 192.168.2.0/24 dev eth0 table 10 pi@raspberrypi:~ $ ip route list table 10 192.168.2.0/24 dev eth0 scope link |
- ip route add:添加路由规则
- 192.168.2.0/24:用于匹配目标IP,判断是否应用该路由规则。
- dev eth0:一旦匹配网段,则直接基于eth0所在的LAN通讯即可,也就是经过ARP广播得到目标IP的MAC地址,然后直接基于二层链路通讯即可。
- table 10:表示添加该路由规则到10号路由表。
1 2 3 4 |
pi@raspberrypi:~ $ sudo ip route add default via 192.168.2.1 dev eth0 table 10 pi@raspberrypi:~ $ sudo ip route list table 10 default via 192.168.2.1 dev eth0 192.168.2.0/24 dev eth0 scope link |
对于不在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:
1 2 3 4 5 6 7 |
pi@raspberrypi:~ $ ip route get 192.168.2.100 192.168.2.100 dev eth0 table 10 src 192.168.2.101 cache pi@raspberrypi:~ $ ip route get 8.8.8.8 8.8.8.8 via 192.168.2.1 dev eth0 table 10 src 192.168.2.101 cache |
- 可见请求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。
关于路由表的工作原理与基本操作就说到这里,网络基础非常重要,共勉。
如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~

1
1