如何监视我的计算机上的所有传出请求/连接?


71

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

我如何查看那些传出的连接?

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

Answers:


76

使用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)传出连接(不使用la)(n,防止可能的长期运行DNS查询),并包括p与此相关的程序()。

考虑添加c选项以使输出不断更新。


谢谢。很好的信息。您能看一下我更新的问题吗?
trusktr 2012年

1
完全不适当的劫持(除了此答案的搜索效果很好):该答案也适用于Windows。netstat在此处以“连续模式” 使用时-c不起作用。您可以改用数字,例如netstat -na 1 | find "[Scan_Host_IP_Addr]"每秒更新一次1(在此示例中)。(来源)。
鲁芬,2015年

4
这会轮询,因此不会总是捕获所有连接。
reinierpost

有没有一种方法可以显示更多用户友好信息,例如域名,有关IP的信息?也许使用自定义脚本?
awm

@awm很好,strace在此过程中可以实现,过滤名称服务器查找(没有详细信息,这不是它的完整答案)。或者,您可以netstat通过省略n我的答案中包含的选项来显示所列IP的反向DNS 。
gertvdijk

11

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

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

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

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


8

我已经尝试了一堆工具,包括iftopntopiptraf,,当然还有非常有用的内置netstat -tupln(支持的选项包括OS相关的),但最实用的我的使用情况竟然是nethogs-它聚合连接由始发app,并且是最不嘈杂的。

可通过以下方式安装:

sudo apt-get install nethogs

以root身份运行:

sudo nethogs

如果您的目标是仅查看任何应用程序启动的所有TCP连接,则可以使用:

sudo tcpdump -i lo -A | grep Host:

6

我认为您想要做的是获取侦听端口的列表,然后将其从任何其他TCP连接中删除,然后就是所有传出连接。ss(套接字状态)命令输出“本地地址:端口”和“对等地址:端口”列,我们需要从“本地地址:端口”列而不是“对等地址:端口”列中删除侦听端口,否则,您可能会错过一些传出连接。因此,要实现这一点,我需要\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"

请注意,这取决于您使用的ss的版本,较旧的版本(例如:ss实用程序,iproute2-ss111117)具有不同的输出格式,因此在awk中可能必须使用$ 3而不是$ 4。还要注意ss -tln,并ss -tn state listening为您提供了不同的输出,这是一个有点反直觉给我。YMMV。

我发现了一个稍微优雅的解决方案,不需要知道主机的IP,就ss -tn state established dst :*可以很好地工作,我修改了上面的命令行。


您能否对它的工作方式进行一些解释?(编辑答案;不要将澄清信息发布为评论。)我认为我已经部分弄清楚了。似乎可能需要更多工作。我在ss -tn state listening运行FTP服务器的主机上运行,​​自然地,该命令表明该计算机正在侦听端口21。因此,这并不意味着egrep -v将会过滤出IP地址包括“ 21”(包括“ 210” “,” 211“,” 212“,...)?另外,asort真的有必要,还是仅仅是橱窗装饰?
G-Man

我不得不修复几乎所有东西,上面已纠正了脚本。
Dale 2015年

最终,如果ss或netstat仅在其中包含此功能,那就更好了。执行ss --out以获取传出连接的列表。
Dale 2015年

很好,我喜欢这个答案。当我恢复服务器的安全性时,将尝试一下。:D
trusktr

看起来这也可以用于UDP,但是您当然必须使用不同的标志和状态。
戴尔2015年

4

tcpdump允许您查看流入/流出特定接口的所有IP流量,并能够基于某些条件进行过滤。tcpdump默认情况下,通常在大多数* nix系统上安装该工具,如果没有的话,通常在某个地方可以安装一个端口供您的特定发行版使用。


2

netstat 是一个不错的选择。请根据需要使用参数(请参见其手册页)。

netstat -antup

在这里,它可以监视所有(a)监听数字(n)tcp(t)和udp(u)进程(p)。

您也可以尝试使用该ss命令。供参考使用:

SS Linux TCP / UDP网络和套接字信息


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.