Linux - 查找默认路由的命中

Linux - 查找默认路由的命中

与此类似的问题 -路由表命中?- 除了我不使用 iptables 并在内核路由表中寻找正常路由命中之外。

但我的用例是查找防火墙中有多少数据包通过默认路由转发,以确保在删除之前它是无用的。对上述问题的回答包括检查缓存,但是否有可能某些数据包会在没有命中缓存的情况下被转发?

此外,检查缓存后,推荐的命令 ( route -neeC) 就会终止,我想长时间(约 24 小时)检查默认路由“查找命中”。有什么建议吗?

干杯。

答案1

IPv4 的 Linux 路由缓存已在Linux 3.6(只留下使用优化的LPC字典树)。因此,2012 年以后的 Linux 系统无法获取路由缓存统计数据。


一个简单的方法标签默认路由的用法是放置一个领域此路由上的值。与此路由匹配的数据包(而不是使用相同网关的更具体路由)将被识别为具有给定的域值。因此,如果默认路由是 192.0.2.1 viaeth0,路线将设置如下:

ip route add default via 192.0.2.1 proto static realm 10

add或者,您可以通过替换来更改以前的默认路由(没有领域)change,而不会造成中断。

此领域标签至少可以在其他两个网络子系统中重复使用:tc filter ... route或 nftables'nft ... meta rtclassid


交通管制

tc相当粗糙,通常在接口级别工作。连接过滤器的最简单方法是使用prioqdisc,最简单的有类 qdisc。其特定的优先级属性实际上不会被使用。因此,按照上一个示例进行操作:

tc qdisc add dev eth0 root handle 1: prio

现在添加一个带有空操作的过滤器(以及一个偏好订单和继续如果需要,可以控制允许使用其他类似的过滤器),只是为了获得统计数据:

tc filter add dev eth0 parent 1: protocol ip pref 1 route to 10 action continue

现在,每个与路由域 10 匹配的 IP 数据包都将使用 显示在统计信息中tc -s filter show dev eth0。例如:

# tc -s filter show dev eth0
filter parent 1: protocol all pref 1 route chain 0 
filter parent 1: protocol all pref 1 route chain 0 fh 0xffff000a to 10 
    action order 1: gact action continue
     random type none pass val 0
     index 1 ref 1 bind 1 installed 48 sec used 4 sec
    Action statistics:
    Sent 12230 bytes 79 pkt (dropped 0, overlimits 0 requeues 0) 
    backlog 0b 0p requeues 0

注:均已转发本地发起的数据包是匹配的,这对于测量来说可能是一个问题。


nftables

nftables这里不会用于执行任何类型的防火墙,而只是用于增加一些计数器。

nftables仅安装请求的 netfilter 钩子,而不是所有可用的钩子,因此通常比iptables。这里我们只需要一个与领域相匹配的规则——这就是类标识符表达式 - 上面有一个计数器。如果是本地发起的数据包,则只需使用输出钩子。forward 钩子将只匹配转发的数据包。

nft add table ip mystats
nft add chain ip mystats forward '{ type filter hook forward priority 0; policy accept; }'
nft add rule ip mystats forward meta rtclassid 10 counter

稍后将举例说明:

# nft list ruleset
table ip stats {
    chain forward {
        type filter hook forward priority filter; policy accept;
        meta rtclassid 10 counter packets 1453 bytes 118264
    }
}

仅当将值存储在命名对象中时才可以将值归零,规则集将改为(用 加载nft -f file):

table ip mystats {
    counter defaultroutecount { }

    chain forward {
        type filter hook forward priority filter; policy accept;
        meta rtclassid 10 counter name "defaultroutecount"
    }
}

然后nft list countersnft reset counters将显示(或显示并重置)其内容。

答案2

您可以使用:

iptables -vL

或转发:

iptables -t nat -vL

查看每个匹配规则的数据包数量。

相关内容