考虑到有时需要远程使用机器,因此便想着通过内网穿透技术,从而能够通过公网访问。
内网穿透工具有很多,而且大部分收费,当然,保障性也好。碰巧作者之前通过腾讯云的活动,购买了一个轻量级的云服务器。因此,我选择了开源的内网穿透工具frp
,通过frp工具和云服务器自己搭建一个私有的内网穿透平台。通frp搭建内网穿透,需要有一定的Linux基础,相信大家能够看到这里,这点就毋庸置疑了。
补充,写完这部分内容后发现,读者可能会将
客户端
、服务器端
、机器
以及我最后测试使用的另外一台电脑这几着搞混。因此在这里提前说明一下,后面不懂之处回来查阅即可:
客户端
:这里指的是frp客户端,也就是我们要访问处于内网的那台机器。服务器端
:这里指的是frp服务器端,也就是处于公网的云服务器。机器
:也就是我们要访问处于内网的那台机器。测试电脑
:我们通过该电脑访问frp服务,从而访问处于内网的那台机器。
3.1 frp简介
frp 是一个开源项目, 采用 C/S 模式,将服务端部署在具有公网 IP 的机器上,客户端部署在内网或防火墙内的机器上,通过访问暴露在服务器上的端口,反向代理到处于内网的服务。 在此基础上,frp 支持 TCP, UDP, HTTP, HTTPS 等多种协议,提供了加密、压缩,身份认证,代理限速,负载均衡等众多能力。
文档地址: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
开头的是服务器端相关。
frpc
和frps
是客户端/服务器端启动程序的可执行文件。- 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工作原理
-
frps服务端运行,监听一个端口((bind_port)),等待客户端的连接
-
frpc客户端运行,连接到服务端的端口(bind_port),同时告诉服务端要监听的端口(remote_port)和转发类型
-
服务端fork新的进程监听客户端指定的端口(remote_port)
-
外网用户连接到客户端指定的端口(remote_port),服务端通过和客户端的连接将数据转发到客户端
-
客户端进程再将数据转发到本地服务,从而实现内网对外暴露服务的能力。
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
来查看运行状态,如下图所示:
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
输入密码,若登录成功,就说明大功告成了!