云服日常被攻击(三)
咕咕咕 fishing

过程

又又又被攻击了,这次是通过stp挂在公网的rdp。方便我远程访问家里云。

起初是看到了v站的一篇帖子:求助,被入侵了,如何减小损失?
大致内容就是他通过ftp挂在公网的rdp被入侵了,常用的网站密码都泄露了。

然后我就想起来,这人的操作和我一样啊。赶紧上服务器看下日志:
image

看到日志这么大我就知道坏了,进去翻了一下,基本就是几个ip一直在连接:
image

再去翻一下家里云windows的日志:
image
image

基本就是用几个用户名在一直尝试,总共试了三万多次,我看日志的时候还在试是最难绷的。
把ftp服务听了之后,想想有什么办法防止这种情况。

windows的服务被暴露出来,首先肯定是从windows源头入手,看看有什么办法阻断。
看了windows的安全策略,默认多次登陆失败后账户会被锁定10分钟。
这个调不调整问题也不大,因为它似乎跑的是字典,连我的用户名都没试出来。(试出来的概率也不大
另外就是加ip黑名单,这个不现实。因为ftp服务,所有的请求都是从公网的服务器转发来的。

但是在服务器的层面加ip黑名单是可以的。
bash脚本我就不是很熟了,连夜和gpt一起写了个脚本,检测ftp的日志,把频繁访问的都加到防火墙的ip黑名单里。
最后配置个定时任务运行脚本。就完成了。

bash 脚本

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
#!/bin/bash

# 配置参数
LOG_FILE="/home/ubuntu/frp/frp_0.56.0_linux_amd64/frps.log" # 日志文件路径
THRESHOLD=20 # 黑名单阈值
BLACKLIST_FILE="/home/ubuntu/frp/blacklist.txt" # 黑名单文件路径
CHAIN_NAME="FTP-BLACKLIST" # 自定义防火墙链名称


# 创建自定义防火墙链(如果不存在)
iptables -L $CHAIN_NAME &> /dev/null
if [[ $? -ne 0 ]]; then
echo "创建自定义链: $CHAIN_NAME"
iptables -N $CHAIN_NAME
# 确保 INPUT 链引用自定义链
iptables -I INPUT -j $CHAIN_NAME
fi

# 提取日志中的 IP 地址并统计
echo "解析日志文件:$LOG_FILE"
declare -A ip_counts
while read -r line; do
# 从日志中提取 IP
ip=$(echo "$line" | grep -oP '\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b')
if [[ -n "$ip" ]]; then
ip_counts["$ip"]=$((ip_counts["$ip"] + 1))
fi
done < "$LOG_FILE"

# 遍历统计结果,筛选频率超过 $THRESHOLD 的 IP
echo "筛选频率超过 $THRESHOLD 的 IP"
blacklist_ips=()
for ip in "${!ip_counts[@]}"; do
if [[ ${ip_counts["$ip"]} -gt $THRESHOLD ]]; then
blacklist_ips+=("$ip")
fi
done

# 去重并添加到黑名单文件
echo "将 IP 添加到黑名单文件并去重"
for ip in "${blacklist_ips[@]}"; do
if ! grep -q "^$ip$" "$BLACKLIST_FILE"; then
echo "$ip" >> "$BLACKLIST_FILE"
fi
done

# 一次性检查哪些 IP 已经在防火墙中,过滤掉已存在的 IP
existing_ips=$(iptables -L $CHAIN_NAME -v -n | grep -oP '\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b' | sort -u | grep -v '^0\.0\.0\.0$')

# 遍历黑名单 IP,添加到防火墙中
echo "更新防火墙黑名单规则"
for ip in "${blacklist_ips[@]}"; do
if echo "$existing_ips" | grep -wq "^$ip$"; then
echo "IP 已在防火墙中:$ip"
else
echo "添加黑名单规则:$ip"
iptables -A $CHAIN_NAME -s "$ip" -j DROP
fi
done

echo "防火墙规则更新完成!"
1
*/10 * * * * bash /home/ubuntu/frp/blacklist.sh >> /home/ubuntu/frp/blacklist.log 2>&1

2>&1:将标准错误(stderr)重定向到标准输出,这样标准错误也会被追加到同一个日志文件中。

名称 代码 操作符
标准输入(stdin) 0 < 或 <<
标准输出(stdout) 1 >,>>,1> 或 1>>
标准错误输出(stderr) 2 2> 或 2>>
 评论
评论插件加载失败
正在加载评论插件