Shadowsocks异常连接监控及告警

题记

可能你搭建了自己的Shadowsocks server,但是你不知道是否有人在探测你开放的socks端口。这个脚本可以帮助你,当你的socks被从来没连接过的陌生人使用时,会给你发送消息提醒

这是一个练手的小脚本(表示很久没写shell了…)

灵感来自于学长的博客,但是实现的方式和功能上和他的不太一样,感兴趣的可以去看看

简介

思路
在这个脚本中,我尝试了以下几点

  • 使用ss抓取出当前的ssserver客户端连接
  • 使用淘宝ip库来解析获取地址信息,并使用jq来解析JSON
  • 获取到的消息记录到log,并维护一个已知客户端列表
  • 对于没有记录过的用户使用alertover实现告警
  • 对于记录过的用户更新访问次数

在使用这个脚本之前,我们需要安装jq这个软件包,其一般可以直接yum或者apt线上安装,这里就不在赘述。jq是一个很强大的JSON解析的工具

其次,我们需要在手机上安装上这个alertover自称是完全免费的软件来进行消息通知,和pushover的使用方式类似,同样需要在手机上登录,官网的API界面有详细的介绍

code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#!/bin/bash
# Author: zhxfei
show_conn()
{
data=`curl -s --connect-timeout 2 \
"http://ip.taobao.com/service/getIpInfo.php?ip=$1"|jq .`
if [ $(echo $data | jq .code) == 0 ];then
loc=$(echo $data| jq ".data | [.country +.region +.city +.isp]| .[]")
echo "client:$1 ; location: $loc ; conn_time: $2"
else
echo "requests fail; you could check the network configuration"
fi
}
alertover()
{
INFO=`show_conn $1 $2`
echo $INFO
NOTI=`curl -s \
--form-string "source=s-b93ac1a7-5da7-4392-90aa-1eedcf20" \
--form-string "receiver=u-7329c6d4-5104-417b-91a5-133f39ff" \
--form-string "content=$INFO" \
--form-string "title=shadowsocks monitor" \
https://api.alertover.com/v1/alert |jq .`
if [ $(echo $NOTI|jq .code) -ne 0 ];then
echo $NOTI|jq .msg
else
echo "alert succeed"
fi
}
inlog()
{
grep $1 log.txt > /dev/null
if [ $? -eq 0 ];then
echo "client: $1 update count"
COUNT=`grep $1 ./log.txt | awk '{print $NF}'`
NEW_COUNT=$(($COUNT + $2))
cat log.txt | grep -v $1 > log.txt
INFO=`show_conn $1 $NEW_COUNT`
echo $INFO >> log.txt
else
INFO=`show_conn $1 $2`
echo $INFO >> log.txt
fi
}
LINK_PEER=`ss -antp|grep "^ESTAB.*$1.*ssserver"| \
awk '{print $5}'|awk -F: '{print $1}'| \
sort|uniq -c |sort -nr|sed 's/^ \+//'|tr ' ' ':'`
[ -f ./know_host.txt ] || touch ./know_host.txt
[ -f ./log.txt ] || touch ./log.txt
for line in ${LINK_PEER};do
COUNT=$(echo $line|awk -F':' '{print $1}')
IP=$(echo $line|awk -F':' '{print $2}')
grep $IP know_host.txt > /dev/null
if [ $? -ne 0 ];then
alertover $IP $COUNT
echo $IP >> know_host.txt
fi
inlog $IP $COUNT
done

使用:根据shadowsocks servertimeout时长设定定时任务。脚本运行一次的参数需要增加socks server开放的端口号

1
2
$ ./ss_mon.sh
Usage: ./ss_mon.sh [Socks Server Port]
坚持原创技术分享,您的支持将鼓励我继续创作!