列出所有的路由表

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

ip rule add fwmark 2 table 104 ip route add dev eth0 default via 192.168.3.7 table 104 

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 

而对ip route show table 104的呼叫显示:

 default via 192.168.3.7 dev eth0 

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

 0: from all lookup local 32766: from all lookup main 32767: from all lookup default 

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

 default via 192.168.3.7 dev eth0 

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

我已经看到人们使用cat /etc/iproute2/rt_tables ,但只会产生:

 # # reserved values # 255 local 254 main 253 default 0 unspec # # local # #1 inr.ruhep 

我能做些什么来获得当前存在的所有表名? 提前致谢!

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

使用一些shellpipe道魔法,你可以像这样提取所有的表名和ID:

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

要么

 ip route show table all | grep -Po 'table \K[^\s]+' | sort -u 

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

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

要么

 ip route show table all | grep -Po 'table \K[^\s]+' | sort -u | grep -e "[0-9]" 

我能做些什么来获得当前存在的所有表名?

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

你的问题的其余部分有点混乱。 如果一个表没有被规则引用,那么它被有效地“删除”,因为它不会影响系统的路由。 所以你可以像这样列出所有的活动路由表:

 ip rule list | awk '/lookup/ {print $NF}' 

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

它看起来像路由表由64位整数标识。 如果你确实想要find所有具有规则的路由表,即使是对你的系统没有影响的非活动路由表,你也可以简单地迭代一个从1到2 ^ 64的循环:

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

…但这将会永远持续下去,因为64位占用了大量的空间。

 (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 

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