简述linux路由表
要理解基本的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。
关于路由表的工作原理与基本操作就说到这里,
tcpdump抓取nc命令的包,ssh的包
端口变成协议:ssh 22;8080变成webcache
抓包可以保存成文件,vim打开乱码,可以用whireshark打开这个文件分析
抓三次握手,ssh连接上服务器;Ctrl d断开服务器抓4次挥手
抓icmp包












浙公网安备 33010602011771号