Centos搭建Frp实现内网穿透

在前端时间,我使用了Ngrok实现了内网穿透,但是遇到了几个问题:

  • 有的时候服务端会莫名其妙崩掉,网上说有可能是内存泄漏问题
  • 暂时无法实现多客户端(可能官方支持,但是我没摸索)
  • 软件好久不更新了,可能存在着未知的bug和未知的漏洞
  • 需要有一个域名

于是,我又把目光投向了frp,发现这个软件真的是太棒了,支持的功能很多、文档很齐全配置相当方便、比较稳定、不需要自己编译并且还在持续更新中。本来觉得不需要这篇文章的,但是算了,还是写吧,因为其中也有一部分坑。

准备工作

  • 这里下载最新的软件。例如我这里服务端和客户端均为amd64架构的Linux系统,所以要下载最新frp_0.28.0_linux_amd64.tar.gz版本
  • 一台有公网IP的服务器

接下来的的内容大部分均来自frp中文文档

我们这里以以下几个功能介绍如何使用frp。

  • 客户端ssh内网穿透
  • 客户端http内网穿透
  • 客户端远程桌面内网穿透
  • 客户端网页管理
  • 服务端网页管理

服务器端

我这里服务器为amd64结构,系统为centos,并使用的是阿里云。

配置

解压上面所提的压缩包,并放置到/usr/local目录。

1
2
cd /usr/local/frp_0.28.0_linux_amd64/
vi frps.ini

在打开的frps.ini文件中,输入以下内容并保存:

1
2
3
4
5
6
7
8
9
10
[common]
bind_port = 7000
vhost_http_port = 7002

# 设置本地网页端观察服务器代理情况
[common]
dashboard_port = 7005
# dashboard 用户名密码,默认都为 admin
dashboard_user = admin
dashboard_pwd = admin

解释下上面配置文件的含义:

  • bind_port:表示客户端通过7000端口和服务器进行通信
  • vhost_http_port:表示使用服务端的7002端口访问客户端的http服务
  • dashboard_port:表示使用服务端的7005端口观察服务器代理情况。

配置完上述内容,打开阿里云服务器的防火墙设置,将70000~70005端口开放,如下所示。除了7000端口,7002端口和7005端口,其余端口的功能在下面将会介绍。

输入下面指令即可运行:

1
2
cd /usr/local/frp_0.28.0_linux_amd64/
./frps -c ./frps.ini

开机自启

上面的设置方式,关闭运行的终端的话会停止服务。另一方面服务器有的时候,需要重启。那么如何解决这个问题呢?这需要做到开机自启呢?

新建一个 /usr/local/frp_0.28.0_linux_amd64/start.sh 文件,然后输入下面内容。

1
/usr/local/frp_0.28.0_linux_amd64/frps -c /usr/local/frp_0.28.0_linux_amd64/frps.ini

我的frp软件放置到了/usr/local/frp_0.28.0_linux_amd64目录

给权限:

1
chmod 755 /usr/local/frp_0.28.0_linux_amd64/start.sh

新建mysetup启动脚本文件

1
sudo vi /etc/init.d/mysetup

文件内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/sh
#chkconfig:2345 70 30
#description:mysetup

frp_path=/usr/local/frp_0.28.0_linux_amd64
case "$1" in
start)
echo "start frp service.."
sh ${frp_path}/start.sh
;;
*)
exit 1
;;
esac

提示 : 运行sudo vi /etc/init.d/mysetup之后 !!直接按键盘I进入编辑模式,然后复制下面内容 然后 “esc” “:” “wq” “!” “回车”意思是保存退出!

mysetup脚本文件权限

1
2
cd /etc/init.d
chmod 755 mysetup

添加启动服务mysetup,注意要在/etc/init.d这个路径下才能执行下面命令,并且--add后面加的内容为你的脚本名,例如我这里的脚本名为mysetup

1
chkconfig --add mysetup

测试服务是否能启动成功

1
service mysetup start

查看自启动的服务 是否有 mysetup !!

1
chkconfig

执行这个代码如果出现后面的就OK了!! mysetup 0:off 1:off 2:on 3:on 4:on 5:on 6:off

服务器frp的服务端开机自动启动成功了!!!

Linux客户端

我这里的客户端也是amd64架构,Ubuntu系统。

Ubuntu系统默认不安装ssh-server,需要自己手动安装,具体指令如下:

1
sudo apt-get install openssh-server

因为我们想实现远程桌面功能,而Ubuntu默认是没有远程桌面功能的,所以我们需要先介绍下如何搭建Linux远程桌面。

Linux远程桌面搭建

现在我们的需求是客户端为Linux系统,想通过另外一台电脑远程控制该客户机。操作如下:

在客户机上,安装xrdp

1
sudo apt-get -y install xfce4 xrdp vnc4server

配置xfce4桌面会话文件

1
2
echo xfce4-session>.xsession
cat .xsession

查看xrdp端口

1
2
cd  /etc/xrdp/
gedit xdrp.ini

如下图,发现使用的是3389端口。

