前言:被端口扫描扫麻了

因为临时外出远程控制宽带下面的一台电脑,就偷懒直接映射了3389端口。过了几天忘了关,回来一看电脑被锁着了,显示"账户引用账户当前已锁定,且可能无法登录",就是被远程尝试密码次数过多锁住了,虽然是强密码,但还得进PE改管理员改安全策略才进去了。
开常用端口映射固然不安全,但天天被扫也很烦,不如就直接弄个蜜罐把扫描的IP收集起来,一扫就拉黑舒服了。

实现:利用ipset和动作-j SET

我想的是写一个脚本部署在路由器/VPS上的,尽可能简单轻量和兼容,加入开机启动运行一次就可以,因此最基本的思路就是:创建一个ipset,谁扫了我的常用端口,就把他加入这个ipset(利用iptables的动作-j SET),然后在入站对ipset里面的IP全部DROP掉。
一个比较简单的例子是这样的,假设公网IP的网口是eth0:

1
2
3
4
5
6
# 创建一个名为blacklist的ipset
ipset create blacklist hash:ip
# 从eth0入站的IP,触碰了22/3389端口就把这个IP加入blacklist
iptables -I INPUT -i eth0 -p tcp -m multiport --dports "22,3389" -j SET --add-set blacklist src
# 从eth0入站的数据,是blacklist的就直接DROP掉
iptables -I INPUT -m set --match-set blacklist src -j DROP

Flytrap —— 一个简单的蜜罐防火墙脚本

脚本可从Github下载: https://github.com/kkkgo/Flytrap

Flytrap,一个简单的蜜罐防火墙脚本。如其名字,就像一个捕蝇草,抓住来扫端口的IP地址捣蛋鬼,拉黑他DROP掉!

脚本配置项:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#Customizable option area
# 公网接口名字
wan_name="pppoe-wan"
# 定义扫了哪些端口就抓住他
trap_ports="21,22,23,3389"
# 定义是否也部署IPv6,yes/no
trap6="no"
# IP封禁时间,0为一直封禁,值大于0超时从名单中移除(单位:秒)
unlock="0"
#Customizable option end

改好脚本直接执行sh flytrap.sh就可以帮你加上规则。加入开机运行一次即可。
脚本还有提供了其他操作命令:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 列出收集到的坏蛋IP
sh flytrap.sh list
# 列出收集到的坏蛋IP(v6)
sh flytrap.sh list 6
# 手动添加坏蛋IP地址
sh flytrap.sh add xxxxx
# 手动删除坏蛋IP地址
sh flytrap.sh del xxxxx
# 删除所有坏蛋IP地址
sh flytrap.sh delall
# 清空flytrap相关的iptables规则和所有IP地址集合
sh flytrap.sh clean

如果需要修改端口trap_ports,修改完了直接执行即可,会自动清除旧规则。
如果要指定端口范围可以用冒号,比如trap_ports="1:1024,3306,3389"
如果需要修改接口名wan_name,修改前可以执行sh flytrap.sh clean清除相关接口的规则。
建议设置一些unlock选项的时间,存太多旧数据意义不大。
脚本仅需依赖ipset和iptables命令。一些系统可能自带的防火墙命令是nft,由于nft并不像iptables那样有默认的表,可以根据提供的脚本和思路,按需修改。

注意事项

一些远程rdp客户端似乎会默认主动尝试3389端口导致把自己锁外面了,如果你有用到rdp的话,建议3389不要加到里面,rdp使用较高位端口,比如12388,并且把相邻的端口加入到陷阱(比如12387和12389)。