Aug 3, 2023教程1850 words in 12 min


借助云主机,在外也能访问家中的Home Assistant

Home Assistant (HA),靠其强大的功能、可拓展性、和社区支持,得到了很多智能家居爱好者的青睐。而在内地复杂的宽带环境下,如何在局域网外访问HA成为最大的痛点之一。如果你正巧有自己的域名和云服务器,那么这篇指南可能是个不错的选择。

Updated on Aug. 23 —— 增加frpc服务连接失败自动重连配置

10秒速读:本文通过FRP在服务器端和客户端搭建通道,并通过Nginx反向代理来实现自定义域名访问家中的HA实例。

环境:Linux

需要准备:

  • 有公网IP的云服务器,并预装Linux系统;
  • 通过原生OS/Supervisor方式部署好的HA客户端(VM或者Docker可能会有未知问题)
  • 一些耐心

1.服务器端配置

1.1下载

FRP软件包包含两部分:服务器端的FRPS和客户端的FRPC,该软件包提供跨平台支持,所以需要确定你服务器的架构。使用下面的命令输出:

1
uname -m

在下面的链接(可能需要魔法访问)复制对应架构的最新版的链接:

Releases · fatedier/frp (github.com)

下面amd64为例

1
2
3
4
5
6
7
8
cd /home/
# 下载
wget https://github.com/fatedier/frp/releases/download/v0.51.2/frp_0.51.2_linux_amd64.tar.gz
# 创建文件夹解压
mkdir frp
tar -xzf frp_0.51.2_linux_amd64.tar.gz -C frp
# 进入目录
cd frp/frp_0.51.2_linux_amd64/

1.2配置FRPS

修改配置文件 frps.ini

1
sudo vim  frps.ini

文件内容:

1
2
3
4
[common]
bind_port = 7000
vhost_http_port = 9000
auto_token = 123456

vim文件编辑器内输入i进入编辑模式。

bind_port是需要绑定的服务器端口,vhost_http_port是你希望通过服务器访问的端口,需要提前确认这两个端口没有被占用

1
2
# 查询端口占用
netstat -ntlp

auto_token是用来认证的密钥,可以自定义

配置完成后,按ESC退出编辑模式,输入:w并按回车,紧接着输入:q并按回车保存退出

1.3配置开机自启

创建一个服务,便于管理并随开机自动运行

1
2
3
4
sudo cp frps /usr/local/bin/frps
sudo mkdir /etc/frp/
sudo cp frps.ini /etc/frp/frps.ini
sudo vim /etc/systemd/system/frps.service

创建服务配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
# 服务名称,可自定义
Description = frp server
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
# 启动frps的命令,需修改为您的frps的安装路径
ExecStart=/usr/local/bin/frps -c /etc/frp/frps.ini

[Install]
WantedBy = multi-user.target

编辑和保存命令同上

开启服务,并配置开机启动

1
2
systemctl start frps
systemctl enable frps

查看是否运行成功

1
systemctl status frps

云服务器一般有安全管理,需要去控制台开放端口,示例里为70009000这两个端口。如果你希望通过Nginx反向代理,那么只开放7000就可以了。

2.客户端配置

2.1 下载

同样的,我们需要下载frp,并配置frpc的部分运行,请注意与第一部的命令区分

1
uname -m

在下面的链接(可能需要魔法访问)复制对应架构的最新版的链接:

Releases · fatedier/frp (github.com)

下面arm为例

1
2
3
4
5
6
7
8
cd /home/
# 下载
wget https://github.com/fatedier/frp/releases/download/v0.51.2/frp_0.51.2_linux_arm64.tar.gz
# 创建文件夹解压
mkdir frp
tar -xzf frp_0.51.2_linux_arm64.tar.gz -C frp
# 进入目录
cd frp/frp_0.51.2_linux_arm64/

2.2 配置FRPC

修改frpc的配置文件

1
sudo vim frpc.ini

文件内配置,需要注意,和bind_port要一致,auto_token也一样。

local_ip为设备的内网IP,如192.168.0.122

