背景

疫情影响学校不开学,但是实验该做还是要做,然而实验室的服务器开机后封锁在了校园网内,想从家里通过外网访问还需要费点功夫。想起来之前为了搭个人博客买了阿里云的服务器,这个时候就要派上用场了,有的同学可能会说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 horizon@106.15.333.9

connect time out问题

阿里云服务器上正常启动了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功能非常强大还有很多用法可以探索!

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