想象一下,在基于 Linux 的路由器(Debian 发行版)中,您有许多 NIC。如何打印出给定 NIC 的打开连接数?(解决方法是可接受的答案)
答案1
选项1
netstat | awk '$4 ~ /xxx.xxx.xxx.xxx/ { ++count } END { print count }'
在哪里xxx.xxx.xxx.xxx是 NIC 的 IP 地址。
netstat
将找到所有打开的连接awk
与 NIC 的 IP 地址匹配$4
告诉awk
我们要看第四列{ ++count } END { print count }
告诉awk
每次找到匹配项时进行计数。完成后,打印出最终计数。
选项 2
netstat | grep xxx.xxx.xxx.xxx -c
在哪里xxx.xxx.xxx.xxx是 NIC 的 IP 地址。
netstat
将找到所有打开的连接grep
与 NIC 的 IP 地址匹配-c
要求grep
计算匹配的数量,而不是将其打印出来。
选项 1 的优点是只匹配本地地址字段,而不是任何地方。如果存在远程地址指向本地主机的开放连接,选项 2 可能会重复计算。
答案2
不能。基本 IP 路由器只是无状态地转发数据报,只查看 IP 层。它们对任何不是它们作为端点的连接一无所知。
SPI 防火墙或 NAT 网关则是另一回事。
答案3
路由器不跟踪连接——您需要询问防火墙。
Linux 防火墙支持状态“连接”跟踪,但它不一定默认处于活动状态。如果您有以下任何一种情况:
-m state
使用或 的iptables 规则-m conntrack
,- 或者使用 nftables 规则
ct state
, - 或 iptables/nftables NAT 表中的任何规则(例如 nat/prerouting 链),
然后防火墙的 conntrack 系统处于活动状态,您可以使用以下命令查看其“状态表”:
conntrack -L
但是,由于这是由防火墙(而不是路由器)完成的,因此状态与任何特定接口都没有关系 - 它们只关心 L3/L4 寻址。