基于腾讯云的云服务器和frp实现内网穿透
放假在家,无法使用实验室的GPU服务器进行炼丹,因为GPU服务器处于校园网的内网环境下,而在校园网外网络环境下,无法直接ssh登录校园网内的机器,因此需要内网穿透。
本文大量参考了以下几篇博客和帖子(尤其是第一篇,写的特别好,本文的基本流程也与该篇帖子的行文顺序基本一致,侵删),记录主要的配置流程,并记录踩过的坑。
1.参考文献
- [1] https://www.tqwba.com/x_d/jishu/408839.html
- [2] https://www.nasge.com/archives/17.html(使用jobs命令可以查看后台运行的程序)
- [3] https://blog.csdn.net/cao0507/article/details/82758288?utm_medium=distribute.pc_relevant_t0.none-task-blog-2~default~BlogCommendFromMachineLearnPai2~default-1.no_search_link&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2~default~BlogCommendFromMachineLearnPai2~default-1.no_search_link(防火墙过滤规则查看,iptables -vnL)
- [4] https://blog.csdn.net/weixin_43922901/article/details/109261700?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~default-1-109261700-blog-82758288.pc_relevant_multi_platform_whitelistv1&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~default-1-109261700-blog-82758288.pc_relevant_multi_platform_whitelistv1&utm_relevant_index=2
以下为frp的基本配置参数说明:
- [5] https://gofrp.org/docs/examples/ssh/frp 官方文档关于内网穿透的说明
2.所需设备
(1)具有公网ip的云服务器,本人选的是腾讯云的轻量应用服务器,比较便宜(但最近涨价很猛)。
(2)frp软件,官网地址:https://github.com/fatedier/frp
3.具体流程
下面将按照文献[1]的结构,记录主要流程。
3.1 准备一台公网ip云服务器
(1)打开云服务器安全组相关端口
登陆自己的腾讯云账号,进入安全组相关端口页面,路径:服务器->防火墙->添加规则
如图所示,添加2个端口,7000和6000,后续会用到。
(2)打开防火墙
打开云服务器的防火墙对应的端口。注意,需要打开22端口,否则无法ssh登录到云服务器。
# 启用
sudo ufw enable
# 开放端口
sudo ufw allow 7000
sudo ufw allow 6000
sudo ufw allow 22
sudo ufw allow 80
sudo ufw allow 443
sudo ufw allow 3389
# 查看状态
sudo ufw status
3.2 配置公网云服务器
(1)将frp软件下载、解压到到公网服务器,可以放在任何目录下。
(2)配置fprs:frp服务端
配置frps.ini文件,其默认设置如下(这里不进行更改):
[common]
bind_port = 7000 # frp服务端接受客户端连接的端口,可以自己设置,但安全组端口和防火墙要进行相应的设置
3.3 配置内网GPU服务器
(1)将frp软件下载、解压到到内网GPU服务器,可以放在任何目录下。
(2)配置frpc:frp客户端
需要配置frpc.ini文件,如下:
[common]
server_addr = x.x.x.x # 云服务器的公网ip
server_port = 7000 # 和云服务器连接的端口
[ssh1] # 这里是client的一个别名,命名为ssh1以和其他client区分
type = tcp # TCP 类型的代理,实现内网穿透
local_ip = 127.0.0.1
local_port = 22 # local_ip 和 local_port 配置为本地需要暴露到公网的服务地址和端口。ssh服务通常监听在 22 端口
remote_port = 6000 # 公网服务器的端口,表示frp服务端监听的端口,访问此端口的流量将会被转发到本地服务对应的端口。可以任意设置,但安全组端口和防火墙也要进行相应的设置
注意,可以用一台云服务器,穿透多台内网机器,第二台机器的frpc.ini文件设置如下:
[common]
server_addr = x.x.x.x # 云服务器的公网ip
server_port = 7000 # 云服务器开放的端口
[ssh2] # client的一个别名,命名为ssh2以和其他client区分
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6001
即不同内网机器的frpc.ini中,只有remote_port和client别名(比如[ssh1]、[ssh2])不同,其它都一样。
3.4 分别启动内网机器和公网服务器的FRP
(1)启动公网服务器fprs服务端
打开terminal,输入如下命令,在后台运行frps服务端:
nohup ./frps -c ./frps.ini &
然后按control-c退出即可。可以使用jobs命令查看后台是否有运行。如果没有,则运行./frps -c ./frps.ini, 如果显示端口被占用,则参考https://www.jianshu.com/p/b672b4ab5519, 使用netstat -tanlp命令找到对应的进程并kill掉,然后重新在后台启动
(2)启动内网服务器fprc客户端
打开terminal,输入如下命令:
nohup ./frpc -c ./frpc.ini &
3.5 ssh登录服务器
有以下两种方法:
(1) ssh –p 6000 [内网机用户名]@[云服务器公网ip]
(2) ssh -oPort=6000 [内网机用户名]@[云服务器公网ip]
密码是内网机的密码。frp 会将请求 [云服务器公网ip]:6000 的流量转发到内网机器的 22 端口。
3.6 文件传输
scp -r -P 6000 ./文件 [内网机用户名]@[云服务器公网ip]:/home/
即,需要指定端口,注意: P为大写字母, ssh登陆时为小写字母
4. frp工作原理
(1) frp服务端运行,监听一个主端口7000,等待frp客户端的连接;
(2) 客户端运行,连接到服务端的主端口7000,同时告诉服务端要监听的端口6000和转发类型tcp;
(3) 服务端fork新的进程监听客户端指定的端口6000;
(4) 外网用户连接到客户端指定的服务端的端口6000,服务端通过和客户端的连接将数据转发到客户端;
(5) frp客户端进程再将数据转发到本地服务(即内网机器),从而实现内网对外暴露服务的能力。