我怎么只看到那些传出的连接?事物类型。我正在尝试做的只是查看是否从服务器发送了除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
)传出连接(不使用l
或a
) ,可防止可能的长期DNS查询)并包括与此相关的程序。考虑添加
n
选项以使输出不断更新。#2 楼
我已经尝试了很多工具,包括iftop
,ntop
,iptraf
,当然还有非常有用的内置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堆栈生成的流量(例如虚拟机或使用原始套接字的任何内容)或桥接流量。
LOG
,conntrackd
或argus
根据它们在接口上嗅探到的流量来记录各种信息。#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 -tln
和ss -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
评论
谢谢。很好的信息。你能看看我更新的问题吗?
–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