本文主要介绍使用frp进行内网穿透,达到随时可以登录PVE管理界面的效果。

1、准备工作

1、首先你需要一台有固定公网的服务器,速度不能太差,可以自己买个VPS,美西、阿里云、腾讯云都可以,hostloc.com里面很多介绍。
2、一个域名,免费的也可以。
3、我们去frp的官网下载最新稳定版,https://github.com/fatedier/frp/releases,本文服务器端采用Centos7,所以下载frp_0.52.3_linux_amd64.tar.gz版本。
4、frp本质是一个转发软件,配置简单性能优秀。服务端是转发用的,相当于中间人,客户端是你要转发出去的网站。

2、服务器端的安装(以VPS为例)

1、解压刚才下载的压缩包,将下面两个文件使用WinSCP上传到VPS服务器:

frps
frps.toml

我在/usr/local下新建了frp文件夹,我准备把它安装在这里,所以上传到这个文件夹,注意文件夹拥有者,都要选root,因为后面SSH登录服务器执行命令的用户名就是root,如果后面程序无法启动,可以检查下是不是这里出错了。

上传的文件注意修改权限:

2、然后我们修改frps.toml,来配置连接端口。
以文本打开,直接修改为:

bindPort = 8500
vhostHTTPSPort = 8700

auth.token = "QWER654321"

第一个是frp服务基本端口,第二个是HTTPS转发端口,因为PVE管理界面是基于HTTPS的,所以我们需要添加这个,端口号这个可以根据自身情况修改。最后一个相当于登录密码,防止瞎猫碰上死耗子,QWER654321请自行修改。

改好后我们还要在防火墙中放行85008700端口,不然连不上。我为了方便起见,选用了宝塔BT服务器面板,在面板里面找到安全,在右边填上端口,点击放行,搞定。

3、现在我们要临时运行下frp看有没有报错,执行:

cd /usr/local/frp     //你自己的安装位置
./frps -c ./frps.toml

返回

[root@wiki-hk-web frp]# ./frps -c ./frps.toml
2023/11/26 22:19:07 [I] [root.go:102] frps uses config file: ./frps.toml
2023/11/26 22:19:08 [I] [service.go:200] frps tcp listen on 0.0.0.0:8500
2023/11/26 22:19:08 [I] [service.go:276] https service listen on 0.0.0.0:8700
2023/11/26 22:19:08 [I] [root.go:111] frps started successfully

OK,配置没有问题,Ctrl+C结束运行,那么设置下让他自启动吧。

4、首先在VPS安装systemdnano

# 使用 yum 安装 systemd nano(CentOS/RHEL)
yum install systemd
yum install nano

# 使用 apt 安装 systemd nano(Debian/Ubuntu)
apt install systemd
apt install nano

生成服务文件:

sudo nano /etc/systemd/system/frps.service

粘贴以下文件:

[Unit]
# 服务名称,可自定义
Description = frp server
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
# 启动frps的命令,需修改为您的frps的安装路径
ExecStart = /usr/local/frp/frps -c /usr/local/frp/frps.toml

[Install]
WantedBy = multi-user.target

然后使用Ctrl+O保存,Ctrl+X退出,设置开机启动:

sudo systemctl enable frps

后面可以通过以下命令管理frp:

# 启动frp
sudo systemctl start frps
# 停止frp
sudo systemctl stop frps
# 重启frp
sudo systemctl restart frps
# 查看frp状态
sudo systemctl status frps

3、PVE客户端安装FRP

1、通过WinSCP登录PVE的服务器,我们还是在/usr/loca下新建frp文件夹,权限要求和上面一样。把

frpc
frpc.toml

拷贝进去,这两个文件的权限和服务器端要求一样,编辑frpc.toml文件,写入如下:

serverAddr = "VPS的IP"
serverPort = 8500
auth.token = "QWER654321"
loginFailExit = false

[[proxies]]
name = "PVE WEB"
type = "https"
localPort = 8006
customDomains = ["你的域名"]

serverPortauth.token要和VPS内的配置一致,不然连不上。你的域名记得在宝塔面板左边的网站添加站点绑定上,选纯静态就行。

客户端是主动连接VPS,所以不需要修改客户端的防火墙。

2、现在测试下frp转发如何

cd /usr/local/frp     //你自己的安装位置 
./frpc -c ./frpc.toml

出现

root@ANNT:/usr/local/frp# ./frpc -c ./frpc.toml
2023/11/26 22:53:44 [I] [root.go:139] start frpc service for config file [./frpc.toml]
2023/11/26 22:53:45 [I] [service.go:299] [325dd1b6e6d1b389] login to server success, get run id [325dd1b6e6d1b389]
2023/11/26 22:53:45 [I] [proxy_manager.go:156] [325dd1b6e6d1b389] proxy added: [PVE WEB]
2023/11/26 22:53:45 [I] [control.go:173] [325dd1b6e6d1b389] [PVE WEB] start proxy success

OK,通过https://你的域名:8700访问下,看是不是已经转发成功了那。

3、现在运行Ctrl+C结束,我们开始让frp在客户机上也开机运行。
安装systemdnano

# 使用 yum 安装 systemd nano(CentOS/RHEL) 
yum install systemd 
yum install nano 

# 使用 apt 安装 systemd nano(Debian/Ubuntu)
apt install systemd 
apt install nano

创建 frpc.service 文件:

sudo nano /etc/systemd/system/frpc.service

写入:

[Unit]
# 服务名称,可自定义
Description = frpc daemon
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
# 启动frps的命令,需修改为您的frps的安装路径
ExecStart = /usr/local/frp/frpc -c /usr/local/frp/frpc.toml
#Restart=on-success
#RestartSec=180s

[Install]
WantedBy = multi-user.target

这里我要单独说下上面代码中的Restart=on-successRestartSec=180s。一般我们装PVE的主机都会在里面新建个虚拟机装个爱快,让爱快来负责拨号,这就导致一个问题:PVE实体机启动完成后还没有网络,要等虚拟机爱快启动拨号完成后才有网络,这会导致frp在实体机启动后无法连接服务端,导致其退出(退出时状态码为0),后面也不会重新连接,比较麻烦。frp一旦断开连接或没有网络都会自动退出,也不会重新连接,这没法达到我们无人值守的目的,所以我在代码里引入了Restart=on-success,它的作用是当检测到程序以正常模式终止时(退出时状态码为0),自动重新启动服务,所以frp启动后没有网络自动退出,后面就可以让它再启动,RestartSec=180s表示 Systemd 重启服务之前,需要等待的秒数,180秒足够爱快拨号了。但是这样也导致了一个问题,使用sudo systemctl stop命令也会在180秒后自动重启服务,因为他的状态码也是0,所以大家注意。如果你的PVE不用于拨号,那么可以删除这两个参数。
现在我直接在frpc.toml中添加了loginFailExit = false参数,客户端在无法连接服务端时会一直尝试重新连接,上面的问题就全部解决了。

然后使用Ctrl+O保存,Ctrl+X退出,然后运行:

sudo systemctl enable frpc

到此,客户端开机自启动就配置完成了,后面可以通过:

# 启动frp
sudo systemctl start frpc
# 停止frp
sudo systemctl stop frpc
# 重启frp
sudo systemctl restart frpc
# 查看frp状态
sudo systemctl status frpc

管理了。

参考文献:
https://gofrp.org/zh-cn/docs/overview/
https://sspai.com/post/60852
https://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two.html

最后修改:2023 年 12 月 03 日
如果觉得我的文章对你有用,请随意赞赏