利用Docker搭建FRP内网穿透
去年的时候,我曾经写过一篇关于内网穿透的文章。
一年过去了,不断的有人咨询我关于使用的问题,而且我发现用这个的人也是越来越多,能问运营商要到公网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的视频,而且非常稳定,不论是客户端还是服务端都很稳,基本不用操心。












校验提示文案
不过还是感觉很难,主要是碰到问题没有人指导,太折腾人
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
不过还是感觉很难,主要是碰到问题没有人指导,太折腾人
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案