在前端时间,我使用了Ngrok实现了内网穿透,但是遇到了几个问题:
- 有的时候服务端会莫名其妙崩掉,网上说有可能是内存泄漏问题
- 暂时无法实现多客户端(可能官方支持,但是我没摸索)
- 软件好久不更新了,可能存在着未知的bug和未知的漏洞
- 需要有一个域名
于是,我又把目光投向了frp,发现这个软件真的是太棒了,支持的功能很多、文档很齐全配置相当方便、比较稳定、不需要自己编译并且还在持续更新中。本来觉得不需要这篇文章的,但是算了,还是写吧,因为其中也有一部分坑。
准备工作
- 从这里下载最新的软件。例如我这里服务端和客户端均为amd64架构的Linux系统,所以要下载最新
frp_0.28.0_linux_amd64.tar.gz
版本 - 一台有公网IP的服务器
接下来的的内容大部分均来自frp中文文档
我们这里以以下几个功能介绍如何使用frp。
- 客户端ssh内网穿透
- 客户端http内网穿透
- 客户端远程桌面内网穿透
- 客户端网页管理
- 服务端网页管理
服务器端
我这里服务器为amd64结构,系统为centos
,并使用的是阿里云。
配置
解压上面所提的压缩包,并放置到/usr/local
目录。
1 | cd /usr/local/frp_0.28.0_linux_amd64/ |
在打开的frps.ini
文件中,输入以下内容并保存:
1 | [common] |
解释下上面配置文件的含义:
bind_port:
表示客户端通过7000端口和服务器进行通信vhost_http_port:
表示使用服务端的7002端口访问客户端的http服务dashboard_port:
表示使用服务端的7005端口观察服务器代理情况。
配置完上述内容,打开阿里云服务器的防火墙设置,将70000~70005
端口开放,如下所示。除了7000端口,7002端口和7005端口,其余端口的功能在下面将会介绍。
输入下面指令即可运行:
1 | cd /usr/local/frp_0.28.0_linux_amd64/ |
开机自启
上面的设置方式,关闭运行的终端的话会停止服务。另一方面服务器有的时候,需要重启。那么如何解决这个问题呢?这需要做到开机自启呢?
新建一个 /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 |
|
提示 : 运行sudo vi /etc/init.d/mysetup
之后 !!直接按键盘I
进入编辑模式,然后复制下面内容 然后 “esc” “:” “wq” “!” “回车”
意思是保存退出!
给mysetup
脚本文件权限
1 | cd /etc/init.d |
添加启动服务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 | echo xfce4-session>.xsession |
查看xrdp端口
1 | cd /etc/xrdp/ |
如下图,发现使用的是3389端口。
在另外一台装有windows的电脑,运行cmd,输入mstsc
,输入IP地址192.168.123.187
,用户名zdaiot
,点击连接。如下所示
输入密码后,即可连接到linux客户机。
配置
解压上面所提的压缩包,并放置到/home/zdaiot/software
目录。
1 | cd /home/zdaiot/software/frp_0.28.0_linux_amd64 |
在打开的frpc.ini
文件中输入以下内容
1 | [common] |
这里解释下上面配置的含义:
server_addr:
你服务器的IP地址。注意这里要将xxx.xx.xx.xx
替换为你自己的服务器IP地址。
server_port:
客户端通过7000端口和服务端交互,注意这里的配置要和服务端frps.ini
中bind_port
相同。
admin_port:
客户端可以通过本地7400端口观察本地代理情况
1 | [ssh] |
这几句话的含义为通过远程的7001端口访问本地的ssh服务(22端口)。
1 | [range:tcp_port] |
这几句话的含义为通过远程的7003端口访问本地的3389端口(本地远程桌面端口),通过远程的7004端口访问本地的7400端口(观察本地代理情况端口)。这里需要注意的是,除了ssh端口,其余端口开放的时候,要使用[range:tcp_port]
标签,否则的话,不会work。
1 | [web] |
这几句话的含义为,通过远程的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 | cd /home/zdaiot/software/frp_0.28.0_linux_amd64 |
若出现类似于下面的内容,则证明成功了。否则检查服务端服务是否开启,服务端和客户端端口是否对应,服务器防火墙是否开放端口了。
开机自启
在/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 | cd /home/zdaiot/software/frp_0.28.0_linux_amd64 |
然后在/etc/init.d/
目录下,新建mysetup.sh
文件,填入以下内容:
1 |
|
修改权限
1 | sudo chmod 755 /etc/init.d/mysetup.sh |
设置启动顺序
1 | cd /etc/init.d |
其中数字95是脚本启动的顺序号,按照自己的需要相应修改即可。在你有多个启动脚本,而它们之间又有先后启动的依赖关系时你就知道这个数字的具体作用了。
卸载启动脚本
1 | cd /etc/init.d |
Windows客户端
开启SSH服务
设置->应用->应用和功能->管理可选功能->添加功能->安装OpenSSH服务器和客户端
。
启动SSH服务
net start sshd
1
2
3net start sshd
OpenSSH SSH Server 服务正在启动 .
OpenSSH SSH Server 服务已经启动成功。停止SSH服务
net stop sshd
1 | net stop sshd |
配置
下载windows版本的frp客户端,其配置方法基本和上面Linux的一致,这里不再赘述。
开机自启
先在你的 Frp 同目录下新建一个文本,并改名为 start.bat。接着,右键编辑这个 start.bat,在里面输入如下内容:
1 | @echo off |
这样的话 Frp 在崩溃、异常退出进程后,将会自动重新启动。如果你想在 Frp 崩溃后直接退出,你可以输入以下内容:
1 | @echo off |
接着利用任务计划程序实现开机自启。
打开开始菜单,输入 “任务计划程序” 将会自动搜索,接着打开它。
点击右侧的 “创建任务”,名称随意填写,安全选项选择 “不管用户是否登录都要运行”,当然你也可以选择 “只在用户登录时运行”。
选择 “不管用户是否登录都要运行” 可以让你的电脑在断电自动启动后自动运行 frp,你就可以远程桌面连接电脑了。
“使用最高权限运行” 也是可选的,根据个人需要可以选上。
最后勾选 “隐藏”,就不会在启动时弹出命令行窗口了。
接着转到 “触发器” 页,点击新建,选择 “启动时”
接着转到 “操作” 页,点击新建,选择 “启动程序” 在程序或脚本一栏选择第一步创建的 start.bat
,下面的 “起始于” 填写 start.bat
的路径(不要包含 start.bat
)
例如你的 start.bat
在 E:\frp\start.bat
,那么你只需要在 “起始于” 填写 E:\frp\
接着返回 “常规” 页,点击确定,此时会要求输入密码,输入你的电脑密码,然后点击确定即可。
以后就会开机自动启动 frp 了,并且不会弹出命令提示符窗口~
但是经常会自动断掉,自己研究发现,可以在上面创建任务时,点击到设置
框,按照如下进行设置:
第三方电脑使用方法
当设置完上述内容后,若服务端和客户端同时开启服务了。我们就可以使用下面指令在另外一台电脑上访问我们内网服务了。
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 | [common] |
需要注意的点为:上面的[common]
部分内容不需要更改。接下来的标签不能和之前的客户端重复,所以这里设置为[ssh1]、[range:tcp_port1]、[web1]
。另外,端口也不能重复,所以这里使用了7006、7007、7008
远程端口访问客户端的ssh、远程桌面、客户端代理情况。最后,在[web1]
标签中,custom_domains
也不能和之前的客户端重复。也就是说,所有客户端均是通过远程的7002
端口访问本地的http服务,不同点在于custom_domains
不同。此时,访问该客户端的http服务,需要在浏览器中输入abc.xxx.com:7002
。