使用frp进行内网穿透连接远程服务器

   这篇博文用于记录如何从外网不借助额外软件从而实现在家中连接到公司的服务器(学校服务器或者电脑)。

  采用ssh root@IP进行连接电脑或者服务器,必须要保证被连接的服务器(或者电脑)与你正在操作的电脑处在同一个局域网中。然而我想要在家中或者在出差路上,连接公司或者学校局域网中服务器就需要做一些操作了,常见的操作是使用vpn,但是设置vpn又有些复杂,或者一些场景下是没有vpn的。这时候我们就可以采用frp进行内网穿透。

一、原理

  frp原理是通过一台可以被公网访问ip的服务器(也可以是电脑)作为中介,将被连接服务器(例如学校服务器A)和自己正在操作的电脑(例如家里的电脑B)进行“连接”,即可以理解成frp程序通过一台可以被公网访问ip的服务器(或者电脑)把身处在两个不同局域网中的两台电脑联结起来了,借用参考网站里的一张图。

 二、准备工作

  为了更好的配置frp,我对一些设备进行了编号:

     1、被连接服务器A(公司电脑,学校服务器)

     2、中介服务器C(可以被公网访问ip的终端,例如阿里云服务器)

     3、想要连接服务器A的电脑B(家里的电脑,想要去连接服务器的电脑)

  当然我们也需要去下载frp的程序压缩包,网址在这里:https://github.com/fatedier/frp/releases,根据不同服务器(电脑)的架构下载对应的压缩包(x86_64下载amd64的包)。这里需要注意的是frp只需要下载到被连接服务器A,以及中介服务器C,电脑B是不需要安装的。下载解压之后,我们可以看到文件里包括有以下的文件:

   (我这里把整个文件夹改名为fps了)

  以上就做完准备工作了。(每台终端设备都需要支持并已经安装好ssh了,具体安装方式百度就好了)

三、中介服务器C配置

  在中介服务器C中我们把frp文件解压之后,进入文件夹(我这里改名为了frp),找到打开frps.ini文件(注意别和frpc.ini看混了)。

bind_port = 7000            # 被连接服务器A(客户端)和中介服务器C(服务端)连接的端口
dashboard_port = 7500       # 中介服务器C(服务端)仪表盘端口
token = 12345678            # 被连接服务器A(客户端)和中介服务器C(服务端)连接时的口令
dashboard_user = admin      # 仪表盘用户名
dashboard_pwd = admin       # 仪表盘密码

  在一些其他攻略里习惯把被连接服务器A——称为frp的客户端,中介服务器C——称为frp的服务端。

  bind_port = 7000:这里主要是用于frp的客户端和frp的服务端进行通信的端口设置
  dashboard_port = 7500:这主要是为了访问frp的服务端仪表面板用的,一会会看到的
  dashboard_user = xxx:登陆frp的服务端仪表面板用的
  dashboard_pwd = xxx:登陆frp的服务端仪表面板用的
  token = 12345678:用于frp的客户端和frp的服务端之间连接时进行口令验证用的
  完成以上配置之后,就可以运行frps程序了。我这里以ubuntu系统为例,只需要在frp文件夹中打开,终端输入:
./frps -c frps.ini

   如果出现这个界面说明中介服务器C的frp配置已经完成了。(这里提醒下大家frps.ini文件是不可以用#作为注释的,因此文件中一定要把#注释删掉,不然会运行结果不一样和上图

  我们可以在浏览器中输入xxxx.xxxx.xxxx.xxxx:7500(中介服务器的公网IP:仪表面板端口号),并输入刚才你设定好的用户名和密码(dashboard_user = admin,dashboard_pwd = admin),就可以得到以下画面了。

   这可以查看frp中的连接情况。(frp作为一款轻量级的反向代理软件其实还有很多功能)。以上就完成了中介服务器C的frp配置。这里要注意到我们不能关闭中介服务器C的frp进程,因此我们也可以使用以下命令行在启动frp程序的时候使其后台启动。

nohup ./frps -c frps.ini &

  如果想关闭frp进程,可以使用kill +pid的方式

四、被连接服务器A配置

  接下来在被连接服务器A上进行frp设置。首先还是需要把frp压缩包(一定要对应服务器A的架构)解压在服务器上,其实可以看到压缩包内文件分布都是一样的,也是有frps.ini,frpc.ini....等等文件,我们需要修改的文件就是frpc.ini(注意不要和frps.ini搞混了)

[common]
server_addr = xxxx.xxx.xxx.xxx  # 中介服务器C的公网IP
server_port = 7000         # 被连接服务器A(客户端)与中介服务器C(服务端)连接的端口
token = 12345678          # 被连接服务器A(客户端)与中介服务器C(服务端)连接时的口令

[ssh]  # 这里可以自己改名字[xxxx]
type = tcp             # 设置连接协议(不用改)
local_ip = 127.0.0.1       # 内部循环IP(不用改)
local_port = 22          # 对应的内部端口
remote_port = 6000        # 中介服务器C需要用来连接的端口

  我们需要注意以下remote_port这个设置,这个端口号指的是中介服务器C会监听remote_port这个端口,如果有其他外部电脑连接中介服务器C的这个端口,那么就等价于连接服务器A的local_port端口。一会我们会在下一节通过SSH连接的时候看到具体使用。

  完成上面配置之后,我们就需要在被连接服务器A上启动frp程序。(注意是启动frpc.ini)

./frpc -c frpc.ini

  

  以上就是启动成功了,我们可以再到中介服务器C中看看端口使用情况。

  在中介服务器C的终端中输入netstat -ntlp就可以看到所有用户运行的程序端口使用情况。

   可以看到6000端口已经处于监听状态了。至此我们就完成了中介服务器C和被连接服务器A的frp设置了。

五、家中电脑B连接服务器A

  接下来就是使用ssh来连接服务器A了,如开头所说,如果没有中介服务器C,我们是没法连接到另一个局域网上服务器A的,但是现在我们可以通过连接中介服务器C的6000端口从而连接到被连接服务器的22端口(也就是ssh连接的默认端口)。

  这里给一下登陆格式,我们应该是

ssh -p 6000 name@xxx.xxx.xxx.xxx

  要注意到这的xxx.xxx.xxx.xxx是中介服务器C的公网IP,但是这里的name是被连接服务器A的用户名(这两个是不一样的,一些攻略没有讲所以被坑了)。这里使用的6000端号是和被连接服务器A中frpc.ini配置文件中的remote_port端口对应的。

  输入的密码也应该是被连接服务器A的name用户的密码,而并不是中介服务器C的密码。

六、总结

  以上就是使用frp程序进行内网穿透进行ssh连接,其实frp程序可以连接其他端口的服务,如果你在服务器A上配置了Web服务我们也可以通过这个方式来完成公网访问,具体操作大同小异,主要是配置文件的修改。

  下面是我记录的一些可能用到的命令,方便自己以后来看:

nohup ./frps -c frps.ini &     # 后台启动
netstat -ntlp   # 查看所有tcp端口连接的服务端口号
ps -ef|grep [程序名]  # 查看相关(程序名)进程状态

 

 

参考网站:

https://sspai.com/post/52523/

https://blog.csdn.net/u013144287/article/details/78589643

frp内网穿透的四种模式:tcp、udp、stcp、xtcp - 诸葛东流博客 (zhuguodong.com)

 

posted @ 2021-10-13 11:09  Circle_Wang  阅读(2104)  评论(0编辑  收藏  举报