在路由器、NAS没有公网IP是一件很不方便的事情,尤其是在国内的网络环境。为了解决这个问题,则需要内网穿透,而内网穿透的方法有很多种,例如使用花生壳、NGROK等,但是我感觉frp是相对更为稳定。
frp是什么
frp 是一个高性能的反向代理应用,可以帮助您轻松地进行内网穿透,对外网提供服务,支持 tcp, http, https 等协议类型,并且 web 服务支持根据域名进行路由转发。
说白了,就是利用一台有公网IP的机子,实现访问你家没有公网IP的设备。
在我使用过的穿透软件中,感觉frp在稳定性、功能和维护方面做得比较好,我也稳定使用了快2年了。
准备工具
从上面的内网穿透的原理可以看出,我么至少需要一台有公网IP的主机,目前来看VPS是最好的选择,以及一个域名。
关于VPS用法、域名购买以及有关工具在我过去的文章中已经详细的说明了。如果对VPS有不明白的地方可以看一下教程 由于我今天只想说说FRP,所以就不赘述了。
域名一定要做泛解析,有时容易忽视这里。不论是二级域名还是三级域名,都可以做泛解析。比如我f.anys.ga做域名泛解析,填入*.f就可以吧*.f.anys.ga进行解析。
FRP服务端搭建
利用docker
我选择了Docker方式,好处在于十分方便,容易部署,沙盒机制可以不破坏系统环境。最近docker用的多了感觉十分非常顺手,如果你不喜欢docker可以自行研究。
搭建服务端
我的OS是Ubuntu14.04 x64。首先安装Docker,这里不推荐apt-get 或者yum的形式安装,建议直接从官网下载docker。如果你不关心Docker是什么,那么你也不用深究,如果你有兴趣研究一下,可以自行google。
#安装Docker
wget -qO- https://get.docker.com/ | sh#在宿主机建立目录
mkdir /var/frp && mkdir /var/frp/conf &&cd /var/frp/conf#获取服务器端配置文件
wget https://frp.anys.ga/frps.ini
#建立镜像
sudo docker run --name frps -d -v /var/frp/conf:/var/frp/conf -p 5000-5100:5000-5100 -p 7000:7000 -p 7500:7500 -p 7001:7001 -p 8089:80 -p 8443:443 ruiny/frps
这样服务器就搭建好了。按照以上配置完成的话,服务端口7000,状态查询(web)端口7500,http服务端口8089,https端口为8443,同时开放5000-5100端口用于其他TCP/UDP连接。
之所以用8089/8443端口是因为本机上的80/443端口用给Nginx了,如果你们确保端口没冲突的话可以用80/443端口。(有些强迫症患者只用80端口)
之后登陆你VPS地址IP地址:7500可以查询具体状态,用户名/密码为admin/Qwert123。
配置文档修改
好了,如果实在懒得动配置,上面的可以正常使用,但一般总要改一下密码什么的吧。我在制作镜像的时候,把配置文件放在了/var/frp/conf下,在上面过去服务器配置的时候,我直接用了作者的官方配置,很多配置是不合适的,如果需要更改:
nano /var/frp/conf/frps.ini
至少你应该修改以下几项内容:(ctrl+x保存,或者习惯用vi编辑器的)
#设置用户名和密码,注意是状态面板的用户名和密码。
dashboard_user = admin
dashboard_pwd = admin
#令牌,很重要,用于验证与客户端的通信。
token = 12345678
#自定义二级域名,如果设置了,之后在客户端的http、https类型的代理中可以不配置custom_domains,而是配置一个 subdomain 参数。可以不配置,默认没有配置。
subdomain_host = frps.com
我只开放了5000-5100用于TCP/UDP端口,如果需要更多端口请修改以下内容。但同时docker run中也要修改-p 5000-5100:5000-5100的端口范围。我测试,如果一次性开放端口过多,会导致docker卡死,所以不建议开太多哦。
# only allow frpc to bind ports you list, if you set nothing, there won't be any limit
allow_ports = 5000-5100
FRP客户端配置
不论是梅林、老毛子或者是群晖,在frp客户端中的设置都大同小异,但是我一般喜欢用配置文档的方式,简单说说配置文档。完整的客户端配置模板可以在查看
配置文档
配置文档分为两部分,第一部分是common开头的通用配置,第二部分就是每个穿透服务项目
下面将几个例子:
1.主路由web界面
[router] #主路由web界面
type = http #穿透类别为http
local_ip = 192.168.1.1 #内网地址
local_port = 80 #穿透服务内网端口
remote_port = 8089
custom_domains = router.f.anys.ga #外网域名
use_encryption = true #开启加密
use_compression = true #开启压缩
在梅林的界面中对应内容如下:
2.GEN8中window的远程桌面
[Gen8-Winser]
type = tcp #类别为tcp
local_ip = 192.168.1.5 内网Gen8的ip地址
local_port = 3389 #注意穿透端口是远程桌面的端口3389
remote_port = 5000 #外网端口随便填一个吧
use_encryption = true
use_compression = true
由于是tcp所以这里不需要外网域名了,这个就类似于端口转发。
3.DSM黑群晖
[dsm]
type = https #黑群晖DSM的web用https,所以类别是https
local_ip = 192.168.1.7 #黑群晖的地址
local_port = 5001 #群晖的https端口是5001
remote_port = 8443 #外网https端口对应是8443
custom_domains = dsm.f.anys.ga
use_encryption = true
use_compression = true
我黑群晖的内网地址是192.168.1.7,https端口是8443,对应访问域名就是dsm.f.anys.ga:8443。对于https的穿透,需要导入相应证书,否则不会有小绿锁哒~
群晖和梅林都有导入的地方,比如群晖在这里:
frp的作者还搞了一些高级用法,特殊情况可以尝试用一下:
4.转发 DNS 查询请求
可以通过frp转发自己的DSN请求,在客户端配置文件中设置。将DNS请求转发到google的8.8.8.8
[dns]
type = udp
local_ip = 8.8.8.8
local_port = 53
remote_port = 6000
5.stcp 类型的代理
stcp利用了一个sk验证,使得只有sk一直的两个客户端能够点对点互访,防止公网上的随意访问。
家里的路由器:
[secret_ssh]
type = stcp #类型是stcp
sk = router1 # 只有 sk 一致的用户才能访问到此服务
local_ip = 192.168.1.1
local_port = 22
另外一台PC:
[secret_ssh_visitor]
type = stcp
role = visitor # 访问者
server_name = secret_ssh # 对应穿透服务的名称与上面一直
sk = router1 # 只有 sk 一致的用户才能访问到此服务
bind_addr = 127.0.0.1
bind_port = 8022 # 绑定本地的端口
在本地访问ssh,地址127.0.0.1,端口8022就会穿透到家里的路由器22端口。
测试
一个不知道什么时候就会消失的测试服务器,注意人多容易重名,不要当作正式用途。
Web地址:网址 admin/Qwert123
FRP服务地址:f.anys.ga:7000
token:f.anys.ga
TCP/UDP端口:8089,443, 5000-5100
三级域名 *.f.anys.ga
其它问题
1.修改frps.ini后需要重新启动容器 docker restart frps
2.服务器端只适用于64位的系统
3.0.17以后的版本和之前的不兼容,注意客户端和服务器版本一致
4.由于frp是封装在docker里面运行的,如果要讨论效率的话我不好说。
说真的FRP真的很好用,之前用Vultr做服务器的时候,带宽足够可以在线看家里NAS的视频,而且非常稳定,不论是客户端还是服务端都很稳,基本不用操心。
推荐本站淘宝优惠价购买喜欢的宝贝:
本文链接:https://hqyman.cn/post/3283.html 非本站原创文章欢迎转载,原创文章需保留本站地址!
休息一下~~