frp+docker内网穿透安装配置

frp+docker内网穿透安装配置

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.xSSH内网服务器了

  • 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;会不生效,这个时候去要查一下云服务的内网地址填上就可以了