特定端口或用户的总网络流量

特定端口或用户的总网络流量

我想为我的一个客户提供一个“SSH 隧道”,并且我需要通过其端口或用户了解总网络流量。

例如:我将授予他/她使用专属用户名(如 TEST)和端口 7070 访问我的服务器的权限,一周后,我需要知道端口 7070 | 用户测试的总流量(以 MB 或 GB 为单位)。

因此,对我来说,实时监控不是一种选择。

PS 在 Ubuntu 22.04 或任何其他发行版下

答案1

您可以添加iptables规则来标记您感兴趣的所有数据包,然后用来iptables -L -v检查有多少数据包和字节与这些规则匹配。

在您的具体示例中,为了计算特定用户的数据包,您可以尝试以下操作:

# Add a mark in all outgoing packets
iptables -t mangle -I OUTPUT -m owner --uid-owner <user_id> -j MARK --set-mark 1
# Save the mark in conntrack, so you can track return packets
iptables -t mangle -I POSTROUTING -j CONNMARK --save-mark
# Restore the mark in incoming packets
iptables -t mangle -I PREROUTING -j CONNMARK --restore-mark
# Use some rule (e.g. ACCEPT) to accept incoming packets that have your mark.
# This rule is just needed for your counting, so you may want to use something
# different than ACCEPT here.
iptables -t mangle -I INPUT -m mark --mark 1 -j ACCEPT

通过这个,你可以<user_id>像这样计算来自用户的数据包:

iptables -L -v -n -t mangle

并检查上面创建的INPUT和规则的条目(用于获取更多详细信息和精确数字,而不是 MB/GB/等)OUTPUT-vv

现在,这将仅计算用户发起的传出连接数据包,可能会错过实际的 ssh 数据包。对于这些,您可以添加两个额外的规则(但请仔细检查以确保您没有重复计算这些规则):

iptables -t filter -I INPUT -t tcp -m tcp --dport 7070 -j ACCEPT
iptables -t filter -I OUTPUT -t tcp -m tcp --sport 7070 -j ACCEPT

请注意,我-I在所有规则中使用了它们来确保它们位于您可能拥有的任何其他规则之前,但请确保将它们添加到防火墙的正确位置,即您想要放置它们的位置。

更新

要记住的一点是:计数器在重新启动或刷新并重新创建 iptables 后将无法继续存在,因此您还应该考虑使用 cronjob 或类似程序定期抓取这些数字并将其保存在某些数据库或日志文件中。

还:一些替代方法:

根据您具体要做的事情,如果您只需要提供隧道但不需要授予实际机器的访问权限:

您可以在 docker 容器中运行 ssh 服务器,并将 ssh 侦听端口暴露给您想要暴露的端口(例如示例中的 7070)。然后,您只需ifconfig在容器中运行,它就会为您提供通过其接口的数据包和字节数。这还有更好的客户隔离的额外好处。

相关内容