在另外一台装有windows的电脑,运行cmd,输入mstsc,输入IP地址192.168.123.187,用户名zdaiot,点击连接。如下所示

输入密码后,即可连接到linux客户机。

配置

解压上面所提的压缩包,并放置到/home/zdaiot/software目录。

1
2
cd /home/zdaiot/software/frp_0.28.0_linux_amd64
vi frpc.ini

在打开的frpc.ini文件中输入以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[common]
server_addr = xxx.xx.xx.xx
server_port = 7000

# 设置本地网页端观察本地代理情况
admin_addr = 127.0.0.1
admin_port = 7400
admin_user = admin
admin_pwd = admin

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 7001

[range:tcp_port]
type = tcp
local_ip = 127.0.0.1
local_port = 3389,7400
remote_port = 7003,7004
use_encryption = false
use_compression = false

[web]
type = http
local_port = 6006
custom_domains = www.aiotwe.com

这里解释下上面配置的含义:

server_addr:你服务器的IP地址。注意这里要将xxx.xx.xx.xx替换为你自己的服务器IP地址。

server_port:客户端通过7000端口和服务端交互,注意这里的配置要和服务端frps.inibind_port相同。

admin_port:客户端可以通过本地7400端口观察本地代理情况

1
2
3
4
5
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 7001

这几句话的含义为通过远程的7001端口访问本地的ssh服务(22端口)。

1
2
3
4
5
6
7
[range:tcp_port]
type = tcp
local_ip = 127.0.0.1
local_port = 3389,7400
remote_port = 7003,7004
use_encryption = false
use_compression = false

这几句话的含义为通过远程的7003端口访问本地的3389端口(本地远程桌面端口),通过远程的7004端口访问本地的7400端口(观察本地代理情况端口)。这里需要注意的是,除了ssh端口,其余端口开放的时候,要使用[range:tcp_port]标签,否则的话,不会work。

1
2
3
4
[web]
type = http
local_port = 6006
custom_domains = www.xxx.com

这几句话的含义为,通过远程的7002端口(在服务端frps.ini文件中的vhost_http_port设置)访问客户端6006端口处的网页服务。若不设置custom_domains参数,则需要使用xxx.xx.xx.xx:7002访问客户端6006端口处的网页服务。在设置完custom_domains参数后,我们就可以使用www.xxx.com:7002访问客户端6006端口处的网页服务。当然,你需要将 www.xxx.com 的域名 A 记录解析到 IP xxx.xx.xx.xx,如果服务器已经有对应的域名,也可以将 CNAME 记录解析到服务器原先的域名。

这里之所以使用本地的6006端口,是因为tensorboard默认打开的就是6006端口。这样就可以实现远程查看自己神经网络炼丹炼的如何了。

开启客户端服务器:

1
2
cd /home/zdaiot/software/frp_0.28.0_linux_amd64
./frpc -c ./frpc.ini

若出现类似于下面的内容,则证明成功了。否则检查服务端服务是否开启,服务端和客户端端口是否对应,服务器防火墙是否开放端口了。

开机自启

/home/zdaiot/software/frp_0.28.0_linux_amd64目录,新建start.sh文件。在该文件中填入下面信息:

1
/home/zdaiot/software/frp_0.28.0_linux_amd64/frpc -c frpc.ini

添加可执行权限:

1
2
cd /home/zdaiot/software/frp_0.28.0_linux_amd64
chmod +x start.sh

然后在/etc/init.d/目录下,新建mysetup.sh文件,填入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/sh
### BEGIN INIT INFO
# Provides: land.sh
# Required-start: $local_fs $remote_fs $network $syslog
# Required-Stop: $local_fs $remote_fs $network $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: starts the svnd.sh daemon
# Description: starts svnd.sh using start-stop-daemon
### END INIT INFO

#任务脚本
#进入要执行脚本目录
cd /home/zdaiot/software/frp_0.28.0_linux_amd64
#取得root权限,'123'为密码,不用加引号,'ls'无实际作用
echo 123|sudo -S ls
#执行脚本./start.sh,sudo -S需要加上
/home/zdaiot/software/frp_0.28.0_linux_amd64/start.sh
#任务脚本

修改权限

1
sudo chmod 755 /etc/init.d/mysetup.sh

设置启动顺序

1
2
cd /etc/init.d
sudo update-rc.d mysetup.sh defaults 95

其中数字95是脚本启动的顺序号,按照自己的需要相应修改即可。在你有多个启动脚本,而它们之间又有先后启动的依赖关系时你就知道这个数字的具体作用了。

卸载启动脚本

1
2
cd /etc/init.d
sudo update-rc.d -f mysetup.sh remove

Windows客户端

开启SSH服务

设置->应用->应用和功能->管理可选功能->添加功能->安装OpenSSH服务器和客户端

  • 启动SSH服务net start sshd

    1
    2
    3
    net start sshd
    OpenSSH SSH Server 服务正在启动 .
    OpenSSH SSH Server 服务已经启动成功。
  • 停止SSH服务net stop sshd

1
2
net stop sshd
OpenSSH SSH Server 服务已成功停止。

配置

下载windows版本的frp客户端,其配置方法基本和上面Linux的一致,这里不再赘述。

