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
. 我希望能够刷新所有表不在local
,main
和default
。因此我希望能够列出现有的表。
我见过人们使用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)
如何获取当前存在的所有表名?
该文件/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。