我对此进行了非常广泛的搜索,但似乎无法找到一个可行的例子。
我的目标是监控特定端口上的 TCP 流量,以查看传入连接并将其写入文本文件。问题是,我还需要在每一行上添加时间戳,以准确显示客户端连接的时间(精确到秒)。
我已经用尽了 netstat、nmap 和 tcptrack,但没有一个支持时间戳。
我在想,如果我监视特定的本地端口并在建立连接时将文本写入文件,然后只需将每行上的日期连接起来,那么 Linux Shell 脚本可能会起作用。
我正在玩这个:
netstat -ano|grep 443|grep ESTABLISHED
还有这个:
tcptrack -i eth0 port 443
但两者都不符合我的需要,因为我需要连接的时间。
如果您有任何建议或能给我指明正确的方向,我将不胜感激。
谢谢。 :)
答案1
编辑:多年后,我仍然会为此获得点赞。请不要选择这个答案,回答使用iptables
我认为这里要好得多。
tcpdump port 443 and '(tcp-syn|tcp-ack)!=0'
或者只有tcp-syn
,或者只有tcp-ack
(我猜是那一个),这取决于你的需要。
答案2
您可以为此使用 Linux 内核中的 iptables 支持。优点是它不需要任何额外的软件就可以发挥一定的作用。缺点是它需要 root 权限才能设置(但考虑到您谈论的是端口 443,这是一个特权端口,因此大多数解决方案可能需要 root 权限)。
添加一个 iptables 规则,内容如下:
sudo iptables -I INPUT -p tcp --dport 443 --syn -j LOG --log-prefix "HTTPS SYN: "
(调整-I INPUT
部分以适合您的口味。)
当规则被触发时,内核会发出一个系统日志条目。例如,对于输入规则,日志条目可能如下所示:
12 月 5 日 09:10:56 主机名内核:[1023963.185332] HTTPS SYN:IN=ifX OUT=MAC=80:80:80:80:80:80:80:80:80:80:80:80:08:00 SRC=ABCD DST=WXYZ LEN=52 TOS=0x00 PREC=0x20 TTL=119 ID=11901 DF PROTO=TCP SPT=37287 DPT=443 WINDOW=8192 RES=0x00 SYN URGP=0
然后,您可以使用任何普通的日志监控工具利用这些信息做一些有用的事情。如果您的系统日志实现支持,您甚至可以将这些信息定向到单独的日志文件中,从而有效地满足您的要求,即无需其他软件即可将连接数据写入带有秒时间戳的文件中。
请注意,该LOG
目标是一个非终止目标,这意味着它后面的任何规则仍将被评估,并且数据包不会被 LOG 规则本身拒绝或接受。这使得该LOG
目标也可用于调试防火墙规则。
为了避免日志泛滥,请考虑limit
与此模块一起使用。有关详细信息,请参阅 iptables(8) 手册页。
答案3
微秒级分辨率
默认情况下,tcpdump实用程序将以微秒精度报告时间。例如:
$ sudo tcpdump -i any port 443
将显示类似以下内容的输出:
12:08:14.028945 IP localhost.33255 > localhost.https:标志[S],seq 1828376761,win 43690,选项[mss 65495,sackOK,TS val 108010971 ecr 0,nop,wscale 7],长度0
12:08:14.028959 IP localhost.https > localhost.33255:标志[R.],seq 0,ack 1828376762,win 0,长度0
请参阅 tcpdump(8) 了解 tcpdump 选项的完整列表,并参阅 pcap-filter(7) 了解您可以使用的过滤器的完整语法。
答案4
您可能还需要此功能来监控来自其他机器的传入和传出数据包。
tcpflow -i eth0 -c port 7891
(-i
提及网络的选项,-c
在控制台中打印数据包的选项)