内网扫描监测 v1 tcpdump版

内网扫描监测 v1 tcpdump版

环境准备

1、centos7操作系统
2、配置多个ip,两种用途:

服务器添加多块网卡,可以同时监测多个网络
单网卡配置多个ip,增加被黑客扫描的几率
我这里配置了一块网卡 ens160,上面配置了四个IP地址 10.12.28.99、10.12.29.99、10.12.30.99、10.12.31.99

3、加固sshd服务,防止服务器被黑客黑掉

配置完监控后,直接关闭sshd服务。后续维护的时候,可以临时开启sshd服务,或者在服务器本地进行操作
N种方法:禁用root登录、设置强密码、强制使用密钥登录、修改sshd监听端口号,限制访问IP等
我这里使用的方法是:强制使用密钥登录+修改sshd监控端口为22774

4、关闭防火墙运行黑客扫描本机的端口;关闭除sshd以外的其他所有可以监听tcp端口的服务,防止黑客扫描成功黑掉服务器;最后执行命令检查服务器对外监听的端口只有sshd,方便我们连上来进行管理
[root@net-monitor ~]# systemctl stop firewalld.service
[root@net-monitor ~]# systemctl disable firewalld.service
[root@net-monitor ~]# systemctl stop iptables.service
[root@net-monitor ~]# systemctl disable iptables.service
[root@net-monitor ~]# systemctl stop rpcbind.service
[root@net-monitor ~]# systemctl stop rpcbind.socket
[root@net-monitor ~]# systemctl disable rpcbind.socket
[root@net-monitor ~]# systemctl disable rpcbind.service
[root@net-monitor ~]# ss -tunl | grep '^tcp' | awk '{print$5}' | grep \* 
*:22774

操作步骤

1、创建存放抓包文件的目录,这里在/tmp目录下创建一个专门的目录,系统会自动清理较早的文件
[root@net-monitor ~]# mkdir -p /tmp/tcpdump
2、设置开机自动抓包,tcpdump只抓到四个监控IP的tcp-syn包,每分钟在/tmp目录下保存一个文件
[root@net-monitor ~]# echo 'nohup tcpdump -i any \(tcp[tcpflags] = tcp-syn\) and dst host \(10.12.28.99 or 10.12.29.99 or 10.12.30.99 or 10.12.31.99\) -s 0 -U -G 60  -w /tmp/tcpdump/%Y_%m%d_%H%M.cap &>/dev/null &' >> /etc/rc.local
3、手工执行一下上面的命令,就不用重启系统了
[root@net-monitor ~]# nohup tcpdump -i any \(tcp[tcpflags] = tcp-syn\) and dst host \(10.12.28.99 or 10.12.29.99 or 10.12.30.99 or 10.12.31.99\) -s 0 -U -G 60  -w /tmp/tcpdump/%Y_%m%d_%H%M.cap &>/dev/null &

在后台执行命令xxxx,即使退出登录也不会影响xxxx命令的运行,并且记录nohup日志
nuhop xxxx &>/dev/null &

在服务器的所有接口上抓包,不包括lo(127.0.0.1)接口
-i any

只抓tcp协议的syn包
(tcp[tcpflags] = tcp-syn)

抓取目标地址是本机四个IP地址的包
dst host (10.12.28.99 or 10.12.29.99 or 10.12.30.99 or 10.12.31.99)

抓取完成的数据包,默认只抓取68字节
-s 0

将抓到的包直接写入文件
-U

每60s生成一个文件,注意文件名要用变量,否则最多只能保存最近一分钟的数据包
-G 60

设置保存抓包文件的位置,配合 -G命令,这里使用了时间变量:/tmp/tcpdump/2021_0201_1745.cap
-w /tmp/tcpdump/%Y_%m%d_%H%M.cap

4、为rc.local文件添加执行权限
[root@net-monitor ~]# chmod +x /etc/rc.d/rc.local
5、创建脚本目录,存放分析扫描的脚本文件
[root@net-monitor ~]# mkdir -p /opt/shells
6、编辑脚本文件 /opt/shells/net-monitor.sh
#!/bin/bash

#  设置IP白名单,多个IP使用 | 隔开
WHITE_LIST='10.12.28.253|172.22.140.44'

#  设置报警阈值
WARN_NUM=4

