今天稍花了点时间实现了从外网访问家中主机的功能
起因
因工作原因经常在外地出差,但是笔记本空间有限,存不了那么多东西,但有的东西偶尔还需要访问,很是蛋疼。除此之外,还能通过这台主机一直挂着下载东西
找方案
于是开始想办法,大概有如下几个思路:
1、买个nas,毕竟自己搭的东西软件支持还是不如专业的好用。群晖的ds420+要4000软妹币还不包括硬盘,虽说按照我这个存数据的速度早晚都要买,但目前来说还是没必要,主要是因为宽带的问题,家里没有固定ip,上行带宽还太小,买了也没用,等现在用的宽带到期了再说

好 贵 啊
2、直接用旧主机存东西,在外网访问它。这台旧主机在我配了新主机后有段时间一直闲置。后来抽空加了条内存,换了个固态,加了一块4TB的西数蓝盘让其重获新生,存了一些短时间内用不到但是不舍得删的东西,这时候能派上用场了
3、公有云。用过百度网盘之类的公有云是非常不靠谱的,原因大家都懂,况且都签了保密协议,很多文档不能上网。
好极了
思来想去只有2靠点谱,手里有两台固定ipv4地址的云主机,做个反向代理呗,就跟反弹shell一样,开搞
实现
能实现反向代理的程序有很多,老牌的ngrok,python写的shootback,前者要跑在自己的服务器上还得重新编译配置证书,后者性能不太彳亍,现在大家都用frp,github上四万多点赞

首先需要安装go,这玩意使用go语言写的。在自家主机上和云主机上安装一下。

该下哪个下哪个
自家主机是win10,vps是ubuntu16.04稳定版,上面还跑着博客。下载好win10版本的golang msi文件和linux的tar包,直接在这俩上面安装即可。
然后下载frp,在这个项目github页面上的release页面中下载二进制文件即可。注意,阿里云的服务器端需要下载linux_amd64版本,自家主机需要下载darwin_amd64的,因为老电脑的cpu是速龙640
这两个压缩包下客户端和服务端的可执行文件都有,我这里只需要linux_amd64中的服务端二进制文件frps,和darwin_amd64中的客户端二进制文件frpc.exe


然后编写好.ini,这是配置文件。
服务端很简单,配置一下接收端口就行,ip地址就是0.0.0.0
客户端的server_addr为服务端的公网ip
local_port默认是ssh,我这里改成3389了,毕竟是windows
22223就是要连接的服务器端口,也就是说在外网访问阿里云x.x.x.x:22223就相当于访问家里电脑的3389,也就是远程桌面

别忘了到vps后台把防火墙策略补上,要不然上面设置的端口会被拦截

先运行服务端,再起客户端

出现这个就说明连接成功了

为了稳定在后台运行,我加了一个守护进程,然后用>>frpslogs.log &命令,表示运行输出的结果存到frpslogs.log文件中,&是后台运行,输出结果不显示。

不要直接X掉xshell客户端,这相当于关闭了bash进程,frp服务端进程就没了,要exit出去,在X掉
连接x.x.x.x:22223,大功告成

效果
刚想起来我这个vps是阿里云学生版的,带宽貌似只有2m,实际测试只有120kb/s左右,还不到1m。相比较而言,我在家里通过路由器访问,速度大概在3.2mb/s左右,大概是25m的带宽,家里的网络拓扑大概是这样

R1和R2之间是通过十五年前装修时埋进去的5类线连接的,带宽只有100m,十分感人
所以也就勉强连接一下远程桌面,传个文档或者图片,挂机下载点东西,视频是别想了
写在最后
还是得换个好宽带,要个固定IP,买个群晖才好用
原文始发于微信公众号(老佘百分百):基于frp的内网穿透部署