疫情影响学校不开学,但是实验该做还是要做,然而实验室的服务器开机后封锁在了校园网内,想从家里通过外网访问还需要费点功夫。想起来之前为了搭个人博客买了阿里云的服务器,这个时候就要派上用场了,有的同学可能会说zerotier很好用,但是zerotier是p2p比较依赖网速,并且我这边实验室服务器是需要多人同时使用docker容器,需要我这个网管配置好后,其他人直接ssh连接容器端口登陆。
frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp, http, https 协议
通过frp内网穿透使在家的我能够远程ssh连接处于内网的实验室GPU服务器,中间跳板是阿里云服务器。
那么学会这套方法后,中间跳板不局限于云服务器,只要是具有公网ip的东东合理配置后都能作为内网穿透的跳板。
frp服务端:阿里云应用轻量服务器 Centos7
frp客户端:实验室服务器 Ubuntu16.04
Step1:frp服务端(阿里云服务器)配置
首先到frp的release界面下载适合自己电脑的程序
https://github.com/fatedier/frp/releases 可以直接去这个页面下载
也可以通过wget命令下载
wget https://github.com/fatedier/frp/releases/download/v0.32.1/frp_0.32.1_linux_amd64.tar.gz
然后解压
tar -zxvf frp_0.32.1_linux_amd64.tar.gz
然后进入cd到frp_0.32.1_linux_amd64目录,对于服务端的配置可以直接先将frpc和frpc.ini文件删除,之后配置frps.ini
[common]
bind_port = 7000 #与客户端绑定的进行通信的端口
保存后就可以启动服务端了
# 前台启动
./frps -c ./frps.ini
# 后台启动(正常使用后推荐后台启动)
nohup ./frps -c ./frps.ini &
Step2:frp客户端(实验室服务器)配置
首先还是程序下载并解压
wget https://github.com/fatedier/frp/releases/download/v0.32.1/frp_0.32.1_linux_amd64.tar.gz
tar -zxvf frp_0.32.1_linux_amd64.tar.gz
然后进入cd到frp_0.32.1_linux_amd64目录,对于客户端的配置可以直接先将frps和frps.ini文件删除,之后配置frpc.ini
[common]
server_addr = 106.15.333.9 # 公网服务器ip
server_port = 7000 # 与服务端bind_port一致
#公网通过ssh访问内部服务器
[ssh]
type = tcp # 连接协议
local_ip = 192.168.3.48 # 内网服务器ip(127.0.0.1也行)
local_port = 22 # ssh默认端口号
remote_port = 6000 # 自定义的访问内部ssh端口号
# 解释一下local_port和remote_port
# 我们ssh访问的是公网ip,remote_port是公网服务器的port,访问remote_port后会转发到local_port
保存后就可以启动客户端了
# 前台启动
./frpc -c ./frpc.ini
# 后台启动(正常使用后推荐后台启动)
nohup ./frpc -c ./frpc.ini &
Step3:ssh远程连接内网服务器
ssh -p remote_port username@公网ip
# 举例
ssh -p 7000 [email protected]
阿里云服务器上正常启动了frps后,在客户端启动frpc时等待了一段时间报错
[service.go:82] login to server failed: dial tcp 106.15.333.9:7000: connect: connection timed out
当错误提示出现time out超时后,需要检查服务端的bind_port或者说serve_port是不是真的打开了,如果被防火墙拦截了,那么客户端启动frpc时就无法正常访问这个端口来实现穿透。
这里我打开了阿里云的界面找到防火墙(注意!ECS云服务器需要去调整安全组开放端口,而我是轻量应用服务器直接找到防火墙即可),果然防火墙只打开了几个常用的端口,bind_port=7000这个端口没有被开放,添加一下规则开放端口(可以尝试全部开放,免得以后再设置)
这个问题其实花了比较长的时间才解决,主要是阿里云服务器用的不熟,不知道可以直接在防火墙这里开放端口,我开始的时候在centos里尝试了各种防火墙开放端口的命令都没有成功,开放端口后重新启动客户端的frpc就能正常连接了。
由于我这里需要多人同时访问,一个local_port和remote_port对应肯定不够用,网上的有方法说这样写可以实现TCP范围转发,大家可以参考
# 本地端口和远程端口可以指定多个范围,如下格式,且范围之间必须一一对应
local_port = 6010-6020,6022,6024-6028
remote_port = 16010-16020,16022,16024-16028
但是实际上我这样写没有成功,报错提示这是非法端口号,于是我换了一种方法,配置多个ssh来实现多端口转发
[common]
server_addr = 106.15.333.9 # 公网服务器ip
server_port = 7000 # 与服务端bind_port一致
#公网通过ssh访问内部服务器
[ssh1]
type = tcp # 连接协议
local_ip = 192.168.3.48 # 内网服务器ip(127.0.0.1也行)
local_port = 22 # ssh默认端口号
remote_port = 6000 # 自定义的访问内部ssh端口号
[ssh2]
type = tcp # 连接协议
local_ip = 192.168.3.48 # 内网服务器ip(127.0.0.1也行)
local_port = 50000 # ssh默认端口号
remote_port = 50000 # 自定义的访问内部ssh端口号
[ssh3]
type = tcp # 连接协议
local_ip = 192.168.3.48 # 内网服务器ip(127.0.0.1也行)
local_port = 50001 # ssh默认端口号
remote_port = 50001 # 自定义的访问内部ssh端口号
理解起来也很容易,就是服务端开放三个端口6000,50000,50001访问,当ssh访问ip:port时就会按照对应关系来转发,访问服务端6000转发到客户端22,访问服务端50000转发到客户端50000。
这样我所需要的内网穿透功能就全部实现了,frp功能非常强大还有很多用法可以探索!