如何监控来自我的机器的所有传出请求/连接?

tru*_*ktr 114 command-line networking security shell-script

我的机器是一台服务器,所以我想忽略与我的服务器建立的连接(例如,当有人访问我的网站时)。我希望看到只有连接/请求被我的服务器到其他地方做。

我如何看到那些传出连接?

编辑:我是这些类型的新手。我想要做的只是看看除了我的网络应用程序的数据之外,是否从我的服务器发送了任何内容。例如,如果有人访问我的网站,那么显然我的服务器会将数据发送到客户端的浏览器。但是假设我的网络应用程序框架中的某处也有代码将统计数据发送到我不知道的其他地方。我想看看我的服务器将数据发送到的那些地方,如果有的话。这可能不太可能,但假设您决定使用不是您编写的 php 或 nodejs 框架:它可能会在某处发送某种类型的数据。如果是这样,这就是我希望看到的。

ger*_*ijk 110

使用netstat. 例如

$ netstat -nputw
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
[...]
tcp        0      0 192.168.25.222:22       192.168.0.134:42903     ESTABLISHED 32663/sshd: gert [p
Run Code Online (Sandbox Code Playgroud)

以数字形式(,防止可能的长时间运行的 DNS 查询)列出所有 UDP ( u)、TCP ( t) 和 RAW ( w) 传出连接(不使用la),n并包括p与之关联的程序 ( )。

考虑添加c让输出持续更新的选项。

  • 这是轮询,所以它不会总是捕获*所有*连接。 (5认同)

ccp*_*zza 23

我已经尝试了很多工具,包括iftop, ntop, iptraf,当然还有非常有用的内置工具netstat -tupln(支持的选项取决于操作系统),但对我的用例来说最实用的是nethogs- 它通过源聚合连接app,并且是噪音最小的。

可通过以下方式安装:

sudo apt-get install nethogs
Run Code Online (Sandbox Code Playgroud)

以 root 身份运行:

sudo nethogs
Run Code Online (Sandbox Code Playgroud)

如果您的目标只是查看任何应用程序发起的所有 TCP 连接,那么您可以使用:

sudo tcpdump -i lo -A | grep Host:
Run Code Online (Sandbox Code Playgroud)


Sté*_*las 14

如果您只想记录每次连接尝试,最简单的方法可能是iptables LOG针对 Linux(或系统上的等效防火墙日志记录功能)。

如果您需要更多信息,例如连接持续时间和双向交换的数据量,那么conntrackd(在 Linux 上)可能是最佳选择。

但是请注意,上面的这两个只记录通过 netfilter 的流量,这通常是所有流量,但不考虑用户空间中 IP 堆栈生成的流量(如虚拟机或任何使用原始套接字的流量)或桥接流量。

对于更广泛的解决方案,你可以看看之类的东西argusbro-idssancp或者ntop用来记录基础上,他们在接口上监听通信的各种信息。


Dal*_*ale 7

我认为您想要做的是获取侦听端口列表,然后将它们从任何其他 TCP 连接中删除,然后这将是所有传出连接。ss(套接字状态)命令输出“Local Address:Port”和“Peer Address:Port”列,我们需要从“Local Address:Port”列而不是“Peer Address:Port”列中删除侦听端口,否则您可能会错过一些传出连接。因此,为了实现这一点,我\s{2}+在 grep 中的“:$port”字符串后面使用以匹配“Local Address:Port”列后面存在的空格;该列后面有两个或多个空格,其中“对等地址:端口”有一个空格,然后是一个换行符(grrr ...应该只有一个换行符,IMO,\s+\s{2}+.) 通常我可能会尝试使用 ss 的过滤功能,例如使用ss -tn state established '(sport != :<port1> and sport !=:<port2>)' src <ip address>. 但该字符串的长度似乎有限制,它在我有很多侦听端口的系统上爆炸了。所以我试图用 grep 做同样的事情。我相信以下方法会起作用:

FILTER=$(ss -tn state listening | gawk 'NR > 1 {n=split($3,A,":"); B[NR-1]=A[n]} END {for (i=1; i<length(B); i++) printf ":%s\\s{2}+|", B[i]; printf ":%s\\s{2}+", B[i]}')

ss -tn state established dst :* | grep -P -v "$FILTER"
Run Code Online (Sandbox Code Playgroud)

请注意,这取决于您使用的 ss 版本,旧版本(如:ss 实用程序、iproute2-ss111117)具有不同的输出格式,因此您可能必须在 awk 中使用 $3 而不是 $4。还要注意ss -tlnss -tn state listening为您提供不同的输出,这对我来说有点违反直觉。天啊。

我找到了一个稍微优雅的解决方案,不需要知道主机的 IP,ss -tn state established dst :*效果很好,我修改了上面的命令行。


小智 5

tcpdump允许您查看流入/流出特定接口的所有 IP 流量,并能够根据特定标准进行过滤。tcpdump默认情况下,通常安装在大多数 *nix 系统上,如果没有,通常会有一个端口可以为您的特定发行版获取它。