云服务器安全防护

查了一下 ssh 登录信息,才发现好像这台服务器没开防护,以前用的 fail2ban,选择重新装一次,记录一下,查资料的时候看到了陷阱端口感觉很不错,也顺便实践一下。

查看登录信息

查看btmp信息

1
lastb -n 10 | tac

查看攻击者ip和攻击次数

1
lastb | awk '{ print $3}' | sort | uniq -c | sort -n

发现攻击次数挺少的,最多的也才382次。

1
2
3
4
5
6
7
8
次数  ip
105 164.90.163.90
169 209.38.83.0
182 123.59.28.66
197 47.114.2.5
222 106.75.227.179
272 161.35.19.147
382 112.46.234.115

查看尝试登陆的用户名,最多的还是 root

1
lastb | awk '{ print $1}' | sort | uniq -c | sort -n
1
2
3
4
5
6
7
8
9
10
11
22 test1
23 server
24 es
34 git
39 guest
42 dev
50 test
53 user
64 ubuntu
72 admin
1221 root

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

下面的命令能够后台监控tcp连接,并保存文件到syn.scan中,使用jobs命令可以查看此任务,使用tail syn.scan可以查看文件信息。

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

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

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

查看扫描者IP及扫描次数

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

fail2ban 安全防护

安装

1
sudo apt-get install fail2ban

启动

1
systemctl start fail2ban

开机自启

1
systemctl enable fail2ban

查看状态

1
systemctl status fail2ban

创建本地配置文件副本

1
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

编辑副本

1
nano /etc/fail2ban/jail.local

重启

1
systemctl restart fail2ban

配置ssh防暴力破解

1
2
rm -rf /etc/fail2ban/jail.d/*
nano /etc/fail2ban/jail.d/sshd.local

然后复制以下内容粘贴进去,ctrl+x保存退出然后重启服务

1
2
3
4
5
[sshd]

enabled = true
mode = normal
backend = systemd

查看封锁列表

1
fail2ban-client status

查看SSH封锁情况

1
fail2ban-client status sshd

陷阱端口

简介

开放陷阱端口就是开放大量无意义的端口,让攻击者难以分辨哪些是真实服务。这并不能完全防止端口扫描,但可以干扰攻击者,增加其识别真实服务的难度。
陷阱端口应随机分布在非默认端口范围内,避免集中在某个区域;不要使用常见服务端口(如80、443、22等)作为陷阱端口;确保陷阱端口与真实服务端口不冲突。
这里设置的陷阱端口一旦被访问,直接将访问ip加入30分钟的黑名单,期间内不能访问所有端口。

配置

安装iptables-persistent

1
apt install iptables-persistent

创建自定义链

1
iptables -N TRAP_BLACKLIST

iptables 只能加入 15 个端口,这里使用 ipset 工具管理端口集合,突破 15 个端口的限制

1
apt install ipset

创建端口集合(支持 TCP 和 UDP)

1
2
3
ipset create trap_ports bitmap:port range 1-65535
ipset add trap_ports tcp:2222 # 例如添加 TCP 端口 2222
ipset add trap_ports tcp:4444 # 例如添加 TCP 端口 4444

绑定 iptables 规则

1
iptables -A INPUT -m set --match-set trap_ports dst -j TRAP_BLACKLIST

保存配置

1
ipset save trap_ports -f /etc/iptables/trap_ports.set

验证配置

1
ipset list trap_ports

添加规则

1
2
3
4
5
6
# 如果IP已在列表且30分钟内,刷新时间并丢弃
iptables -A TRAP_BLACKLIST -m recent --name trap_ports --update --seconds 1800 -j DROP
# 首次访问的IP加入列表并丢弃
iptables -A TRAP_BLACKLIST -m recent --name trap_ports --set -j DROP
# 在 INPUT 链最前面插入规则:若 IP 在黑名单中,直接 DROP
iptables -I INPUT -m recent --name trap_ports --update --seconds 1800 -j DROP

保存规则(重要!)

1
netfilter-persistent save

检查规则是否生效

1
iptables -L -v -n

其它

调整黑名单容量(编辑后重启生效)

1
echo "options ipt_recent ip_list_tot=200" | sudo tee /etc/modprobe.d/iptables-recent.conf

查看当前黑名单IP

1
sudo cat /proc/net/xt_recent/trap_ports

检查 ipset 集合

1
sudo ipset list trap_ports

记得开放陷阱端口对应的服务器安全组规则配置。

测试

这是一个在线端口扫描网站,将服务器的地址输入进行扫描,当扫到陷阱端口之后,之后实际打开的端口也被识别为未打开,还是有一定作用的。

参考链接

端口扫描
使用Fail2Ban 保护云服务器和网站安全