b站链接(只录了配置http方式的步骤):【使用frp实现在家外访问HomeAssistant】
目录
〇、物品清单
1、一台公网服务器
我使用的是阿里云99计划的服务器,该活动2026年3月31日前有效(每年可以99元价格续费一年,刚刚购买即可进行续费)。
或者不准备公网服务器,使用公共的frp服务,如果选择此方法,请使用所选frp网站的教程进行搭建,本教程可能不适用。
2、frp软件
首先从github上下载frp,链接https://github.com/fatedier/frp/releases
根据自己的操作系统+系统架构选择合适的版本,在linux上,使用“uname -m”命令可以查看自己的系统架构,例如我的阿里云服务器(Alibaba Cloud Linux)运行结果是x86_64,那么我需要下载含linux_amd64字样的包;我的树莓派(Debian 12)运行结果是aarch64,那么我需要下载含linux_arm64字样的包。
一、基础配置
我这里有两种部署方式可选择,一种是使用tcp的方式进行连接,一种是使用http的方式进行连接。
使用tcp方式进行连接的好处是配置、维护起来比较简单,因为server端口是公共的,客户端的配置可以共存在一个配置文件里,这样有什么变动的话维护一个就好。
使用http方式进行连接的好处是可以便捷地设置公网用户访问口令,也就是说想访问Home Assistant登录页首先要过一次frp的认证,个人认为安全性较高,因此我实际采用的此方式。其实http方式本来也可以所有服务写在同一个配置文件里,但是这样的话需要靠不同的url对服务进行区分了,用户访问这些url时需要配置hosts,而手机并不能方便地配置hosts,如果想要使用IP+端口的形式访问的话,意味着同一个server端口只能容纳一个使用公网ip作为url的服务,这样的话想要暴露多个服务,就要配置多个服务端配置文件、多个客户端配置文件了,因此我说它不方便,实际上暴露的服务数量少、变动不频繁的话不方便的这一点可以忽略不计。
frp官方文档链接https://gofrp.org/zh-cn/docs/
将下载好的frp压缩包上传到对应的设备上,解压压缩包,并将生成的文件夹名称命名为frp(为了之后设置路径时方便)。命令举例如下
tar -xzvf frp_0.58.0_linux_amd64.tar.gz
mv frp_0.58.0_linux_amd64 frp
进入frp目录,里面有frps、frps.toml、frpc、frpc.toml,其中,公网服务器上需要配置frps.toml、运行frps;内网服务器上需要配置frpc.toml、运行frpc。
1、tcp方式
(一)公网服务器配置
编辑frps.toml,示例内容如下
# 客户端连接端口,自由配置
bindPort = 7000
# 秘钥,使得客户端需配置相同参数才可连接到公网服务器,防止被滥用,可不设置
auth.token = "12345678"
# 允许客户端绑定的远程端口,同样为了防止服务被滥用,可不设置
allowPorts = [
{ single = 8123 }
]
其中,bindPort和allowPorts所列出的端口需要在公网服务器的防火墙/安全组策略中开放,这样访问者和客户端才能连接到服务端。
在frp文件夹内使用如下命令临时运行server端
./frps -c frps.toml
(二)内网服务器配置
编辑frpc.toml, 示例内容如下
# 公网服务器ip
serverAddr = "x.x.x.x"
# server端的bindPort
serverPort = 7000
# 需要跟服务器秘钥一样,才可以连接至服务器
auth.token = "12345678"
[[proxies]]
name = "Home Assistant"
type = "tcp"
# 被代理的本地服务端口
localPort = 8123
# 映射到公网服务器哪个端口,需要在server端allowPorts范围内
remotePort = 8123
在frp文件夹内使用如下命令临时运行client端
./frpc -c frpc.toml
(三)访问者访问
在公网服务器frps、内网服务器frpc都在运行的情况下,访问公网服务器ip:端口即可, 例如192.168.1.1:8123
2、http方式(推荐)
(一)公网服务器配置
在frp文件夹下新建frps_HASS.toml,输入下方内容
# 客户端连接端口,自由配置
bindPort = 7000
# 访问者访问的端口,自由配置
vhostHTTPPort = 8123
# 秘钥,使得客户端需配置相同参数才可连接到公网服务器,防止被滥用,可不设置
auth.token = "12345678"
其中,bindPort和vhostHTTPPort所列出的端口需要在公网服务器的防火墙/安全组策略中开放,这样访问者和客户端才能连接到服务端。
在frp文件夹内使用如下命令临时运行server端
./frps -c frps_HASS.toml
(二)内网服务器配置
在frp文件夹下新建frpc_HASS.toml,输入下方内容
# 公网服务器ip
serverAddr = "x.x.x.x"
# server端的bindPort
serverPort = 7000
# 需要跟服务器秘钥一样,才可以连接至服务器
auth.token = "12345678"
[[proxies]]
name = "HomeAssistant"
type = "http"
# localIP不设置默认为127.0.0.1
# 被代理的本地服务端口
localPort = 8123
# 自定义域名,设置为公网服务器ip,这样访问者就不用配置hosts了
customdomains = ["x.x.x.x"]
# 访问者访问服务时需要输入的用户名密码,可不设置
httpUser = "admin"
httpPassword = "admin"
在frp文件夹内使用如下命令临时运行client端
./frpc -c frpc.toml
(三)Home Assistant配置
编辑configuration.yaml(或许在/usr/share/hassio/homeassistant下,或者使用Studio Code Server加载项进行配置),新增如下内容,然后重启HomeAssistant
http:
use_x_forwarded_for: true
trusted_proxies:
- 127.0.0.1
(四)访问者访问
在公网服务器frps、内网服务器frpc都在运行的情况下,访问公网服务器ip:端口即可, 例如192.168.1.1:8123,随后需要输入设置的访问者用户名密码才可访问目标网页。
二、 设置开机自启
本部分来自于frp文档https://gofrp.org/zh-cn/docs/setup/systemd/
以下内容为服务端配置,客户端配置类似,请读者自行完成。
首先在/etc/systemd/system目录下创建service文件,例如frps.service
sudo touch /etc/systemd/system/frps.service
编辑刚刚创建的frps.service文件,输入以下内容,并将其中路径等信息替换为自己实际的路径
[Unit]
# 服务名称,可自定义
Description = frp server
After = network.target syslog.target
Wants = network.target
[Service]
Type = simple
# 启动frps的命令,需修改为您的frps的安装路径
ExecStart = 你的frps路径 -c 你的.toml文件路径
[Install]
WantedBy = multi-user.target
执行以下命令设置开启自启动
sudo systemctl enable frps.service
执行以下命令开启服务
sudo systemctl start frps.service
重启、停止服务,只需要将上方命令的start替换为restart或stop即可。