监控特定端口上的TCP流量
我已经搜索了很久,但似乎无法找到一个工作的例子。
我已经用尽了netstat、nmap和tcptrack,但都不支持时间戳。
netstat -ano|grep 443|grep ESTABLISHED
我在玩这个:
tcptrack -i eth0 port 443
以及这个:
&001
但都不适合我的需要,因为我需要的是连接时间。:)
我已经搜索了很久,但似乎无法找到一个工作的例子。
我已经用尽了netstat、nmap和tcptrack,但都不支持时间戳。
netstat -ano|grep 443|grep ESTABLISHED
我在玩这个:
tcptrack -i eth0 port 443
以及这个:
&001
但都不适合我的需要,因为我需要的是连接时间。:)
编辑*。年后,我还在为这个问题获得了上票。请不要选这个答案,在我看来,这里的使用iptables
的答案要好得多。
tcpdump port 443 and '(tcp-syn|tcp-ack)!=0'
&001
或者只选tcp-syn
,或者只选tcp-ack
(我猜是那一个),看你需要什么了。
**你可以使用Linux内核中的iptables支持来实现这个功能。缺点是它需要root权限才能设置(但考虑到你说的是443端口,这是一个特权端口,你可能需要root权限才能使用大多数解决方案)。例如,在输入规则的情况下,日志条目可能看起来像这样:
Dec 5 09:10:56 hostname kernel: [1023963.185332] HTTPS SYN: IN=ifX OUT= MAC=80:80:80:80:80:80:80:80:80:80:80:80:80:80:80:80:80:80:80:80:80:80:80:80:80:80:80:80:80:80:80:80:80:80:80:80:80:80:80:08:00 SRC=A.B.C.D DST=W.X.Y. Z LEN=52 TOS=0x00 PREC=0x00 TTL=119 ID=11901 DF PROTO=TCP SPT=37287 DPT=443 WINDOW=8192 RES=0x00 SYN URGP=0
你可以使用任何运行的日志监控工具来处理这些信息。如果你的syslog实现支持,你甚至可以将这些信息引导到一个单独的日志文件中,有效地满足了你将连接数据写到一个时间戳为秒的文件中的要求,而不需要额外的软件。
请注意,-I INPUT
目标是一个非终结目标,这意味着任何跟随它的规则仍然会被评估,而数据包不会被LOG规则本身拒绝或接受。这使得LOG
目标在调试防火墙规则时也很有用。
为了避免日志被淹没,可以考虑将LOG
模块与之配合使用。详情请参见 iptables(8) man page。
默认情况下,tcpdump实用程序将以微秒分辨率报告时间。例如:
$ sudo tcpdump -i any port 443
会显示类似于下面的输出:
12:08:14.028945 IP localhost.33255 > 本地host.https: Flags [S], seq 1828376761, win 43690, options [mss 65495,sackOK,TS val 108010971 ecr 0,nop,wscale 7], length 0 12:08:14.028959 IP localhost.https 〉 localhost.33255: Flags [R.], seq 0, ack 1828376762, win 0, length 0
参见 tcpdump(8),了解完整的 tcpdump 选项列表,以及 pcap-filter(7),了解可以使用的过滤器的完整语法。
443是加密的流量–所以无论如何也很难在这个端口上做流量的头或尾:
你可以做
yum install ngrep或apt-get install ngrep
然后运行
ngrep -W byline -d any port 443 -q
你可能还需要这个来监控其他机器的入站和出站数据包。
tcpflow -i eth0 -c port 7891
(选项-i
用于提及网络,选项-c
在控制台中打印数据包)。
如果你需要一个永久的解决方案,可以随时监控感兴趣的端口的流量,我建议使用QoS(linux中的tc命令),tc有点隐秘,没有文档,所以我用FireQoS来设置QoS和netdata来实时监控它。
查一下这个了解一下。 https://github.com/firehol/netdata/wiki/You-should-install-QoS-on-all-your-servers