本帖最后由 icase 于 2020-7-9 13:14 编辑
目标人群
和我一样的小白,大佬可以绕过。
实现目的
由于摄像头官方提供的app没有网络使用限制,消息推送更及时,可以轻松操控摄像头等原因。最终兼顾隐私保护和摄像头使用便利性的考虑,来实现此自动化方案。
实现逻辑
需要断开外网权限时,远程(或局域网内跨设备)为路由添加 iptables drop 规则,阻断摄像头互联网访问;
需要给予外网权限时,远程(或局域网内跨设备)删除此前添加的iptables drop 规则,开放摄像头互联网访问;
结合脚本来实时或者远程(或局域网内跨设备)定时检查 iptables 规则列表,判断规则是否存在,结合 Home Assistant 的自定义开关 state 的要求,利用 exit code 返回值来为开关提供状态反馈。
用到的工具
puttygen / XShell
准备工作
以下以华硕路由梅林固件为例
-
为路由开启 ssh 密钥访问 权限,由于此部分会占用太多内容,具体的操作步骤可以参考这里。
-
编写iptables规则脚本
-
为路由添加iptables规则的脚本,如脚本名称为:add-iptables.sh ,脚本内容如下:
#!/bin/bash
iptables --list | grep -q $E0:3F:7C:54:C0:4F # 你的摄像头的mac地址,下同
if [ $? -ne 0 ] ;then
iptables -I FORWARD -m mac --mac-source E0:3F:7C:54:C0:4F -j DROP
echo "iptables rule added successfully!"
exit 0
else
echo "iptables rule is already exists"
exit 1
fi
-
为路由删除iptables规则的脚本,如脚本名称为:del-iptables.sh ,脚本内容如下:
#!/bin/bash
iptables --list | grep -q $E0:3F:7C:54:C0:4F
if [ $? -ne 0 ] ;then
echo "iptables rule not found"
exit 1
else
iptables -D FORWARD -m mac --mac-source E0:3F:7C:54:C0:4F -j DROP
echo "iptables rule deleted successfully!"
exit 0
fi
-
检查上述添加的iptables规则是否存在,如脚本名称为:status-iptables.sh ,脚本内容如下:
#!/bin/bash
iptables --list | grep -q $E0:3F:7C:54:C0:4F
if [ $? -ne 0 ] ;then
echo "off"
exit 1
else
echo "on"
exit 0
fi
-
将当前路由iptables规则备份,如脚本名称为:save-iptables.sh ,脚本内容如下:
#!/bin/bash
iptables-save >/jffs/scripts/iptables-script # 替换为你选择的保存路径
echo "iptables-script has saved in '/jffs/scripts/iptables-script'."
(上面的代码中的 /jffs 前面的内容其实是个 > ,不知道为什么论坛没解析出来。)
-
由于以上命令都是临时添加的 iptables 规则,有可能路由重启之后就会自动被清除,所以我们可以借助上一步中备份的规则文件,即:iptables-script 文件来进行路由重启后的自动恢复。在 jffs/scripts 目录编辑 wan-start 文件新添加一行 /usr/sbin/iptables-restore /jffs/scripts/iptables-script 保存即可。
请注意:此处仅供参考,因为不同路由或固件可编辑使用的启动脚本不尽相同,如果你的路由是不同固件,可在网上搜寻哪些启动脚本可正常使用,也或者回复帖子我们共同探讨。
小提示:你也可以使用 Automation 自动化来设置个定时任务。如每5分钟检查你的前置条件状态,如果符合,但外网权限和你的设置不一致,那就自动执行动作将其打开或关闭即可(如果看到这里没有理解,可看完全部内容后再回头来看这段文字)。
-
注意事项:
这些脚本存放在路由端,当你准备完所有脚本文件后,一定确定好存放路径,有一些路径存放文件会在路由重启后全部清空,比如华硕路由把文件存在jffs内是不会出现这样的情况的,而在home或者tmp内则会被重启清空。另外,所有的脚本文件都需要赋予可执行权限,如:chmod +x add-iptables.sh
修改 Home Assistant 配置
-
路由密钥导入
在你的config文件夹内新建一个如名字为 ssh_keys 的文件夹,将你生成的私钥文件复制到该文件夹内,如私钥文件名为:router
-
打开 configuration.yaml 文件
添加 Command line Switch 开关配置(官方文档),内容如下:
- platform: command_line
switches:
camera_only_lan:
command_on: ssh -i /config/ssh_keys/router -o StrictHostKeyChecking=no -p 2222 mailto:[email protected] '/jffs/scripts/add-iptables.sh && /jffs/scripts/iptables-save.sh'
command_off: ssh -i /config/ssh_keys/router -o StrictHostKeyChecking=no -p 2222 mailto:[email protected] '/jffs/scripts/del-iptables.sh && /jffs/scripts/iptables-save.sh'
command_state: ssh -i /config/ssh_keys/router -o StrictHostKeyChecking=no -p 2222 mailto:[email protected] '/jffs/scripts/iptables-status.sh'
friendly_name: 摄像头外网隔离
说明:其中 -p 2222 数字为你修改过的 ssh 端口号,如果没有修改过,即默认为22 ,将此参数整个删掉即可;192.168.100.1 是你的路由IP;/jffs/scripts/ 是你脚本放置的路径位置。
-
重启 HA
-
配合 Automation 实现自动化开关摄像头外网权限
这里本想写的详细点,但我觉得可能每个人的需求场景都不一样,所以大家可以自行发挥。比如你可以设定当人全部离开家的时候,摄像头自动开启外网权限;有人到家时,自动关闭外网权限。请注意,因为在前端这是一个开关的形式,所以开关的逻辑应该是在”开“的时候是关闭外网权限,在”关“的时候是打开外网权限。
|