frp内网穿透服务搭建

背景

回家后不方便登录校园网,但是仍有同学需要访问实验室服务器进行实验等其他任务。

遂通过frp搭建隧道,使外网可以直接SSH连接校园网中的服务器。

准备

一台公网IP服务器(阿里云、腾讯云等)
实验室内网服务器

安装

包地址

目前可以在 Github 的 Release 页面中下载到最新版本的客户端和服务端二进制文件,所有文件被打包在一个压缩包中。

部署

公用IP服务器部署

  1. 登录阿里云服务器,在 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
  1. 下载完毕,解压
tar -xvf frp_0.43.0_linux_amd64.tar.gz
  1. 解压完毕后进入目录
~ cd /frp_0.43.0_linux_amd64
  1. 解压文件夹内:
  • “frps”、“frps_full.ini”、"frps.ini"是放在服务器端运行的可执行文件和配置文件。

  • “frpc”、“frpc_full.ini”、"frpc.ini"是放在客户端端运行的可执行文件和配置文件。

公用IP服务器配置修改

就是frp服务器配置

  1. 修改配置文件

在具有公网 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  &

其他方法

在后台长期运行,也可以结合其他工具使用,例如 systemdsupervisor

定时检查服务

意外情况可能导致后台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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容