利用Docker搭建FRP内网穿透

6,141 阅读8分钟
原文链接: www.centos.bz

去年的时候,我曾经写过一篇关于内网穿透的文章。

内网穿透(Frp)-拯救没有公网IP的你:https://post.smzdm.com/p/566063/

一年过去了,不断的有人咨询我关于使用的问题,而且我发现用这个的人也是越来越多,能问运营商要到公网IP的几率越来越小。我用的移动宽带,客服都直接回复,我们不提供公网IP。另外作者对frp也更新了很多,所以今天想再更新一下关于FRP,来张大妈骗点金币吧。

特别是在路由器、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的视频,而且非常稳定,不论是客户端还是服务端都很稳,基本不用操心。

原文出处:smzdm -> post.smzdm.com/p/743634/