1.写在前面
OK,OK。时隔两个月我也是回来了,为什么这两个月我没动静?因为玩电脑给我玩爽了。
好,回归正题。让我们想象这样一个场景:
你很在乎你服务器的安全,所以设置了很长的SSH密码或者有TOTP登录之类的。
不仅如此,还有极为严格的Fail2ban配置,错一次就会被封永久。
安全是好事,可是,有一天,不知道是键盘问题还是你手抽了,输错了密码或TOTP。
这就导致你必须去浏览器登录服务器的控制台给自己解封。
好吧好吧,结果解封之后,你又因为不知道什么原因,密码又错了。
天哪,你人都要红温了,有没有什么办法让服务器认出自己且不受影响呢?
Fail2ban的白名单?确实可行,前提是你要有固定的公网IP。不然三天两头的换IP还不如自己去控制台解封呢。
VPN?也是一个办法,但是如果你的服务器在海外,搞这种东西,万一被GFW搞了可得不偿失。
那还有什么办法吗?当然有!我让GPT写了一个小脚本,可以让你在Telegram上便利的解封你的IP。
2.使用
首先,先去telegram那里搞一个bot,网上有教程,这里不再赘述。
配置python的虚拟环境
python3 -m venv <虚拟环境名称>
source <虚拟环境名称>/bin/activate
这里我给个示例:
python3 -m venv myenv
source myenv/bin/activate
这么做,shell会进入到虚拟环境,就可以使用pip安装telegram的bot库
pip install python-telegram-bot
然后,打开脚本,前面有几个基本参数,需要你自己修改。
API_TOKEN = '123456' #你的机器人密钥
TOTP_SECRET = '123456' # 替换为你的 TOTP 密钥
# 设置允许操作的用户ID列表(可以是一个或多个ID)
AUTHORIZED_USER_IDS = [123456] # 替换为你的用户ID
这个TOTP是对于我的一个小功能,因为我的服务器靠TOTP登录。没有这方面需求的可以忽略,随便给几个字符。 用户ID是判断和机器人对话的是不是你本人,可以用https://t.me/userinfobot这个机器人查询自己的ID。 改好后,可以使用supervisor挂着,这里我也再写一下方法:
sudo apt install supervisor
不好意思我用的是Debian,RHEL系的朋友们要自己打了。 来到/etc/supervisor/conf.d这个目录,随便创建一个后缀名是.conf的文件
[program:telegram_bot]
command=<虚拟环境的路径>/bin/python3 <脚本路径>
directory=<脚本所在目录>
autostart=true
autorestart=true
stderr_logfile=/var/log/telegram_bot.err.log
stdout_logfile=/var/log/telegram_bot.out.log
user=root #运行脚本使用的用户,
然后重启一下supervisor
sudo systemctl restart supervisor
如果成功运行,给机器人发送/test,那么就会回应。
3.命令使用
脚本目前有以下命令: ban – 在特定的 jail 中封禁 IP。 unban – 在特定的 jail 中解封 IP。 list – 列出所有 jail 或者指定 jail 的状态。 test – 检查指定服务器是否在线。 update – 热更新系统的 jail 列表,并返回更新详情。 checkban – 查询IP是否被封禁以及所在的 jail。 uuid – 生成一个或多个 UUID。 totp – 获取当前的 TOTP、剩余时间和下一个 TOTP。 help – 显示帮助信息。
先说一下ban和unban
/ban <jail> <IP1>,<IP2>
示例:
/ban sshd 192.168.3.3,192.168.4.5
/unban sshd 192.168.4.3
/ban sshd 192.168.8.[5-9]
这是第一种,会封禁192.168.8.5到192.168.8.9的IP。 允许同时多个使用,比如[192-194].[168-170].5.9,代表: 192.168.5.9 192.169.5.9 192.170.5.9 193.168.5.9 193.169.5.9 193.170.5.9 194.168.5.9 194.169.5.9 194.170.5.9 第二种:
/ban sshd <192.168.10.2~192.168.10.50>
这个稍微直观一些,可以跨网段使用 这两个表达式都可以在ban和unban使用,尽管如此,还是不建议在ban使用大规模的范围表达式。 听GPT说Fail2ban使用SQLite存储IP,一下子处理这么多,SQLite八成受不了,就会卡。不过unban倒是没什么问题,挺快的。 还有一种特殊的定义字符,$all,代表全局。
/ban $all 192.168.5.3
意思为在所有jail里封禁192.168.5.3。
/unban sshd $all
解封sshd里的所有IP
/unban $all $all
解封所有jail里的所有IP 我相信你不会给jail的名字改为$all的
list命令:
/list
其实很简单,不带参数就返回所有的jail。参数是jail名,它不会直接返回,黑名单IP多一点就返回不了。所以是打包为txt后发送给你。 我也相信你服务器黑名单里的IP在一个文件内的大小不会超过2GB。
checkban命令:
/checkban <IP1>,<IP2>
查询一个IP有没有在你服务器里的黑名单,如果有,就显示在哪个jail里面。
UUID命令:
/uuid
这也算是一个小功能,参数是一个正整数,就会给你返回多少个的UUID。
update命令:
/update
所有jail在脚本运行时就会记录在常量里,这个命令是给在运行时添加或删除了jail的情况下更新用的。
4.最后
没错,基本就这么多了。
脚本前身其实是有一个通过电子邮件来解封的,但是GPT太废物了搞不出来。
暂时先这么多吧,以后的等我开学再搞。
(我还要军训14天,操!)