我的机器是服务器,所以我想忽略与我的服务器建立的连接(例如,当有人访问我的网站时)。我想看看仅有的我的服务器向其他地方发出连接/请求。
我怎么看仅有的那些传出连接?
编辑:我对这类事情很陌生。我想做的只是查看除了我的网络应用程序的数据之外,是否从我的服务器发送了任何内容。例如,如果有人访问我的网站,那么显然我的服务器会将数据发送到客户端的浏览器。但是假设我的网络应用程序框架中的某个地方也有代码将统计数据发送到我不知道的其他地方。我想查看我的服务器正在向哪些位置发送数据(如果有)。这可能不太可能,但假设您决定使用不是您编写的 php 或 nodejs 框架:它有可能会向某处发送某种类型的数据。如果是这样,那就是我想看到的。
答案1
使用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
以数字形式列出所有 UDP ( u
)、TCP ( t
) 和 RAW ( w
) 传出连接(不使用l
或) (防止可能的长时间运行的 DNS 查询)并包含与其关联的程序 ( )。a
n
p
考虑添加c
选项以使输出不断更新。
答案2
我尝试了很多工具,包括iftop
、ntop
、iptraf
,当然还有非常有用的内置工具netstat -tupln
(支持的选项取决于操作系统),但对于我的用例来说最实用的是nethogs
- 它聚合连接由原始应用程序,并且是所有噪声中噪声最小的。
可通过以下方式安装:
sudo apt-get install nethogs
以 root 身份运行:
sudo nethogs
如果您的目标只是查看任何应用程序发起的所有 TCP 连接,那么您可以使用:
sudo tcpdump -i lo -A | grep Host:
更新:新增:乐队— 街区里的一个新孩子类似于nethogs
;用 Rust 编写,可在 Linux、MacOS 和 Windows 上运行:
答案3
如果您只想记录每次连接尝试,最简单的可能是iptables
LOG
Linux 上的目标(或系统上的等效防火墙日志记录功能)。
如果您需要更多信息,例如连接持续时间和双向交换的数据量,那么conntrackd
(在 Linux 上)可能是最佳选择。
但请注意,上面两个仅记录通过 netfilter 的流量,这通常是所有流量,但不考虑用户空间中的 IP 堆栈(如虚拟机或使用原始套接字的任何东西)或桥接流量生成的流量。
对于更通用的解决方案,您可以查看诸如argus
、bro-ids
、 之类的内容,sancp
或者ntop
根据在接口上嗅探的流量记录各种信息。
答案4
我认为你想要做的是获取侦听端口列表,然后将它们从任何其他 TCP 连接中删除,然后这将是所有传出连接。 ss(套接字状态)命令输出“本地地址:端口”和“对等地址:端口”列,我们需要从“本地地址:端口”列而不是“对等地址:端口”列中删除侦听端口,否则您可能会错过一些传出连接。因此,为了实现这一点,我\s{2}+
在 grep 中使用“:$ 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"
请注意,这取决于您使用的 ss 版本,旧版本(例如:ss 实用程序、iproute2-ss111117)具有不同的输出格式,因此您可能必须在 awk 中使用 $3 而不是 $4。另请注意ss -tln
并ss -tn state listening
给出不同的输出,这对我来说有点违反直觉。 YMMV。
我找到了一个稍微优雅的解决方案,不需要知道主机的IP,ss -tn state established dst :*
效果很好,我修改了上面的命令行。