local_port是HA内网访问的端口号,默认为8123

remote_port为服务器端要访问的端口号,和vhost_http_port保持一致

⚠️login_fail_exit = false 这里非常重要,否则中途网络出现问题,frpc服务会自动终止,不能尝试自动重连!

1
2
3
4
5
6
7
8
9
10
11
12
[common]
tls_enable = true
server_addr = 云服务器IP
server_port = 7000
auto_token = 123456
login_fail_exit = false

[VNC1]
type = http
local_ip = 192.168.0.122
local_port = 8123
remote_port = 9000

2.3配置开机自启

创建服务,便于管理并随开机自动运行

1
2
3
4
sudo cp frpc /usr/local/bin/frpc
sudo mkdir /etc/frp/
sudo cp frpc.ini /etc/frp/frpc.ini
sudo vim /etc/systemd/system/frpc.service

创建frpc.service文件

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
# 服务名称,可自定义
Description = frp server
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
# 启动frpc的命令,需修改为您的frpc的安装路径
ExecStart=/usr/local/bin/frpc -c /etc/frp/frpc.ini

[Install]
WantedBy = multi-user.target

开启服务,并配置开机启动

1
2
systemctl start frpc
systemctl enable frpc

查看是否运行成功

1
systemctl status frpc

3.配置HA

此时通过云服务器+9000端口就能打开页面了,如果显示400错误,不用担心,是因为HA有额外的安全设置,需要把代理地址加入白名单才能正常在局域网外访问。

首先通过插件市场安装File editor用来编辑/config/configuration.yaml配置文件

在结尾添加配置:

1
2
3
4
5
6
7
8
http:
base_url: https://your url #外网域名或IP
cors_allowed_origins: https:///your url #外网域名或IP
use_x_forwarded_for: true
trusted_proxies:
- 47.103.129.118 #外网IP
- 10.0.0.106 #内网IP
- 172.18.0.1 #本机地址

进入设置,验证configuration.yaml是否能通过,如果不能通过,请仔细检查格式,如果能通过,选择完全重启HA。

重启后,通过云服务器的域名/IP+端口应该可以直接访问。

如果不需要自定义域名来访问,那么本教程已经到此结束,休息一下来杯可乐奖励自己!

4.Nginx反向代理

这部分将带你为HA转发的服务套一层域名“马甲”。需要使用的软件为Nginx Proxy Manager,安装教程可以参考我之前发的这篇:

Nginx Proxy Manager——小而美的多容器转发方案 - 白桦 Birch (wardzhou.art)

首先在域名提供商进行解析,创建新的A记录指向你设置的公网IP。这里使用二级域名或者顶级域名都是可以的。

然后登陆Nginx Proxy Manager的Dashboard,创建新的Proxy,填写内网的IP,这里的获取方式在上述链接中有所提及。

Domin Names填写刚刚设置的外网地址,选择http,然后切换到ssl选项,申请https证书,稍等证书下发后勾选需要的选项保存。

此时就可以通过你设置的域名登陆HA啦!

如果你使用HA的官方APP的话,建议去设置一下外部访问的网址,并把内网的IP与家里的Wi-Fi名绑定,这样就能自动切换,在家访问更快。

此时vhost_http_port这个端口已经不再需要了,可以去云服务器的安全组关掉。不需要的端口关掉更为安全。

参考

  1. 树莓派+阿里云+frp 实现内网穿透 - brilliant_999 - 博客园 (cnblogs.com)
  2. Nginx Proxy Manager——小而美的多容器转发方案 - 白桦 Birch (wardzhou.art)
  3. Home assistant (400 Bad Request) Docker + Proxy - Solution - Configuration - Home Assistant Community (home-assistant.io)
  4. 第一次链接服务器若网络不可用,则frpc会直接退出。 · Issue #2605 · fatedier/frp · GitHub
  • Author:

    Ward

  • Copyright:

    Attribution-NonCommercial-NoDerivatives 4.0 International(CC BY-NC-ND 4.0)

  • Updated:

    January 25, 2024

Buy me snacks 🍩.