监控特定端口上的 TCP 流量

71 linux bash

我已经对此进行了广泛的搜索,但似乎无法提出一个可行的示例。

我的目标是监视特定端口上的 TCP 流量以查看传入连接并将它们写入文本文件。问题是我还需要在每一行上都有一个时间戳,以准确显示客户端何时连接到第二行。

我已经用完了 netstat、nmap 和 tcptrack,但都不支持时间戳。

我在想,如果我监视特定的本地端口并在建立连接时将文本写入文件然后连接每一行上的日期,那么 linux shell 脚本可能会起作用。

我在玩这个:

netstat -ano|grep 443|grep ESTABLISHED
Run Code Online (Sandbox Code Playgroud)

还有这个:

tcptrack -i eth0 port 443
Run Code Online (Sandbox Code Playgroud)

但都不适合我的需求,因为我需要连接进来的时间。

如果您有任何建议或可以指出我正确的方向,将不胜感激。

谢谢。:)

Wri*_*ken 92

编辑:多年后,我仍然获得了赞成票。请不要选择这个答案,我认为这里使用iptables答案要好得多。


tcpdump port 443 and '(tcp-syn|tcp-ack)!=0'
Run Code Online (Sandbox Code Playgroud)

or only tcp-syn,或 only tcp-ack(我的猜测是那个),这取决于您的需要。

  • 我认为向内核日志发送垃圾邮件并不是真正的优越。;) (6认同)
  • @Wrikken 使用内核日志的问题在于,当您 ctrl+c 退出 tcpdump 时使用您的解决方案,一切都和以前一样。iptables 解决方案意味着如果您不手动删除规则,就会留下“惊喜”。这个惊喜可以转化为立即拥有一个完整的根磁盘。对不起,但我赞成这个(: (5认同)

use*_*ser 46

为此,您可以使用 Linux 内核中的 iptables 支持。好处是它不需要任何额外的软件就可以适度使用。缺点是它需要 root 权限才能设置(但鉴于您正在谈论端口 443,这是一个特权端口,您可能需要使用大多数解决方案的 root 权限)。

添加一个类似于以下内容的 iptables 规则:

sudo iptables -I INPUT -p tcp --dport 443 --syn -j LOG --log-prefix "HTTPS SYN: "
Run Code Online (Sandbox Code Playgroud)

(调整-I INPUT部分以适合您的口味。)

当规则被触发时,内核会发出一个 syslog 条目。例如,对于输入规则,日志条目可能类似于:

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

然后,您可以使用任何普通的日志监控工具对这些信息做一些有用的事情。如果您的 syslog 实现支持它,您甚至可以将它们定向到一个单独的日志文件中,从而有效地满足您将连接数据写入时间戳到秒的文件的要求,而无需额外的软件。

请注意,LOG目标是一个非终止目标,这意味着它后面的任何规则仍将被评估,并且数据包不会被 LOG 规则本身拒绝或接受。这使得LOG目标也可用于调试防火墙规则。

为避免泛滥您的日志,请考虑将此limit模块与此结合使用。有关详细信息,请参阅 iptables(8) 手册页。

  • 完成后不要忘记删除这些 IP 表规则,否则它们会根据规则对日志发送大量垃圾邮件。https://www.digitalocean.com/community/tutorials/how-to-list-and-delete-iptables-firewall-rules (3认同)

Cod*_*ome 29

微秒分辨率

默认情况下,tcpdump实用程序将以微秒分辨率报告时间。例如:

$ sudo tcpdump -i any port 443
Run Code Online (Sandbox Code Playgroud)

将显示类似于以下内容的输出:

12:08:14.028945 IP localhost.33255 > localhost.https: Flags [S], seq 1828376761, win 43690, options [mss 65495,sackOK,TS val 108010971 ecr scale 0,nop],0
: 712,0 14.028959 IP localhost.https > localhost.33255: Flags [R.], seq 0, ack 1828376762, win 0, length 0

有关 tcpdump 选项的完整列表,请参阅 tcpdump(8),有关可以使用的过滤器的完整语法,请参阅 pcap-filter(7)。


小智 5

443 是加密流量 - 无论如何很难在这个端口上制作流量的头或尾:

你可以做

yum install ngrep 或 apt-get install ngrep

然后运行

ngrep -W byline -d any port 443 -q
Run Code Online (Sandbox Code Playgroud)