利用树莓派的公网 IPv6 优势,绕过任何第三方云平台,实现手机与家庭 IoT 设备的高速直连通知。
一、 基础环境:IPv6 与 域名映射
-
获取 IPv6:确保树莓派通过
ip -6 addr能看到240e/2408/2409开头的全球单播地址。 -
DDNS 自动化:使用
ddns-go或脚本,将你的域名(如pi.example.com)实时解析至该 IPv6。 -
防火墙放行:在路由器(或 OpenWrt)的 IPv6 流量规则中,开放树莓派的
80或8080端口。
二、 部署 ntfy 服务(Debian 原生)
不使用 Docker,减少资源开销,直接在 Pi OS 上运行:
[Bash]{ngcontent-ng-c2411640571=""}
# 添加官方源并安装
sudo curl -L -o /etc/apt/keyrings/archive.ntfy.sh.gpg https://ntfy.sh/static/pubkey.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/archive.ntfy.sh.gpg] https://archive.ntfy.sh/debian all main" \
| sudo tee /etc/apt/sources.list.d/ntfy.list
sudo apt update && sudo apt install ntfy
# 修改关键配置
sudo nano /etc/ntfy/server.yml
配置核心项:
-
base-url:https://pi.example.com(你的 DDNS 域名) -
listen-http::8080 -
auth-file:"/var/lib/ntfy/user.db"(必须开启,否则全网皆可推送) -
auth-default-access:"deny-all"
管理命令:
[Bash]{ngcontent-ng-c2411640571=""}
sudo ntfy user add --role=admin myuser # 创建用户
sudo systemctl enable ntfy
sudo systemctl restart ntfy
```text
### 三、 手机端配置与互动 {#三-手机端配置与互动 path-to-node="14"}
1. **App 设置**:在手机端 ntfy 设置中,将"默认服务器"改为`https://pi.example.com`{index-in-node="32" path-to-node="15,0,0"}。
2. **身份验证**:在 App 订阅主题时填入`myuser`{index-in-node="19" path-to-node="15,1,0"}的账号密码。
3. **订阅主题**:订阅例如`home_security`{index-in-node="10" path-to-node="15,2,0"}。
### {#section path-to-node="17"}
### 四、 自动化告警脚本实例 {#四-自动化告警脚本实例 path-to-node="17"}
#### 1. SSH 登录即时提醒 {#ssh-登录即时提醒 path-to-node="18"}
将以下代码加入`/etc/pam.d/sshd`{index-in-node="8" path-to-node="19"}或`.bashrc`{index-in-node="26" path-to-node="19"},实现物理隔离的登录报警:
[Bash]{ngcontent-ng-c2411640571=""}
简单的 curl 发送
curl -u "myuser:password" \ -H "Title: SSH 登录警告" \ -H "Priority: high" \ -H "Tags: warning" \ -d "用户 $USER 从 $PAM_RHOST 登录了树莓派" \ https://pi.example.com/home_security
#### 2. IoT 设备状态监控(Python 示例) {#iot-设备状态监控python-示例 path-to-node="21"}
监控局域网内 IoT 设备(如摄像头)存活状态:
[Python]{ngcontent-ng-c2411640571=""}
```python
import os
import requests
def check_device(ip):
response = os.system(f"ping -c 1 {ip} > /dev/null")
if response != 0:
requests.post("https://pi.example.com/home_security",
data=f"设备 {ip} 掉线!",
auth=('myuser', 'password'),
headers={"Title": "IoT 离线", "Priority": "4"})
check_device("192.168.1.50")
五、 进阶:HTTPS 证书自动管理
为了安全,建议安装Caddy作为反向代理,它会自动处理 IPv6 的 SSL 证书:
[代码段]{ngcontent-ng-c2411640571=""}
# /etc/caddy/Caddyfile
pi.example.com {
reverse_proxy localhost:8080
}