我学过一段时间的网络,拿到过华为的网络证书,对于网络算是较为精通。因此对于有固定公网ip的用户,想要实现从外网访问内网中的电脑或者服务器,简直是易如反掌,只需要做下端口映射即可。而对于没有公网ip的,想内网穿透,以前的我还真是束手无策,直到遇到了frp。它的使用真是令人难以想象的简单。可能是我对内网穿透困惑了好久,一直没去着手了解这方面,从而觉得它应该挺难。大多数都有这个心理吧,对于不了解不熟悉的事物,往往会有点抗拒心理。记住,一回生二回熟,熟悉了,心理的这种抗拒心理,难受的心理便烟消云散,也就自然而然的会了。重要的是,要有那么一点点耐心,忍受一下前期的难受心理。
frp的原理是,就拿我的使用场景作为例子,云服务器运行服务端frps,树莓派运行客户端frpc。当我们想从外面访问homassistant时,直接访问云服务器的ip地址加端口号即可(绑定域名的话,可以用域名访问),云服务器会把访问转发给家里的homeasistant。
我的环境是,云服务器是腾讯云,homeassistant是树莓派安装了官方的系统hassos。
云服务器的话找便宜的买。我买的时候正值双十一,华为云,有很大优惠的云服务器得限时抢。阿里云,我没刻意的去找它的活动,顺手看了下腾讯云。腾讯云不用抢就有优惠,直接购买。服务器我选择了ubuntu,因为我曾经把ubuntu作为主力机用了三年,所以对它较为熟悉。令人惊喜的是用腾讯云的web登录云服务器的时候异常的流畅,比好几年前用华为云时的丝丝卡顿,真是给人意外的惊喜。这里无意对比,那是好几年前的华为云和现在的腾讯云对比。
homeassistant官方的系统hassos较为封闭,因为它意在让用户免去搭建homeassistant的繁琐,不用去理会复杂的linux系统,而是直接去使用homeassistant。即便frp是免安装的,在hassos上运行也令人头疼,因为必须要满足每次开机能够让frp自动运行。而我们平常用ssh工具登录的,其实是hassos的一个容器,每次关机这个容器都要被销毁,开机的时候再被重新建立。所以在这个容器手动安装运行的软件,一旦重启树莓派,便都没了。当然也可以获取hassos系统的超级权限,从而可以登陆到hassos系统中去,而不是容器中。但是因为hassos是精简过的,所以一时半会还摸不透它属于哪个派系,干脆放弃。
莫慌,有了下面的这三个条件让在hassos开机自动运行frp不是难事。1,放homeassistant配置文件的目录/config,重启是不会消失的。2,homeassistant有一个组件叫shell_command,利用它可以执行一些命令。3,frp是免安装的。
下面让我们一一展开来讲。
1,下载frp。下载地址是https://github.com/fatedier/frp/releases 当你打开这个链接的时候,可能版本更新了,用更加新的版本就是。
上图显示如此之多的版本,如何做出选择呢?我的客户端是树莓派,cpu架构是arm的,所以选择frp_0.34.3_linux_arm.tar.gz。我的服务器是ubuntu的是linux系统,通过uname -a命令可以看出,系统版本是64位的,所以选择frp_0.34.3_linux_amd64.tar.gz。
2,在树莓派上操作
把下载好的frp_0.34.3_linux_arm.tar.gz上传到/config这个目录。因为是hassos系统所以安装插件异常简单,可以使用Terminal&SSH插件打开命令行界面依次执行下面的命令
cd /config # 切换到config目录
tar xvf frp_0.34.3_linux_arm.tar.gz #把软件解压出来
mv frp_0.34.3_linux_arm waiwang #把刚刚解压的目录重新命名为waiwang,容易记住。
cd waiwang #切换到waiwang这个目录中。
ls #查看当前目录下的文件。
在树莓派上我们运行客户端,所以用到的软件是frpc, frpc.ini是运行frpc所需要的配置文件。只用到这个两个文件,其他的可以删除,以免受到影响。
在frpc.ini配置文件,改动添加如下内容。关于如何打开这个文件,可以用file edit这个插件,也可以用命令行nano frpc.ini
[common]
server_addr = 1.1.1.1 #改成你的云服务器的地址
server_port = 7000
token = password #为了安全这里设个密码,和云服务上的一致。
[web8123] #这里这个名字随便设,设个一看自己便明白的
type = tcp
local_ip = 192.168.2.15 #这里改成你树莓派的ip地址
local_port = 8123
remote_port = 8123 #这里可以改成别的端口号,到时访问的时候,用这个端口号访问。
改完之后保存。
编辑homeassistant的配置文件configation.yaml 添加如下内容:
shell_command:
frpc: nohup ./waiwang/frpc -c ./waiwang/frpc.ini &
上面的frpc是执行这个命令的名字,可以改成自己一看就明白的名字。
重启homeassistant。然后做一个自动化,让homeassistant启动后,执行这条命令。
依次点“配置”,“自动化”,右下角“+ 添加自动化”
随便命名一个一看即明白的名字。
触发条件是home assistant启动
动作是调用服务, 服务就是在configation.yaml中添加的shell_command
最后保存。到此,树莓派上的所有的就都设置完了。
3,云服务器上设置。
把下载好的frp_0.34.3_linux_amd64.tar.gz 上传到云服务器的家目录。
在云服务器中依次执行以下命令
tar xvf frp_0.34.3_linux_amd64.tar.gz #解压这个文件
mv frp_0.34.3_linux_amd64.tar.gz waiwang #重命名刚刚解压出来的目录,
cd waiwang #切换到waiwang目录
这里用到的也是两个文件,一个是frps服务端软件,一个是frps.ini配置文件,其他的可以删除,以免受到影响。
用nano来编辑配置文件
nano frps.ini #用nano编辑器打开
[common]
bind_port = 7000
#authentication_method = token
token = password #这里的密码和客户端的一致。
#下面的也可以不用设。设置上是可以web登录到frp,查看frp的运行状况。
dashboard_port = 7500
# dashboard's username and password are both optional,if not set, default is admin.
dashboard_user = admin
dashboard_pwd = 123456
配置文件就设置完了。下面设置让frpc服务端,开机自动运行。
sudo nano /etc/systemd/system/frps.service
把下面的复制进去。
[Unit]
Description=Frp server
After=network.target
Wants=network.target
[Service]
Type=simple
ExecStart=/home/ubuntu/waiwang/frps -c /home/ubuntu/waiwang/frps.ini
[Install]
WantedBy=multi-user.target
保存
执行如下命令
sudo systemctl enable frps.service #开机自动运行
sudo systemctl start frps.service #现在就运行frps
还有一点,登录云服务器,点开控制台,点开安全组,把端口8123放开,不然的话,也是无法访问。具体可以百度。我用过的腾讯云,华为云,阿里云,更改的方式是一样的。其他的云应该也是一样,因为这个不应该是谁抄谁,这节省了学习成本。
至此服务端的全部设置完毕。
- 测试,树莓派的frp客户端frpc还没运行,我们手动运行一下。
homeassistant界面依次点开,“配置”,“自动化”
点下“触发”,frp客户端便运行了。下次开机会自动运行的。也可以把它放到概览里面,方便使用。
这时候从浏览器输入你的云服务器ip地址加端口号便能访问homeassistant了。比如
1.1.1.1:8123 。
如果出现homeassistant的登录界面,恭喜你,成功了。
可以买个域名,才几块钱,然后绑定云服务器的ip地址,之后访问就用比较容易让人记住的域名访问了。
如果你的homeassistant是其他方式搭建的,那会更加的简单。当然这个方法也一样用。
买树莓派安装homeassistant的朋友可以到我的淘宝店铺"尚恩树莓派电子"购买