监测服务器端口是否被扫描

端口扫描方式有很多种,SYN扫描是最常见的扫描方式,也称为半连接扫描或半开放扫描。这种扫描方式具有很多优点。比如,性能表现好,每秒钟可以扫描上千个端口。扫描较为隐蔽,不易被发现,因为它从来不会完成TCP连接,而服务器的守护进程一般不会记录这种没有完成的连接。我现在所介绍的是,如何监测SYN扫描,哪些端口被扫描了,以及是谁在扫描。

原文地址 :https://github.com/khdxs7/steps/blob/main/syn_scan_tcpdump.md

一、查看被扫描的端口及扫描者IP

后台监控tcp连接,并保存文件:

1
2
3
4
tcpdump -i en0 #监听特定网卡
nohup tcpdump -i en0 -n "tcp[tcpflags] == tcp-syn" 2>&1 > syn.scan &

nohup tcpdump -n "tcp[13] == 2" 2>&1 > syn.scan &

tcpdump默认监听第一块网卡上经过的数据包。主机上可能有不止一块网卡,所以经常需要指定网卡

使用tcpdump抓取tcp标志位为SYN的数据包,并将结果保存在文件syn.scan中。

查看被扫描的端口及其排名:

1
awk -F '[ .:]' '{print $16}' syn.scan | sort | uniq -c | sort -n

通过awk提取端口,并对其排序,去重并计数,对次数进行排序。

查看扫描者IP及扫描次数:

1
awk -F '[ .]' '{print $4"."$5"."$6"."$7}' syn.scan | sort | uniq -c |sort -n

通过awk提取发送SYN数据包的IP,并对其进行排序,去重并计数,对次数进行排序。

二、统计扫描者位置信息

我们已经知道了扫描者的IP,现在来统计下他们都来自哪里。看看这些扫描者都来自哪些国家,来自哪些城市。

提取扫描者IP并保存为文件:

1
awk -F '[ .]' '{print $4"."$5"."$6"."$7}' syn.scan | sort | uniq > ip.list

通过awk提取发送SYN数据包的IP,并对其进行排序去重,将结果保存在文件。

我们需要用一个小脚本来获取IP详细信息:

此次使用的IP数据库为ipinfo.io,注册后每月可免费查询五万次,不注册每日可查询一千次。

新建一个小脚本lookup.sh来获取IP信息:

1
2
3
4
5
6
#!/bin/bash

while read LINE
do
curl ipinfo.io/$LINE?token=1d9916617400c6
done < ip.list

将获取到的信息保存为文件:

1
./lookup.sh > ip.info

查看扫描者国家信息及其排名:

1
grep country ip.info | sort | uniq -c | sort -n

查看扫描者城市信息及其排名:

1
grep city ip.info | sort | uniq -c | sort -n