#  计划任务每分钟自动读取两分钟前的那个抓包文件,分析异常IP,触发阈值自动邮件报警,并提供证据
/usr/sbin/tcpdump \
    -r /tmp/tcpdump/$(date -d '2 mins ago' "+%Y_%m%d_%H%M").cap \
    -nn \
    2>/dev/null \
        | grep -Ev "$WHITE_LIST" \
        | awk '{print $3}' \
        | awk -F \. '{print $1"."$2"."$3"."$4}' \
        | sort -n | uniq -c | sort -nr \
        | while read COUNT IP
          do
            if [ $COUNT -ge $WARN_NUM ] 
            then        
                /usr/sbin/tcpdump \
                    -r /tmp/tcpdump/$(date -d '2 mins ago' "+%Y_%m%d_%H%M").cap \
                    -nn \               
                    2>/dev/null \       
                        | grep $IP \            
                        | head -10 \            
                        | mail -r net-monitor@mail.com \
                               -s "异常IP: $IP 一分钟内扫描监控服务器 $COUNT 次" \
                               -a /tmp/tcpdump/$(date -d '2 mins ago' "+%Y_%m%d_%H%M").cap \
                               -c CC@mail.com \
                               network-manager@mail.com  
            else        
                exit            
            fi          
          done 

因为 \ 后面加 #注释 会影响脚本运行,所以单独写了一份注释版的

#!/bin/bash

#  设置IP白名单,多个IP使用 | 隔开
WHITE_LIST='10.12.28.253|172.22.140.44'

#  设置报警阈值
WARN_NUM=4

#  计划任务每分钟自动读取两分钟前的那个抓包文件,分析异常IP,触发阈值自动邮件报警,并提供证据

/usr/sbin/tcpdump \                               # tcpdump命令的绝对位置,使用相对路径计划任务会找不到该命令
    -r /tmp/tcpdump/$(date -d '2 mins ago' "+%Y_%m%d_%H%M").cap \ # 分析两分钟前的那个抓包文件,上一分钟的不行,原因留个悬念
    -nn \                                         # 直接显示IP和端口号
    2>/dev/null \                                 # 不打印错误信息
        | grep -Ev "$WHITE_LIST" \                # 过滤白名单中的IP
        | awk '{print $3}' \                      # 取源IP
        | awk -F \. '{print $1"."$2"."$3"."$4}' \ # 去掉源端口,方便后面去重统计次数
        | sort -n | uniq -c | sort -nr \          # IP去重后,按出现次数降序排列,第一列是出现次数,第二列是IP地址
        | while read COUNT IP                     # while循环读取每个IP及出现次数
          do
            if [ $COUNT -ge $WARN_NUM ]           # 如果IP出现次数大于等于报警阈值,进行邮件报警
            then        
                /usr/sbin/tcpdump \               # 重新分析两分钟前的那个抓包文件
                    -r /tmp/tcpdump/$(date -d '2 mins ago' "+%Y_%m%d_%H%M").cap \
                    -nn \               
                    2>/dev/null \       
                        | grep $IP \                                                          # 只看该异常IP的信息
                        | head -10 \                                                          # 节选前10行证据,放到邮件正文
                        | mail -r net-monitor@mail.com \                                      # 设置邮件的发件人
                               -s "异常IP: $IP 一分钟内扫描监控服务器 $COUNT 次" \                # 设置邮件主题
                               -a /tmp/tcpdump/$(date -d '2 mins ago' "+%Y_%m%d_%H%M").cap \  # 将本次分析的抓包文件,作为完成的证据添加到邮件的附件中
                               -c CC@mail.com \                                               # 设置抄送邮箱
                               network-manager@mail.com                                       # 设置主送邮箱
            else        
                exit                              # 如果IP出现的次数小于报警阈值,直接退出脚本,不在对后面出现次数更少的IP进行处理
            fi          
          done 
7、添加计划任务,每分钟执行一次脚本
[root@net-monitor ~]# crontab -e
* * * * * sh /opt/shells/net-monitor.sh
8、完成后的效果,如图

9、附1:实时抓包命令
[root@net-monitor ~]# tcpdump -i any \(tcp[tcpflags] = tcp-syn\) and dst host \(10.12.28.99 or 10.12.29.99 or 10.12.30.99 or 10.12.31.99\) -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
23:29:39.150287 IP 10.12.28.8.46905 > 10.12.28.99.22: Flags [S], seq 1789993435, win 14600, options [mss 1460,sackOK,TS val 4251068229 ecr 0,nop,wscale 7], length 0
10、附2:手工分析历史抓包文件
[root@net-monitor ~]# for i in `ls /tmp/tcpdump/*.cap` ; do echo "------ $i -----" ; tcpdump -r $i -nn 2>/dev/null| awk '{print $3}' | awk -F . '{print $1"."$2"."$3"."$4}' | sort -n | uniq -c | sort -n ; done
------ /tmp/tcpdump/2021_0201_2212.cap -----
------ /tmp/tcpdump/2021_0201_2218.cap -----
      1 10.12.28.253
------ /tmp/tcpdump/2021_0201_2219.cap -----
      1 10.12.28.253
------ /tmp/tcpdump/2021_0201_2220.cap -----
      1 10.12.28.253
------ /tmp/tcpdump/2021_0201_2241.cap -----
     19 10.12.28.8
------ /tmp/tcpdump/2021_0201_2329.cap -----
      1 10.12.28.8
posted @ 2021-02-01 23:44  三角形  阅读(324)  评论(0编辑  收藏  举报