列出所有路由表

nic*_*nic 17 routing iptables iproute2

我需要知道如何列出所有路由表的 ID。例如,我可以运行:

ip rule add fwmark 2 table 104
ip route add dev eth0 default via 192.168.3.7 table 104
Run Code Online (Sandbox Code Playgroud)

调用ip rule list显示:

0:  from all lookup local 
32765:  from all fwmark 0x2 lookup 104 
32766:  from all lookup main 
32767:  from all lookup default
Run Code Online (Sandbox Code Playgroud)

并调用ip route show table 104显示:

default via 192.168.3.7 dev eth0
Run Code Online (Sandbox Code Playgroud)

如果我然后调用ip rule del table 104,随后的调用ip rule list显示:

0:  from all lookup local 
32766:  from all lookup main 
32767:  from all lookup default
Run Code Online (Sandbox Code Playgroud)

但是,调用ip route show table 104仍然显示:

default via 192.168.3.7 dev eth0
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用ip route flush table 104. 我希望能够刷新所有表不在localmaindefault。因此我希望能够列出现有的表。

我见过人们使用cat /etc/iproute2/rt_tables,但这只会产生:

#
# reserved values
#
255 local
254 main
253 default
0   unspec
#
# local
#
#1  inr.ruhep
Run Code Online (Sandbox Code Playgroud)

如何获取当前存在的所有表名?提前致谢!

nic*_*nic 30

存在一种列出所有表的所有路由条目的方法。 ip route show table all

使用一些 shell 管道魔法,您可以像这样提取所有表名和 ID:

ip route show table all | grep "table" | sed 's/.*\(table.*\)/\1/g' | awk '{print $2}' | sort | uniq
Run Code Online (Sandbox Code Playgroud)

或者

ip route show table all | grep -Po 'table \K[^\s]+' | sort -u
Run Code Online (Sandbox Code Playgroud)

如果您只关心数字表名称,请添加一些 grep 过滤:

ip route show table all | grep "table" | sed 's/.*\(table.*\)/\1/g' | awk '{print $2}' | sort | uniq | grep -e "[0-9]"
Run Code Online (Sandbox Code Playgroud)

或者

ip route show table all | grep -Po 'table \K[^\s]+' | sort -u | grep -e "[0-9]"
Run Code Online (Sandbox Code Playgroud)


lar*_*sks 6

如何获取当前存在的所有表名?

该文件/etc/iproute2/rt_tables是系统上表的唯一来源。在内部,路由表具有整数标识符。

你的其余问题有点令人困惑。如果一个表没有被规则引用,那么它就被有效地“删除”了,因为它对系统的路由没有影响。因此,您可以像这样列出所有活动路由表:

ip rule list | awk '/lookup/ {print $NF}'
Run Code Online (Sandbox Code Playgroud)

这会查找lookup路由规则中的所有操作并打印目标。

看起来路由表是由一个 64 位整数标识的。如果您真的,真的想找到所有带有规则的路由表,即使是对您的系统没有影响的非活动路由表,您可以简单地从 1 到 2^64 迭代一个循环:

seq 0 $(echo '2 64 ^ p' | dc) | xargs -iTABLE sh -c 'echo === TABLE ===; ip route show table TABLE'
Run Code Online (Sandbox Code Playgroud)

...但这将永远持续下去,因为 64 位覆盖了很多空间。


小智 6

(egrep '^\s*[0-9]' /etc/iproute2/rt_tables | awk '{print $2}' | sort -u; ip rule list | awk '/lookup/ {print $NF}' | sort -u; ip route show table all | sed 's/.*\(table.*\)/\1/g' | awk '{if($0 ~ /table/) print $2; else print "main";}' | sort -u) | sort | uniq -c
Run Code Online (Sandbox Code Playgroud)

感谢此线程导致此组合显示当前包含路由的所有路由表,这些路由表被规则引用,并且被命名,在每个包含内容、被引用和被命名的表旁边有一个 3 或一个 2如果三个条件中的一个或两个适用,则为 1。