手把手,从0搭建一台深度学习的机器【三】实现内网穿透

317 阅读6分钟

上一篇:手把手,从0搭建一台深度学习的机器【二】磁盘分区和挂载

考虑到有时需要远程使用机器,因此便想着通过内网穿透技术,从而能够通过公网访问。

内网穿透工具有很多,而且大部分收费,当然,保障性也好。碰巧作者之前通过腾讯云的活动,购买了一个轻量级的云服务器。因此,我选择了开源的内网穿透工具frp,通过frp工具和云服务器自己搭建一个私有的内网穿透平台。通frp搭建内网穿透,需要有一定的Linux基础,相信大家能够看到这里,这点就毋庸置疑了。

补充,写完这部分内容后发现,读者可能会将客户端服务器端机器以及我最后测试使用的另外一台电脑这几着搞混。因此在这里提前说明一下,后面不懂之处回来查阅即可:

  1. 客户端:这里指的是frp客户端,也就是我们要访问处于内网的那台机器。
  2. 服务器端:这里指的是frp服务器端,也就是处于公网的云服务器。
  3. 机器:也就是我们要访问处于内网的那台机器。
  4. 测试电脑:我们通过该电脑访问frp服务,从而访问处于内网的那台机器。

3.1 frp简介

frp 是一个开源项目, 采用 C/S 模式,将服务端部署在具有公网 IP 的机器上,客户端部署在内网或防火墙内的机器上,通过访问暴露在服务器上的端口,反向代理到处于内网的服务。 在此基础上,frp 支持 TCP, UDP, HTTP, HTTPS 等多种协议,提供了加密、压缩,身份认证,代理限速,负载均衡等众多能力。

项目地址:github.com/fatedier/fr…

文档地址:gofrp.org/docs

项目下载,下面是通过wget方式直接在服务器端下载,也可以在客户机下载然后传输到服务器端。下载时注意下载对应的平台和版本。

wget https://github.com/fatedier/frp/releases/download/v0.42.0/frp_0.42.0_linux_amd64.tar.gz

项目的目录结构如下。该项目包含客户端和服务器端的配置文件和启动工具。以frpc开头的是客户端(client)相关; 以frps开头的是服务器端相关。

  • frpcfrps是客户端/服务器端启动程序的可执行文件。
  • frpc.ini和frps.ini是客户端/服务器端的配置文件
  • systemd是已经配置好的系统工具,可以通过简单配置完成全局配置、开机自启动的等功能。
├── frpc
├── frpc_full.ini
├── frpc.ini
├── frps
├── frps_full.ini
├── frps.ini
├── LICENSE
└── systemd
    ├── frpc.service
    ├── frpc@.service
    ├── frps.service
    └── frps@.service

3.2 frp工作原理

image-20220501154917936

  1. frps服务端运行,监听一个端口((bind_port)),等待客户端的连接

  2. frpc客户端运行,连接到服务端的端口(bind_port),同时告诉服务端要监听的端口(remote_port)和转发类型

  3. 服务端fork新的进程监听客户端指定的端口(remote_port)

  4. 外网用户连接到客户端指定的端口(remote_port),服务端通过和客户端的连接将数据转发到客户端

  5. 客户端进程再将数据转发到本地服务,从而实现内网对外暴露服务的能力。

3.3 服务器端配置

这里所指的服务器端也就是指我的云服务器了。第一步就是下载程序并解压。

# 下载
wget https://github.com/fatedier/frp/releases/download/v0.42.0/frp_0.42.0_linux_amd64.tar.gz

# 解压
sudo tar -axvf frp_0.42.0_linux_amd64.tar.gz 

# 进入解压后的目录
cd frp_0.42.0_linux_amd64

通过vim更改服务器端配置文件sudo vim frps.ini,注意这里的s

[common]
# 绑定的客户段地址,这里设置任意地址
bind_addr = 0.0.0.0
# 服务器端与客户端互相绑定的端口,需要防火墙放行该端口
bind_port = 55555
# frp管理后台的访问端口,通过ip:port,你可以进入frp的后台管理界面
dashboard_port = 55556,需要防火墙放行该端口
# frp管理后台的登录用户名
dashboard_user = admin
# frp管理后台的登录密码,这里以xxx代替,自行更换为复杂的密码
dashboard_pwd = xxxx
# 客户端与服务器端的验证方式,这里指定的token
authentication_method = token
# token密码,这里以xxx代替,自行更换为复杂的密码
token = xxxx
# frp日志配置,日志类别:trace, debug, info, warn, error
# log_file = /var/log/frps.log
# log_level = info 
# log_max_days = 3

我使用的云服务器,因此我通过平台提供的工具,放行了5555端口和5556端口。

设置和启动服务器端的frp服务

# 将相关文件移动到合理位置
sudo mkdir -p /etc/frp
sudo cp frps.ini /etc/frp
sudo cp frps /usr/bin
sudo cp systemd/frps.service /usr/lib/systemd/system/
# 重新加载 systemctl
sudo systemctl daemon-reload 
# 设置开启自启动
sudo systemctl enable frps
# 开启frp服务
sudo systemctl start frps
#关闭命令
sudo systemctl stop frps
# 查看frp运行状态
sudo systemctl status frps

此时,服务器端的frp已经配置完成,你可以通过访问ip:55556来查看运行状态,如下图所示:

image-20220501124804602

3.3 客户端配置

客户端的操作基本和服务器端相同,但是需要注意配置的文件名称! 同样是下载相同的程序,你也可以将刚才下载的程序copy过来,解压到家目录即可。

# 下载
wget https://github.com/fatedier/frp/releases/download/v0.42.0/frp_0.42.0_linux_amd64.tar.gz

# 解压
sudo tar -axvf frp_0.42.0_linux_amd64.tar.gz 

# 进入解压后的目录
cd frp_0.42.0_linux_amd64

通过vim更改配置文件sudo vim frpc.ini,注意这里的c,即client:

[common]
# 服务器端的ip地址
server_addr = ip
# 服务器端与客户端互相绑定的端口,需要防火墙放行该端口,即服务器端配置的 bind_port = 55555
server_port = 55555
# 客户端与服务器端的验证方式,这里指定为token,需要和服务器端相同
authentication_method = token
# token密码,需要和服务器端相同
token = xxxx

# 本机配置,[sshx]若为多台机器,则该x的编号不能重复
[ssh5]
# 通信方式,因为目前仅仅需要通过ssh的方式登录,因此只开通tcp即可
type = tcp
# 本地ip,一般写127.0.0.1即可
local_ip = 127.0.0.1
# ssh端口号
local_port = 22
# 自定义远程登录的端口号,你可以通过访问服务器端的IP:该端口号 登录该服务器,
# 注意服务器的防火墙需要放行该端口
remote_port = 10005

若客户端为多台的话,需要更改的位置有[sshx]分组名称和最后的remote_port端口号。接下来就是文件分配和启动:

# 将相关文件移动到合理位置
sudo mkdir -p /etc/frp
sudo cp frpc.ini /etc/frp
sudo cp frpc /usr/bin
sudo cp systemd/frpc.service /usr/lib/systemd/system/
# 重新加载 systemctl
sudo systemctl daemon-reload 
# 设置开启自启动
sudo systemctl enable frpc
# 开启frp服务
sudo systemctl start frpc

到此位置,frp就都配置完毕了,以下为登录测试阶段,使用ssh等一系列远程登录的软件,假设我们要登录的机器上已经存在帐号C。

ssh -p 10005 C@服务端ip

输入密码,若登录成功,就说明大功告成了!

下一篇:手把手,从0搭建一台深度学习的机器【四】用户权限配置