与此类似的问题 -路由表命中?- 除了我不使用 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
相当粗糙,通常在接口级别工作。连接过滤器的最简单方法是使用prio
qdisc,最简单的有类 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 counters
或nft reset counters
将显示(或显示并重置)其内容。
答案2
您可以使用:
iptables -vL
或转发:
iptables -t nat -vL
查看每个匹配规则的数据包数量。