除了使用 iptables 记录传入连接之外......
有没有办法记录已建立的入站连接,而您没有来源(假设服务本身不记录此类内容)?我想要做的是根据连接者收集一些信息,以便能够了解服务在一天中的什么时间使用最多、主要用户群在世界何处等信息。
我知道我可以使用netstat
并将其连接到 cron 脚本,但这可能不准确,因为该脚本只能以一分钟的频率运行。
我现在的想法是这样的:
- 编写一个程序,不断轮询
netstat
,寻找上次轮询中未出现的已建立连接。不过这个想法似乎太浪费 CPU 时间了,因为可能没有新的连接。 - 编写一个包装程序,无论服务在哪个端口上运行,它都可以接受入站连接,但我不知道如何将该连接传递给真正的服务。
编辑:我刚刚想到这个问题可能更适合用 stackoverflow,尽管我不确定。如果这是错误的地方,抱歉。
答案1
你可以使用 iptables 记录新的连接,因此
iptables -I INPUT -m state --state NEW -j LOG --log-level 1 --log-prefix "New Connection "
这将为新的 ssh 连接添加一条类似这样的消息
10月6日 10:58:23 centos 内核:新连接 IN=eth0 OUT=MAC=00:0c:29:5b:a5:ea:00:0c:29:2d:94:a0:08:00 SRC=192.168.1.72 DST=192.168.254.187 LEN=52 TOS=0x00 PREC=0x00 TTL=126 ID=15498 DF PROTO=TCP SPT=59221 DPT=22 WINDOW=8192 RES=0x00 SYN URGP=0
或者像这样建立新的 http 连接
10月6日 11:03:56 centos 内核:新连接 IN=eth0 OUT=MAC=00:0c:29:5b:a5:ea:00:0c:29:d2:2c:38:08:00 SRC=192.168.254.188 DST=192.168.254.187 LEN=60 TOS=0x10 PREC=0x00 TTL=64 ID=10345 DF PROTO=TCP SPT=52488 DPT=80 WINDOW=14600 RES=0x00 SYN URGP=0
每次连接到您的系统时,都会发生类似的事情。系统会将这些信息记录到您的系统日志配置为发送 kern.warning 消息的位置。
答案2
您可以使用 auditd,并在一天结束时根据这些日志行计算一些统计数据。或者您也可以使用 snmp 解决方案,但您可能已经编写了自己的 mib
答案3
tcpdump 或 wireshark 怎么样?