背景
回家后不方便登录校园网,但是仍有同学需要访问实验室服务器进行实验等其他任务。
遂通过frp搭建隧道,使外网可以直接SSH连接校园网中的服务器。
准备
一台公网IP服务器(阿里云、腾讯云等)
实验室内网服务器
安装
包地址
目前可以在 Github 的 Release 页面中下载到最新版本的客户端和服务端二进制文件,所有文件被打包在一个压缩包中。
部署
公用IP服务器部署
- 登录阿里云服务器,在 home 目录下 执行 wget命令下载
wget https://github.com/fatedier/frp/releases/download/v0.43.0/frp_0.43.0_linux_amd64.tar.gz
如果出现
ERROR: cannot verify github.com's certificate, issued by ‘CN=DigiCert TLS Hyb rid ECC SHA384 2020 CA1,O=DigiCert Inc,C=US’:
Unable to locally verify the issuer's authority.
To connect to github.com insecurely, use `--no-check-certificate'.
使用以下方式下载:
wget https://github.com/fatedier/frp/releases/download/v0.43.0/frp_0.43.0_freebsd_amd64.tar.gz --no-check-certificate
- 下载完毕,解压
tar -xvf frp_0.43.0_linux_amd64.tar.gz
- 解压完毕后进入目录
~ cd /frp_0.43.0_linux_amd64
- 解压文件夹内:
“frps”、“frps_full.ini”、"frps.ini"是放在服务器端运行的可执行文件和配置文件。
“frpc”、“frpc_full.ini”、"frpc.ini"是放在客户端端运行的可执行文件和配置文件。
公用IP服务器配置修改
就是frp服务器配置
- 修改配置文件
在具有公网 IP 的机器上部署 frps后,修改 frps.ini 文件,这里使用了最简化的配置,设置了 frp 服务器用户接收客户端连接的端口:
vi frps.ini
[common]
bind_port = 7000
其他配置方法
vi frps.ini
[common]
bind_addr=0.0.0.0
bind_port = 7000
token=12345678
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = admin123
说明:
"bind_addr"是服务器本地IP,不改。
"bind_port"是frp监听端口。
"token"是验证token建议设置上。
"dashboard_port"是frp面板端口。
“dashboard_user”"dashboard_pwd"是面板的账户密码。
除了"bind_addr"参数之外的其他参数,都可以根据需求自行修改,务必记住改过的参数。
配置项中用到的端口,需要在服务器上开启
内网服务器部署
与公网IP服务器部署操作相同
内网服务器配置修改
就是修改frp客户端服务器配置
在需要被访问的内网机器上(SSH 服务通常监听在 22 端口)部署 frpc,修改 frpc.ini 文件,假设 frps 所在服务器的公网 IP 为 x.x.x.x:
[common]
server_addr = x.x.x.x
server_port = 7000
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
local_ip 和 local_port 配置为本地需要暴露到公网的服务地址和端口。remote_port 表示在 frp 服务端监听的端口,访问此端口的流量将会被转发到本地服务对应的端口。
启动
编写配置文件后,分别启动 frps 和 frpc。
- 先通过
./frps -c ./frps.ini
启动服务端(公网IP服务器)
启动成功日志
2022/05/29 21:47:44 [I] [root.go:200] frps uses config file: ./frps.ini
2022/05/29 21:47:44 [I] [service.go:194] frps tcp listen on 0.0.0.0:7000
2022/05/29 21:47:44 [I] [root.go:209] frps started successfully
- 再通过
./frpc -c ./frpc.ini
启动客户端(内网服务器)
启动成功日志
2022/05/29 22:05:20 [I] [service.go:349] [7a66655c123dcec2] login to server success, get run id [7a66655c123dcec2], server udp port [0]
2022/05/29 22:05:20 [I] [proxy_manager.go:144] [7a66655c123dcec2] proxy added: [ssh]
2022/05/29 22:05:20 [I] [control.go:181] [7a66655c123dcec2] [ssh] start proxy success
出现启动失败,请见下文常见问题
通过 SSH 访问内网机器,假设用户名为 test:
ssh -oPort=6000 test@x.x.x.x
frp 会将请求 x.x.x.x:6000 的流量转发到内网机器的 22 端口。
后台长期运行
终端模式下,中断关闭,frp服务也会关闭,需要启用后台进程运行。
服务端后台运行
nohup ./frps -c frps.ini >/dev/null 2>&1 &
客户端后台运行
./frpc.-c ./frpc.ini &
其他方法
在后台长期运行,也可以结合其他工具使用,例如 systemd 和 supervisor
。
定时检查服务
意外情况可能导致后台frp服务中断,需要定时检查出现进程退出及时重启。
shell脚本
frpc_check.sh
#!/bin/bash
ps -fe|grep frpc.ini |grep -v grep
if [ $? -ne 0 ];then
./frpc -c ./frpc.ini &
else
echo "frpc IS Running"
fi
frps_check.sh
#!/bin/bash
ps -fe|grep frpc.ini |grep -v grep
if [ $? -ne 0 ];then
./frps -c ./frps.ini &
else
echo "frps IS Running"
fi
$?:
最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;
如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确,或者无结果
crond 定时任务启动
crond-e
编辑:每隔五分钟执行frp服务检查
*/5 * * * * sh frpc_check.sh
常见问题
问题1:
输入
./frps -c ./frps.ini
报错
bash: ./frps: Permission denied
解决方法
sudo ./frps -c ./frps.ini
问题2
输入
sudo ./frps -c ./frps.ini
报错
sudo: ./frps: command not found
解决方法
sudo chmod 777 frps
问题3
如何关闭frp?
#锁定进程并杀死
ps -aux|grep frp
kill -9 frpPID
问题4
输入
./frps -c ./frps.ini
报错
Segmentation fault
安装包版本问题,下载指定版本
问题5
多端口映射:
#frpc.ini
[range:test_tcp]
type = tcp
local_ip = 127.0.0.1
local_port = 6000-6005,6007
remote_port = 6000-6005,6007
实际连接成功后会创建 7 个 proxy,命名为 test_tcp_0, test_tcp_1 ... test_tcp_6。
相关连接
frp (gofrp.org)
https://blog.csdn.net/weixin_57351182/article/details/118598853