frp是一个优秀的内网穿透服务,曾试过用ngrok做内网穿透,但用docker还比较麻烦,还需要自己编译ngrok客户端进行分发才能使用,折腾了一阵子就没搞了。frp早闻大名,趁有空尝试下,还是比较方便的,只需要写好配置文件,启动就完事了
frp官方文档
frp github
docker-frps
docker-frpc
准备
1.云服务器或具有公网IP的服务器,用于安装frp服务端(frps)
2.需要内网穿透的服务器,如树莓派,将安装frp客户端(frpc)
3.上述1和2的服务器均安装好docker
frp服务端(frps)
创建frp服务端配置文件/data/frp/frps.ini
,根据自己实际情况修改路径
mkdir /data/frp/frps.ini
cd /data/frp/
nano frps.ini
frps.ini
[common]
# 服务器开放给客户端的frp端口
bind_port = 7000
# http端口
vhost_http_port = 8080
# https端口
vhost_https_port = 8081
dashboard_addr = 0.0.0.0
# 控制面板端口,用户名,密码
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = yourpassword
# 自己用于frp服务的域名
subdomain_host = frp.yourdomain.com
# frps服务token,拥有此token的客户端才允许连接
token = yourfrptoken
仅
bind_port
为必须设置,其余设置可根据需要进行取舍
设置token可防止任何用户连接自己的frp服务端,相应地,客户端的配置文件也需要设置相同的token才能连接,如自己的frp服务开放给任何用户,可不设置
subdomain_host
设置frp服务的域名,使客户端可从*.frp.yourdomain.com
访问服务,若客户端无子域名要求,可不设置
拉取frp服务端镜像
docker pull snowdreamtech/frps
运行docker
docker run --restart=always --network host -d -v /data/frp/frps.ini:/etc/frp/frps.ini --name frps snowdreamtech/frps
搞定,去服务器IP:7500
,输入账号密码,就可以看到dashboard页面了
frp客户端(frpc)
客户端就比较灵活了,可以去frp的release下载编译好的文件,也可以跑在docker中,重点还是配置文件的内容
frpc.ini
[common]
# frps服务器地址,可用域名,即服务端的frp.yourdomain.com
server_addr = 666.666.666.666
# 上面frps.ini配置的端口
server_port = 7000
# frps服务token
token = yourfrptoken
[tcp]
type = tcp
local_ip = 127.0.0.1
local_port = 8000
remote_port = 9876
[web]
type = http
local_port = 8000
custom_domains = yourdomain
相关说明:
-
以上演示了一个TCP类型和HTTP类型的代理,
[xxx]
中可随意填写,仅代表该代理的name
,名称不可重复 -
云服务器IP假设为
666.666.666.666
-
TCP代理一般用于监听22端口来进行SSH,在上面的例子中,内网的8000端口跑了个服务,因此可用
666.666.666.666:9876
或则域名:9876
来访问到内网8000端口的服务。如果改成local_port = 22
,就可以ssh -oPort=9876 test@x.x.x.x
SSH内网服务器了 -
HTTP代理的例子中,需要指定域名,可通过
域名:8080
来访问内网8000端口的服务,但不可通过666.666.666.666:8080
来访问,为什么是8080
呢?因为在上面的frps.ini
中配置了vhost_http_port = 8080
。如果服务端frps.ini
设置了subdomain_host
,该例中custom_domains = yourdomain
可改为subdomain=myweb
,此时就可通过子域名,myweb.frp.yourdomian.com:8080
来访问服务,注意,子域名只能向下一级,不可subdomain=sub.myweb
,会报错
运行客户端
写好配置文件后,可根据实际,运行编译版程序,或者运行docker版程序
编译版
从github下载对应平台编译好的文件,解压好,修改frpc.ini
,运行即可,注意windows版要打开cmd运行
docker
拉取客户端镜像
docker pull snowdreamtech/frpc
创建/data/frp/frpc.ini
,写好配置文件,运行即可
docker run --restart=always --network host -itd -v /data/frp/frpc.ini:/etc/frp/frpc.ini --name frpc snowdreamtech/frpc
其他配置
客户端的管理页面
除了上面的服务端(frps)有dashboard,客户端(frpc)也有自己的管理页面,方便客户端随时更新配置文件,不用每次都要进服务器才能修改
因此仅需要在客户端frpc.ini
添加下面内容即可
# frpc.ini
[common]
admin_addr = 127.0.0.1
admin_port = 7400
admin_user = admin
admin_pwd = admin
#打开浏览器通过 http://127.0.0.1:7400 访问 Admin UI
#如果想要在外网环境访问 Admin UI,可以将 7400 端口通过 frp 映射出去即可,但需要重视安全风险
#用tcp的方式,外网可用frp.yourdomain.com:7400访问
[admin_ui]
type = tcp
local_port = 7400
remote_port = 7400
#也可用http的方式,外网可用frp-admin.frp.yourdomain.com:8080访问(注意和tcp方式端口区别)
[admin_ui_http]
type = http
local_port = 7400
subdomain = frp-admin
官方文档写的就是用tcp的方式访问,当然用http也是可以的,二选一即可
重启,就可以访问客户端的管理页面了
去掉端口号访问
每次访问内网服务都要加端口号*.frp.yourdomian.com:8080
还是挺烦的,要去掉端口号,只需要在服务端的nginx加一个配置项,即匹配监听自己frp子域名的80端口,转发到frp的8080端口,然后就可以愉快地不带端口访问内网服务了~(前提是域名备案了哈,云服务器没有备案是用不了80端口的)
server {
listen 80;
server_name *.frp.yourdomain.cn frp.yourdomain.cn;
location / {
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8080;
}
}
如果服务端使用的是云服务器,有的云服务器填proxy_pass http://127.0.0.1:8080;
会不生效,这个时候去要查一下云服务的内网地址填上就可以了