在学校做了一个deep learning项目通过web提供服务,验收阶段需要给甲方测试,但是学校是内网甲方无法访问,于是搜索内网穿透,解决方案非常多,身边同学推荐花生壳,经实测花生壳体验版速度慢,流量受限(每月1G)且不够稳定,正式版只能按年购买费用较贵,考虑到甲方测试至多只需一个月,花生壳正式版成本太高,本着给导师省钱的原则,选择了外网ip+frp的方案。
frp全称fast reverse proxy,是一个开源反向代理,只需一个公网ip即可实现内网穿透。网上方案多采用阿里云提供公网ip(稳定还不耗自己电啊),搜了一下阿里云学生购买一个月只需9.5,不够可以接着续。按照多数技术博客还需购买一个域名,查了一下域名也不贵,阿里云提供的最便宜每年8,但是大学学的网络原理告诉我只通过ip理论上也能访问网站,于是搜索无域名frp内网穿透,果不其然,又给导师省了一根鸡腿
判断方案可行后便开始行动,阿里云的学生优惠配置较低,用来做内网穿透也绰绰有余了。系统版本选择的Ubuntu系统,其实CentOS和windows也都可以。有轻量应用服务器和云服务器ECS两种可供选择,配置大同小异,没仔细比较,直接选择了轻量应用服务器。
有了公网ip之后就需要在阿里云和内网主机上分别下载frp并进行配置了,frp通过github下载系统对应版本,目前最新的版本是v0.28.1,我的两台电脑都是Ubuntu,都用的 frp_0.28.1_linux_amd64.tar.gz ,下载后解压
wget https://github.com/fatedier/frp/releases/download/v0.28.1/frp_0.28.1_linux_amd64.tar.gz
tar -xzvf frp_0.28.1_linux_amd64.tar.gz
解压出下列文件:
其中 c 表示客户端文件,s 表示服务端文件
删掉无关客户端文件:
rm -f frpc
rm -f frpc.ini
rm -f frpc_full.ini
vim修改frps.ini(配置比较简单直接修改frps.ini即可,无需修改frps_full.ini)
[common]
bind_port = 7000
vhost_http_port = 80
说明:
bind_port :frp客户端和服务端连接的端口,默认即可,也可自己设置
vhost_http_port :反向代理http主机端口,80为默认,直接通过ip即可访问,若使用其他,例如8080,则需通过 xx.xx.xx.xx:8080访问(阿里云ip)
若使用https:vhost_https_port = 10443
其他配置可以通过frp的文档查看
保存后,启动运行(进入frp路径执行)
前端开启,关闭ssh连接就会失效
./frps -c ./frps.ini
后台开启,关闭ssh连接仍然运行
nohup ./frps -c ./frps.ini &
若通过前者开启,显示下列信息即开启成功:
[service.go:146] frps tcp listen on 0.0.0.0:7000
[service.go:188] http service listen on 0.0.0.0:80
[root.go:204] Start frps success
若通过后者开启,信息会自动保存到frp路径下的 nohup.out 文件中,内容与上面一致
开启之后,还需在阿里云后台防火墙设置中开启相应端口
否则,客户端在连接时会出错
[W] [control.go:113] login to server failed: dial tcp xxx.xxx.xxx.xxx:7000: connect: connection timed out dial tcp xxx.xxx.xxx.xxx:7000: connect: connection timed out
轻量应用服务器设置如下:
添加使用到的新端口
云服务器ECS需添加安全组规则,详细可参考:
https://blog.csdn.net/a568713197/article/details/87897342
删除无关服务端文件
rm -f frps
rm -f frps.ini
rm -f frps_full.ini
vim修改frpc.ini
[common]
server_addr = 阿里云ip
server_port = 7000
[web]
type = http
local_ip = 127.0.0.1
local_port = 80
custom_domains = 阿里云ip
说明:
server_port 应与服务端配置中的 bind_port 一致
[web]为模块名可自定义
local_port 应与内网主机web监听端口一致
custom_domains填映射到阿里云ip的域名,没有域名直接填阿里云ip即可
类似方式启动客户端后显示:
[service.go:224] login to server success, get run id [xxxx], server udp port [0]
[proxy_manager.go:137] [xxxx] proxy added: [web]
[control.go:144] [web] start proxy success
服务端也会有连接成功提示
[service.go:356] client login info: ip [内网主机ip:端口号] version [0.28.1] hostname [] os [linux] arch [amd64]
[http.go:92] [xxxx] [web] http proxy listen for host [阿里云ip] location [] group []
[control.go:398] [xxxx] new proxy [web] success
[proxy.go:84] [xxxx] [web] get a new work connection: [内网主机ip:端口号]
之后便可直接在浏览器中通过阿里云ip访问内网web服务