vpn错误691已拒绝远程连接
上用各类洋垃圾搭了个台式机(1200块左右,见:想要配一台性价比高的台式机),然后本着不能浪费资源的想法,想让这个台式机作为一个web服务器,我用来存放视频或个人博客,并且能够既在手机端也在电脑端随时访问这个web、浏览视频。
然而现实的问题是,家用宽带一般都不会给提供公网IP,都是靠NAT对外访问,因此这个服务器并不能满足我个人随时随地得访问(除非在同一个内网下),因此我就开始寻找解决方法。现有可以考虑的方法如下:
租借公有云服务(例如腾讯云、阿里云、华为云等),但是我这个服务器的目的是要随时随地看视频,而公有云服务器带宽非常昂贵,存储费用也不低,用来存放视频服务器会让我破产。
向电信讨要固定的公网IP,看网上有人能够成功要到,但是我是租的房子并且中介办理的宽带,为了减少扯皮,这个念头我也打消了。
等成熟的内网穿透工具,这种方式首先要买个花生云壳子,然后速度、流量都收到限制,成本也不低,为了搞个视频服务器代价太大,而且从安全性角度也不靠谱,流量都是先从web服务器经由花生壳,在传递给本机,跑起视频不一定能撑得住。
的方式进行通信(也就是公有服务器只做服务发现【暂且先这么叫】,所有的请求流量直接通过内网服务器和访问端进行)
经过再三考虑,我选择了最后一种,自己通过开源库搭一个内网穿透服务,并且要求开源库必须满足P2P方式的连接,大流量不能流经远程公有服务器。
搭建内网穿透服务必须要有一个公网IP的服务器,这样请求的流量通过访问公网IP,再转到内网服务器里,内网服务器通过心跳机制向公网服务器进行服务发现。所以必须满足如下条件:
为了后面方便讨论不产生misleading,我们固定术语:公网服务器成为服务端,内网服务器称为被控制端,访问端被称为控制端。
控制端能够随时随地(也就是不处于同一内网下)访问被控制端,不仅能访问ssh,也能访问web等。
访问模式必须支持p2p,也就是对于大流量传输不能受到服务端流量带宽的限制,而只能收到控制端和被控制端的限制。访问模式必须还要支持代理的形式(这是最基本的功能,也是最容易实现、容易穿透成功的)。
控制端最好能够支持不同的设备,例如Linux(这样树莓派等嵌入式设备也可以使用了),Android(手机端也能够使用了),Windows和MacOS(PC端能够访问视频网站)。而被控制端一般都是作为服务器对外提供服务来使用,所以Windows、MacOS、Linux就可以。
我参考(并都跑通了)两个比较有名的内网穿透服务,FRP (FRP) 和NPS(NPS)。这两种方式的共同特点是:
NPS已经两三年没有更新,并且Github Issue上被汇报出有安全漏洞,不过非正式版的社区大佬发布了修复漏洞的版本。
NPS安卓客户端不能够支持使用P2P方式,也就是说控制端如果是安卓,那么是无法使用P2P方式访问控制端的。主要原因是这个项目太久没人维护,我去看了下安卓端的代码,很容易就能添加这样的功能(还好是用Go语言写的安卓客户端,Go我还没忘光……),我试着手动添加完后,发现Go语言编译成安卓apk很麻烦,依赖太多,于是就放弃了,浪费了一整天时间。
将7000端口、7001端口、8081端口开放(参照网上、公有云等操作),然后关闭防火墙,确保:
将下载链接中v0.56.0版本的安装包下载、解压,假设安装包根目录是~/software/frp_0.56。
在搭建前,我们先在被控制端起一个web服务,这个服务目前只能通过内网连接,我们设置被控制端web服务的端口是8080vpn错误691已拒绝远程连接,那么我们在被控制端输入如下命令将会产生输出:
将下载链接中的frp_0.56.0版本的包解压,请注意我跑通的版本是0.56.0版本,其他版本不保证能够运行成功。假设安装包路径是~/software/frp_0.56
假设控制端是手机(当然其他客户端都可以)。对于纯代理模式,控制端不需要任何安装包,如果是p2p模式,客户端还需要包。如果控制端是macOS或者Windows、Linux等PC,则安装和服务端、被控制端一样的安装包即可。对于控制端是Android(例如希望用手机浏览器访问内网Web服务器),则需要安装下载链接v1.3.10版本的apk安装包(请注意版本!!)
前面填写服务端的服务发现的端口,默认bind_addr是服务端的公网IP。后面三个参数是dashboard控制面板的web。
可以看到服务已经成功启动,并且监听7000为服务发现端口,8081为dashboard的端口。我们可以在任意一台联网的浏览器中输入:务端公网IP:8081进入到dashboard,看到服务端的运行情况:
上面的nat_hole_stun_server可以先不填,如果STUN的NAT打洞服务正常,则不用理会,如果出问题则需要修改。然后启动服务:
如果使用代理的方式,则控制端不需要安装任何安装包,但是流量会通过内网 - 公网服务器 - 控制端,对于少量数据可以推荐,但是如果使用P2P方式,则需要安装客户端。通过代理的方式可以参照官方文档:代理方式。后文都是通过P2P方式。
控制端的启动方式类似,区别就是配置文件的不同。这里我的控制端是安卓手机,安装“搭建前的准备”章节提供的apk后,配置文件编写为如下:
此时需要更换STUN服务器,相关的问题可以参考:链接,其中最末尾的FAQ一章节的情形。具体的Github Issue可以参考:GithubIssue
找到一个正常能用的STUN服务,然后在控制端和被控制端的nat_hole_stun_server =选项设置为正常的STUN服务。
服务端的命令可以加入到开机自启,然后加入到后台守护进程(nohup),这样服务端每次重新启动时,服务端的frps就会自动在后台运行。

