监视特定端口上的TCP流量


49

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

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

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

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

我在玩这个:

netstat -ano|grep 443|grep ESTABLISHED

以及这个:

tcptrack -i eth0 port 443

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

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

谢谢。:)

linux  bash 

Haha已从stackoverflow迁移,但需要迁移到unix / linux
Kolob Canyon

Answers:


70

编辑:几年后,我仍然在投票。请不要寻求这个答案,在我看来,这里使用iptables答案要好得多。


tcpdump port 443 and '(tcp-syn|tcp-ack)!=0'

或仅tcp-syn,或仅tcp-ack(我猜可能是那个),具体取决于您的需求。


除了显示每个连接的主机名之外,还有没有办法用IP覆盖它?

是的,-n在tcpdump之后添加(man tcpdump:-n不要将地址(即主机地址,端口号等)转换为名称。
2013年

5
我认为,向内核日志发送垃圾邮件并不是真正的优势。;)
Daniel B

1
嗯,但是我会的,只要正确地配置了应该将哪些日志记录在哪里:P但是,如果这是一个破坏交易的问题,这个答案仍然在这里:)
Wrikken

1
@Wrikken为此使用内核日志的问题是,当您从tcpdump中ctrl + c时使用解决方案时,一切仍然像以前一样。iptables解决方案意味着,如果您不手动删除规则,则会留下“惊奇”。这种惊喜可以立即转化为拥有完整的根磁盘。抱歉,但我对此表示反对(:
John Blackberry

31

您可以为此使用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: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)手册页。


是否有可能执行触发此的python脚本?
卡尔·吉尔纳

完成操作后,请不要忘记删除这些IP表规则,否则根据规则,它们将对日志造成大量垃圾邮件。digitalocean.com/community/tutorials/...
莫Beigi

26

微秒分辨率

默认情况下,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,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

2

您可能还需要这样做来监视来自其他计算机的传入和传出数据包。

tcpflow -i eth0 -c port 7891

-i用于提及网络的选项,-c用于在控制台中打印数据包的选项)


这实际上是评论,而不是原始问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论-您可以随时对自己的帖子发表评论,一旦您拥有足够的声誉,就可以在任何帖子中发表评论。请阅读为什么我需要50个信誉才能发表评论?我该怎么办?
DavidPostill


0

如果您需要一个永久解决方案,该解决方案将始终监视目标端口上的流量,则建议使用QoS(Linux中的tc命令)。tc有点晦涩,没有记载,因此我使用FireQoS设置QoS和netdata进行实时监视。

检查此以获取更多信息:https : //github.com/firehol/netdata/wiki/You-should-install-QoS-on-all-your-servers


我想说,仅对于记录连接(在iPTables + --log可以工作的地方),这有点过头了。
djsmiley2k-CoW

没错,如果您需要记录连接,那就太过分了。我使用此解决方案不是监视哪个客户端连接,而是监视服务使用多少带宽。
哥斯达黎加(Costa Tsaousis)'17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.