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

我怎么只看到那些传出的连接?事物类型。我正在尝试做的只是查看是否从服务器发送了除Web应用程序数据以外的任何内容。例如,如果有人访问我的网站,则显然我的服务器会将数据发送到客户端的浏览器。但是,假设我的Web应用程序框架中还有代码将统计数据发送到我不知道的其他地方。我希望看到服务器将数据发送到的那些位置(如果有)。可能不太可能,但是假设您决定使用未编写的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)传出连接(不使用la) ,可防止可能的长期DNS查询)并包括与此相关的程序。

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

评论


谢谢。很好的信息。你能看看我更新的问题吗?

–trusktr
2012年11月24日9:43

完全不适当的劫持行为(除了该答案的搜索效果很好):该答案也适用于Windows。要在那里以“连续模式”使用netstat,-c不起作用。您可以改用数字,例如netstat -na 1 |找到“ [Scan_Host_IP_Addr]”以使其每1秒更新一次(在此示例中)。 (资源)。

–松饼
2015年2月9日14:06



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

– reinierpost
2015年6月29日在8:38



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

–awm
17年3月19日在15:43

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

– Gertvdijk
17 Mar 20 '17在10:09



#2 楼

我已经尝试了很多工具,包括iftopntopiptraf,当然还有非常有用的内置netstat -tupln(受支持的选项取决于操作系统),但是对于我的用例来说,最实用的方法是nethogs-它

可通过以下方式安装:

sudo apt-get install nethogs


以root身份运行:

sudo nethogs


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

sudo tcpdump -i lo -A | grep Host:


#3 楼

如果只想记录每次连接尝试,最简单的方法可能是Linux上的目标服务器(或系统上等效的防火墙记录功能)。以及在两个方向上交换的数据量,那么iptables(在Linux上)可能是最好的选择。

但是请注意,以上两个仅记录通过netfilter的流量,通常是所有流量但不考虑用户空间中IP堆栈生成的流量(例如虚拟机或使用原始套接字的任何内容)或桥接流量。 LOGconntrackdargus根据它们在接口上嗅探到的流量来记录各种信息。

#4 楼

我认为您想要做的是获取侦听端口的列表,然后将其从任何其他TCP连接中删除,然后就是所有传出连接。 ss(套接字状态)命令输出“本地地址:端口”和“对等地址:端口”列,我们需要从“本地地址:端口”列而不是“对等地址:端口”列中删除侦听端口,否则,您可能会错过一些传出连接。因此,要实现这一点,我要在grep的“:$ port”字符串后面使用\s{2}+,以匹配“ 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(,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 -tlnss -tn state listening会为您提供不同的输出,这对我来说有点违反直觉。 YMMV。

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

评论


您能否对它的工作原理进行一些解释? (编辑答案;不要将澄清的信息发布为评论。)我认为我已经部分弄清楚了。似乎可能需要更多工作。我在运行FTP服务器的主机上运行ss -tn state侦听,自然地,该命令显示该机器正在侦听端口21。因此,这并不意味着egrep -v将过滤掉其IP地址的任何远程主机包括“ 21”(包括“ 210”,“ 211”,“ 212”等)?另外,这真的有必要吗,还是只是橱窗装饰?

– G-Man说“恢复莫妮卡”
2015年3月20日在2:38

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

–戴尔
15年3月20日在4:06

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

–戴尔
15年3月20日在14:16

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

–trusktr
15年3月31日在17:39

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

–戴尔
2015年5月31日4:16



#5 楼

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

#6 楼

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


netstat -antup


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

您还可以尝试使用ss命令。
作为参考用途:

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

#7 楼

如果您运行Solaris或衍生产品,请查看conntrack

评论


不错,它也可以在Arch Linux上使用:archlinux.org/packages/community/i686/conntrack-tools-您能否提供一个示例,说明如何使用conntrack仅查看从本地启动的连接,而不查看从其他位置启动的连接?

–trusktr
2012年11月24日14:19