1 前言
1.1 设备环境
- 访问者:个人windows设备,系统win 11
- 服务器:阿里云ECS,系统ubuntu 22.04
- 客户端(被访问者/内网设备):个人ubuntu设备,系统ubuntu 22.04
1.2 需求
客户端在工位是内网设备,想在家里远程连接工位内网设备进行代码工作,且无需重新配置代码环境。
1.3 参考网站
- frp源码:https://github.com/fatedier/frp/releases
- frp手册:https://gofrp.org/zh-cn/
- Xshell和Xftp免费版下载网址:https://www.xshell.com/zh/free-for-home-school/
- 其他教程:小标快跑frp教程
2 框架图
参考小标快跑的TCP框架图,原视频入口。
图中的ip号和端口号略有不同,并不影响实际效果。
3 使用TCP代理的操作流程
3.1 服务器端
3.1.1 阿里云ecs租借
-
进入阿里云官网,选择“产品” -> “计算” -> “云服务器ECS”。
-
选择合适的方案购买,试用或者1年99元,2核2G配置即可。
-
购买详情中注意选择镜像,我使用和客户端相同的ubuntu22.04,其他默认即可。
-
购买完成后可以再控制台看到云服务器ECS实例信息
-
接下来进入实例的详情页,选择”全部操作“ -> ”重置示例密码“。
-
输入密码,确认修改。
3.1.2 下载与安装frp
-
使用服务器连接工具连接租借的阿里云ECS,以Xshell为例,创建新的连接,主机号即为实例的公网ip:
选择左侧的“用户身份验证”,输入刚才重置的用户名和密码:
其他保持默认即可。点击“连接”,遇到SSH安全警告点击“接受并保存”,可以看到成功上租借的服务器:
-
在/usr/local下创建并进入frp目录。
cd /usr/local mkdir frp cd frp
-
在https://github.com/fatedier/frp/releases上下载对应服务端和架构的包
-
使用服务器文件传输工具,上传frp的安装包到/usr/local/frp下,以Xftp为例,创建新的连接,主机为ecs实例的公网ip,用户名和密码同为刚才重置的,其他保持默认即可,点击“连接”:
将下载的包上传到/usr/local/frp目录下:
-
解压并进入
tar -zxvf frp_0.61.1_linux_amd64.tar.gz cd frp_0.61.1_linux_amd64/
3.1.3 配置服务端frp
由于租借ECS用于作为frp的服务端,故只需要使用frps相关的文件,其中frps是执行程序,frps.toml是配置文件。
-
进入配置文件frps.toml
vim frps.toml # 按 i 进入编辑模式
-
写入配置信息:
# 客户端与服务端的连接端口 bindPort = 7000 # 客户端连接服务端时用于认证的token auth.token = "any_token" # web管理页面配置 webServer.addr = "0.0.0.0" webServer.port = 7500 webServer.user = "admin" webServer.password = "admin"
保存并退出:
# 按 esc 进入命令模式 :wq
3.1.4 开放端口
我们需要在阿里云的控制台中为上面使用到的端口放行。
-
进入示例详情页,点击”安全组“ -> ”安全组ID“。
-
在“入方向”中点击“手动添加”,输入要开放的端口号7000和7500,授权对象为“所有IPv4”,保存。
3.1.5 运行服务端frp
这一步中,我们使用systemd命令管理frps服务,以便设置为开机自启动。
-
在/etc/systemd/system目录下创建frps.service文件,用于配置frps服务:
sudo vim /etc/systemd/system/frps.service
-
写入配置内容:
[Unit] # 服务名称,可自定义 Description = frp server After = network.target syslog.target Wants = network.target [Service] Type = simple # 启动frps的命令,需修改为您的frps的安装路径 ExecStart = /usr/local/frp/frp_0.61.1_linux_amd64/frps -c /usr/local/frp/frp_0.61.1_linux_amd64/frps.toml [Install] WantedBy = multi-user.target
-
使用systemd管理frps服务:
# 启动frp sudo systemctl start frps # 停止frp sudo systemctl stop frps # 重启frp sudo systemctl restart frps # 查看frp状态 sudo systemctl status frps
设置frps开机自启动:
sudo systemctl enable frps
可以看到如下输出:
-
frps服务启动成功后,可以在web管理页面看到相关信息,进入网址182.92.163.5:7500,输入账号密码
可以看到管理页面如下:
3.2 客户端
3.2.1 下载与安装frp
-
在https://github.com/fatedier/frp/releases上下载对应服务端和架构的包到/home/tsy529/frp目录,客户端仍然是ubuntu22.04,amd64架构。
-
解压并进入:
tar -zxvf frp_0.61.1_linux_amd64.tar.gz cd frp_0.61.1_linux_amd64/
3.2.2 配置客户端frp
由于内网设备作为frp的客户端,只需要使用frpc相关的文件,其中frpc是执行程序,frpc.toml是配置文件。
-
进入配置文件frpc.toml
-
写入内容,假设frps所在服务器公网ip为182.92.163.5:
serverAddr = "182.92.163.5" serverPort = 7000 auth.token = "any_token" [[proxies]] name = "rdp" type = "tcp" localIP = "127.0.0.1" localPort = 22 remotePort = 6000
localIP
和localPort
配置为需要从公网访问的内网服务的地址和端口。
remotePort
表示在 frp 服务端监听的端口,访问此端口的流量将被转发到本地服务的相应端口。
3.2.3 开放端口
在“入方向”中点击“手动添加”,输入要开放的端口号6000,授权对象为“所有IPv4”,保存。
3.2.4 运行frpc程序
-
命令行输入:
./frpc -c ./frpc.toml
运行成功后输出:
-
在Web管理页的“Proxies” -> “TCP”可以看到客户端信息
3.3 访问者端
3.3.1 测试SSH远程连接
-
打开命令行输入以下命令通过SSH访问客户端(内网设备),假设内网设备的用户名是tsy529
ssh -o Port=6000 tsy529@182.92.163.5
-
若输出如下信息则代表成功连接:
3.3.2 在vscode中使用Remote - SSH插件进行远程连接
-
在“扩展”中搜索“Remote - SSH”,安装插件。
-
点击左下角的蓝色按钮,再点击“Connect to Host”。
-
点击“Configure SSH Hosts”。
再点击第一个选项,进入到配置页面
-
写入内容后保存:
Host 182.92.163.5 HostName 182.92.163.5 Port 6000 User tsy529
-
点击左侧远程连接图标,选择创建好的远程主机,点击在新窗口中连接。
-
接下来选择客户端的系统,我们是linux:
输入客户端对应用户的密码:
可以看到成功连接到客户端(内网设备):
4 更换为STCP代理
由于TCP代理会将内网设备的服务直接暴露在公网ip上,可能存在风险。使用stcp(secret tcp)类型的代理可以安全地将内网服务暴露给经过授权的用户,这需要访问者也部署frpc客户端。
4.1 客户端修改配置文件
-
修改客户端的frpc.toml,替换为以下内容:
serverAddr = "182.92.163.5" serverPort = 7000 auth.token = "any_token" [[proxies]] name = "rdp_client" type = "stcp" # 只有与此处设置的 secretKey 一致的用户才能访问此服务 secretKey = "abcdefg" localIP = "127.0.0.1" localPort = 22
将type修改为stcp,且不再需要remotePort
-
重新启动客户端,命令行输入:
./frpc -c ./frpc.toml
-
可以在Web管理页中看到客户端STCP的信息
4.2 访问端部署frp并进行连接
-
由于我们的访问端是win,所以选择下载frp_0.61.1_windows_amd64.zip,解压后看到文件如下:
-
访问端在frp中的角色仍然是客户端,修改frpc.toml配置文件,写入以下内容:
serverAddr = "182.92.163.5" serverPort = 7000 auth.token = "any_token" [[visitors]] name = "rdp_visitor" type = "stcp" serverName = "rdp_client" secretKey = "abcdefg" bindAddr = "127.0.0.1" bindPort = 6000
-
在命令行中输入以下命令,运行frpc程序(注意此处是win中)
./frpc.exe -c ./frpc.toml
运行成功后输出:
-
另开一个命令行,输入以下命令,测试SSH远程连接:
ssh -o Port=6000 tsy529@127.0.0.1
连接成功的输出如下:
-
修改vscode中的配置文件,重新连接即可。
Host 127.0.0.1 HostName 127.0.0.1 Port 6000 User tsy529