星路

追寻那一缕星光,在漆黑夜晚前行

0%

智能音箱接入Home Assistant内网穿透frp相关配置

家庭没有公网IP场景想将智能音箱接入Home Assistant需要进行内网穿透,不少朋友反馈尝试采用frp穿透访问会遇上问题,这里提供一些frp配置案例希望有所帮助。


1. 环境

  • 公网IP服务器(IP:6.6.6.6)
  • 本地服务器(IP:192.168.1.100)
  • 域名(havcs.ljr.im)
  • 期待效果:访问https://havcs.ljr.im:8443,相当于穿透访问http://192.168.1.100:8123
  • 准备,网上教程很多不详细赘述
    1. 域名供应商将添加havcs.ljr.im解析到6.6.6.6的A记录
    2. 准备域名ssl证书
    3. 公网IP服务器安装frp服务端
    4. 本地安装frp客户端(可安装在192.168.1.100上)
    5. 本地服务器安装Nginx(可选,监听端口443)和Home Assistant(监听端口8123)

配置信息

后面涉及的域名、IP、端口号等配置请根据实际情况自行调整。


2. 方案一 frp做反向代理服务器

该方案由frp提供https服务,但这种情况下frp无法正常处理wss导致外网是无法正常登陆HA,但不影响接口访问。
访问路径:音箱平台 -> 6.6.6.6:8443 -> 家庭路由器 -> [https] frp客户端 [http] -> 192.168.1.100:8123(HA)

2.1. frp服务器配置

1
2
3
4
5
6
7
8
9
10
; frps.ini
[common]
; frp服务端口
bind_port = 6666
; https服务端口,自己调整,设置为443可省略端口号
vhost_https_port = 8443
; 认证令牌,自己设置
token = set_your_token
; 强制链接启用tls
tls_only = true

2.2. frp客户端配置

PS:这里配置为frp客户端和HA不在同一台服务器,如有差异按配置说明调整。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
; frpc.ini
[common]
; frp服务器域名/IP
server_addr = havcs.ljr.im
; frp服务器端口,与frps.ini设置一致
server_port = 6666
; 链接启用tls
tls_enable = true
; 认证令牌,与frps.ini设置一致
token = set_your_token

[method_https]
type = https
; 修改为自己的域名
custom_domains = havcs.ljr.im

; 启用https
plugin = https2http
; 反代目标,HA的IP及端口,如果frp客户端运行在HA同一台机子上,则改为127.0.0.1:8123
plugin_local_addr = 192.168.1.100:8123
; 证书/密钥路径,建议使用绝对路径,相对路径是根据frpc进程目录判断
plugin_crt_path = /etc/frp/havcs.ljr.im/crt.crt
plugin_key_path = /etc/frp/havcs.ljr.im/key.key

plugin_host_header_rewrite = 127.0.0.1
plugin_header_X-From-Where = proxy


3. 方案二 frp中转tcp

该方案frp只中转tcp包,支持外网登陆访问HA,相应的https服务要由本地服务提供,有2种方案:可以中转至Nginx服务器,Nginx服务器再反代HA;或者直接中转给HA,HA需要配置启用https。考虑本地访问便利,建议使用Nginx,这里也只介绍该方案配置。如使用后一方案,参考HA官网配置教程设置
访问路径:音箱平台 -> 6.6.6.6:8443 -> 家庭路由器 -> frp客户端 -> [https] 192.168.1.100:443(Nginx) [http] -> 192.168.1.100:8123(HA)

3.1. frp服务器配置

1
2
3
4
5
6
7
8
; frps.ini
[common]
; frp服务端口
bind_port = 6666
; 认证令牌,自己设置
token = set_your_token
; 强制链接启用tls
tls_only = true

3.2. frp客户端配置

PS:这里配置为frp客户端和Nginx不部署在同一台服务器,Nginx和HA部署在同一台服务器,如有差异按配置说明调整。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
; frpc.ini
[common]
; frp服务器域名/IP
server_addr = havcs.ljr.im
; frp服务器端口,与frps.ini设置一致
server_port = 6666
; 链接启用tls
tls_enable = true
; 认证令牌,与frps.ini设置一致
token = 123456

[method_tcp]
type = tcp
; Nginx服务器IP及端口,如果frp客户端和Nginx部署在统一服务器,ip修改为127.0.0.1;如果HA启用https,则配置为HA服务器IP和端口即可
local_ip = 192.168.1.100
local_port = 443
; 外网使用域名+该端口访问
remote_port = 8443

3.3. Nginx配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# /etc/nginx/config.d/hass.conf

# 如果/etc/nginx/nginx.conf中已设置则忽略该配置项
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}

server {
# Update this line to be your domain
server_name havcs.ljr.im;
# 监听端口,与frp.ini对应
listen 443 ssl;

# Ensure these lines point to your SSL certificate and key
# 自行准备好证书,修改相应的证书地址
ssl_certificate /etc/nginx/ssl/havcs.ljr.im/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/havcs.ljr.im/privkey.pem;
# Use these lines instead if you created a self-signed certificate
# ssl_certificate /etc/nginx/ssl/cert.pem;
# ssl_certificate_key /etc/nginx/ssl/key.pem;

# Ensure this line points to your dhparams file
# dh2048.pem文件为使用命令生成,查看Nginx安装教程
ssl_dhparam /etc/nginx/ssl/dh2048.pem;

# These shouldn't need to be changed
# listen [::]:443 ssl default_server ipv6only=off; # if your nginx version is >= 1.9.5 you can also add the "http2" flag here
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";
# ssl on; # Uncomment if you are using nginx < 1.15.0
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;

proxy_buffering off;

location / {
# HA服务器IP及端口,此处HA与Nginx在同一台服务器上所以IP为127.0.0.1
proxy_pass http://127.0.0.1:8123;
proxy_set_header Host $host;
proxy_redirect http:// https://;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}

4. 测试

  • HA安装好插件后,访问https://havcs.ljr.im:8443/havcs/auth/token页面,如有颜文字的404提示,则代表穿透成功。同时检查浏览器是否有提示不安全链接,如果有说明证书不匹配或者过期,也会导致无法完成音箱云平台的授权步骤的!