配置 Telegram 访问通知
PortGuard Server 可以在有效 SPA 敲门成功写入防火墙规则后发送 Telegram 通知。通知内容包括服务器 hostname、允许访问的来源 IP、数据包来源 IP、SPA 用户名、申请开放的端口、开放时间、过期时间和超时时长。
1. 创建 Telegram Bot
- 在 Telegram 中打开 @BotFather。
- 发送
/newbot,按照提示创建机器人。 - 保存 BotFather 返回的 Bot Token,格式类似
123456789:AAExampleToken。
Bot Token 相当于机器人密码。不要把它提交到代码仓库、发送到客服消息中, 也不要在截图里暴露它。
2. 获取 Chat ID
如果发送到私聊,请打开刚创建的机器人,点击 Start,然后给它发送一条消息。 如果发送到群组,请把机器人加入群组,再发送一条机器人能够收到的消息或命令。
在服务器上读取 Bot Token,避免把真实 Token 保存在 Shell 历史中:
read -rsp 'Telegram Bot Token: ' TG_TOKEN; echo
获取机器人最近收到的更新:
curl --config - <<EOF
silent
show-error
fail
url = "https://api.telegram.org/bot${TG_TOKEN}/getUpdates"
EOF
unset TG_TOKEN
在返回的 JSON 中查找 message.chat.id。私聊 Chat ID 通常是正整数,群组
Chat ID 通常是负整数,超级群组的 ID 通常以 -100 开头。
如果 result 为空,请重新给机器人发送一条消息后再次查询。发送到频道时,
也可以填写 @channel_username,但必须先把机器人添加为频道管理员并授予发消息权限。
3. 通过 PortGuard 控制台配置
使用 root 权限打开防火墙 管理控制台:
sudo portguard-fwknopd --fw-console
选择 5. Configure Telegram notifications,然后依次填写:
- Bot token: BotFather 返回的 Token。
- Chat ID: 私聊或群组的数字 ID,也可以是
@channel_username。 - Minimum notification interval: 填写
0表示每次成功敲门都推送; 填写更大的数字表示在该秒数内抑制后续通知。
确认保存,并在询问是否发送测试通知时选择 y。控制台会把配置写入
/etc/fwknop/fwknopd.conf,保持文件权限为 600,然后重新加载正在运行的服务。
4. 手工配置
也可以直接在 /etc/fwknop/fwknopd.conf 中添加:
PORTGUARD_TG_BOT_TOKEN 123456789:replace_with_bot_token;
PORTGUARD_TG_CHAT_ID -1001234567890;
PORTGUARD_TG_NOTIFY_INTERVAL 0;
Bot Token 和 Chat ID 必须同时配置。手工修改后检查文件权限、验证配置并重启服务:
sudo chmod 600 /etc/fwknop/fwknopd.conf
sudo portguard-fwknopd --exit-parse-config \
-c /etc/fwknop/fwknopd.conf \
-a /etc/fwknop/access.conf
sudo systemctl restart fwknopd
5. 验证通知
从 PortGuard Client 发送有效 SPA 敲门时,可以实时查看服务日志:
sudo journalctl -u fwknopd -f
只有 SPA 数据包验证通过并成功写入防火墙规则后,服务端才会发送通知。如果同一条 临时规则仍然有效,重复敲门可能不会再次创建规则。测试时可以等待旧规则过期后再敲门。
如果控制台测试失败,或者敲门成功后没有收到通知,请检查:
- 服务器能够解析
api.telegram.org并访问外网 HTTPS。 - 私聊中已经点击 Start,或者机器人拥有向目标群组、频道发消息的权限。
- Chat ID 来自使用当前 Bot Token 查询到的同一会话。
PORTGUARD_TG_NOTIFY_INTERVAL没有抑制本次通知。- 手工修改配置后已经重新加载或重启
fwknopd。
6. 禁用通知
再次进入控制台并选择选项 5,在 Bot Token 处输入 disable 后确认。PortGuard
会删除三个 Telegram 配置项,并重新加载服务。