利用Frp+Nginx将http转化为https
Home Assistant一般安装好之后都是需要通过公网来访问使用的,而Home Assistant的Web端默认只提供http访问,肯定不如https让人放心,这里一般就是用反向代理来实现了。
方案选定
我是使用frp将本地Home Assistant的Web端口(默认8123),映射到公网主机的8080端口。之前一直是裸奔的http,但是毕竟不安全,需要升级一下。有以下几个方案备选
- frp本身支持将http流量转化为https。但是我觉得有些麻烦,因为证书需要在本地frpc设置好。但是我的证书每个月定时在服务器上更新(acme.sh定时任务)。
- Home Assistant通过NGINX Home Assistant SSL proxy这个Adds-on,可以在本地实现反向代理。因为我的本地客户端没有公网IP,若配置证书只能用远程服务器的域名和证书,原因同上,维护起来太麻烦。
- frp将流量转发到公网主机的8081端口,再由公网主机上的Nginx反向代理8081端口,并监听8082端口提供https服务。因为我已经在公网主机的Nginx上配置过TLS证书的每月自动更新,这个方法可以让我免维护。
综上所述,我选择frp内网穿透+nginx反向代理的方式来完成https访问homeassistant的管理页面。示意图如下:
配置过程
前提条件:我远程服务器的域名是yangbo.party,已经按照之前的博文Xray配置Vless-Reality-Vision配置好Nginx和证书。
公网服务器配置
先配置frps的配置文件/etc/frp/frps.toml
1 | bindPort = 7000 |
其中frp的后台管理密码自行设定。
再配置Nginx的配置文件/etc/nginx/nginx.conf,因为之前已经配置好了,所以在之前的基础上加入新的server字段:
1 | server { |
全部配置好可以重启两个程序:systemctl restart nginx && systemctl restart frps && echo 'OK'
本地客户端配置
HomeAssistant会验证Host头,当127.0.0.1作为代理服务器时,Home Assistant默认不信任它提供的代理头信息,而我们利用Nginx做反向代理时就是监听127.0.0.1。同时暴露在公网也要防止别人暴力破解密码。所以Home Assistant需要修改一下配置,打开configuration.yaml,添加以下内容:
1 | http: |
修改后手动重启Home Assistant
本地frpc的配置文件/etc/frp/frpc.toml:
1 | serverAddr = "yangbo.party" |
这里启用了frp的自定义TLS协议加密,来保障内网穿透过程的信息安全。
配置好可以重启frpc程序:systemctl restart frpc && echo 'OK'
调试
如果一切顺利,这个时候浏览器访问https://yangbo.party:8082就可以访问内网的Home Assistant了。若不行,可以直接测试nginx监听的8082端口是否可以访问:curl -vk https://127.0.0.1:8082或检查frps转发的8081端口是否可以访问:curl -vk http://127.0.0.1:8081或者查看端口占用情况:ss -tulnp。