开机自启

先在你的 Frp 同目录下新建一个文本,并改名为 start.bat。接着,右键编辑这个 start.bat,在里面输入如下内容:

1
2
3
4
@echo off
:home
frpc -c frpc.ini
goto home

这样的话 Frp 在崩溃、异常退出进程后,将会自动重新启动。如果你想在 Frp 崩溃后直接退出,你可以输入以下内容:

1
2
3
@echo off
frpc -c frpc.ini
exit

接着利用任务计划程序实现开机自启。

打开开始菜单,输入 “任务计划程序” 将会自动搜索,接着打开它。

img

点击右侧的 “创建任务”,名称随意填写,安全选项选择 “不管用户是否登录都要运行”,当然你也可以选择 “只在用户登录时运行”。

选择 “不管用户是否登录都要运行” 可以让你的电脑在断电自动启动后自动运行 frp,你就可以远程桌面连接电脑了。

“使用最高权限运行” 也是可选的,根据个人需要可以选上。

最后勾选 “隐藏”,就不会在启动时弹出命令行窗口了。

img

接着转到 “触发器” 页,点击新建,选择 “启动时”

img

接着转到 “操作” 页,点击新建,选择 “启动程序” 在程序或脚本一栏选择第一步创建的 start.bat,下面的 “起始于” 填写 start.bat 的路径(不要包含 start.bat

例如你的 start.batE:\frp\start.bat,那么你只需要在 “起始于” 填写 E:\frp\

img

接着返回 “常规” 页,点击确定,此时会要求输入密码,输入你的电脑密码,然后点击确定即可。

以后就会开机自动启动 frp 了,并且不会弹出命令提示符窗口~

但是经常会自动断掉,自己研究发现,可以在上面创建任务时,点击到设置框,按照如下进行设置:

image-20210104224846342

第三方电脑使用方法

当设置完上述内容后,若服务端和客户端同时开启服务了。我们就可以使用下面指令在另外一台电脑上访问我们内网服务了。

SSH连接到内网电脑,假设内网电脑用户名为zdaiot。注意下面的-p中的p为小写。xxx.xx.xx.xx为你服务端的IP地址。

1
ssh -p 7001 zdaiot@xxx.xx.xx.xx

SFTP连接到内网电脑,假设内网电脑用户名为zdaiot。注意下面的-P中的P为大写。xxx.xx.xx.xx为你服务端的IP地址。

1
sftp -P 7001 zdaiot@xxx.xx.xx.xx

访问客户端6006端口网页服务:在浏览器中输入xxx.xx.xx.xx:7002,或者www.xxx.com:7002。其中xxx.xx.xx.xx为你的服务器IP地址,www.xxx.com为指向服务端的域名。

访问客户端远程桌面服务:在另外一台装有windows的电脑,运行cmd,输入mstsc,输入IP地址xxx.xx.xx.xx:7003或者www.xxx.com:7003,用户名zdaiot,点击连接。其中xxx.xx.xx.xx为你的服务器IP地址,www.xxx.com为指向服务端的域名。如下所示

输入密码后,即可连接到linux客户机。

观察客户端代理情况:在浏览器中输入xxx.xx.xx.xx:7004,或者www.xxx.com:7004。其中xxx.xx.xx.xx为你的服务器IP地址,www.xxx.com为指向服务端的域名。

观察服务端代理情况:在浏览器中输入xxx.xx.xx.xx:7005,或者www.xxx.com:7005。其中xxx.xx.xx.xx为你的服务器IP地址,www.xxx.com为指向服务端的域名。

多客户端使用方法

之前就想过若是只有一个服务器,怎么才能使用让多台客户端使用呢?今天终于实现了这个功能。具体为,更改另外一个客户端的frpc.ini配置文件,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[common]
server_addr = xxx.xx.xx.xx
server_port = 7000

# 设置本地网页端观察本地代理情况
admin_addr = 127.0.0.1
admin_port = 7400
admin_user = admin
admin_pwd = admin

[ssh1]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 7006

[range:tcp_port1]
type = tcp
local_ip = 127.0.0.1
local_port = 3389,7400
remote_port = 7007,7008
use_encryption = false
use_compression = false

[web1]
type = http
local_port = 6006
custom_domains = abc.xxx.com

需要注意的点为:上面的[common]部分内容不需要更改。接下来的标签不能和之前的客户端重复,所以这里设置为[ssh1]、[range:tcp_port1]、[web1]。另外,端口也不能重复,所以这里使用了7006、7007、7008远程端口访问客户端的ssh、远程桌面、客户端代理情况。最后,在[web1]标签中,custom_domains也不能和之前的客户端重复。也就是说,所有客户端均是通过远程的7002端口访问本地的http服务,不同点在于custom_domains不同。此时,访问该客户端的http服务,需要在浏览器中输入abc.xxx.com:7002

参考

frp中文文档
Windows 下 Frp 设置开机自动启动
win10 开启ssh server服务 远程登录

------ 本文结束------
坚持原创技术分享,您的支持将鼓励我继续创作!

欢迎关注我的其它发布渠道