欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

frp实现内网穿透

程序员文章站 2022-03-29 21:23:17
...

一、frp的作用

实现内网穿透,或者称作反向代理的功能。

  1. 利用处于内网或防火墙后的机器,对外网环境提供 http 或 https 服务。说罢,也就是给外网提供内网主机的http 或 https 服务。

  2. 此外,还能利用处于内网或防火墙后的机器,对外网环境提供 tcp 和 udp 服务,例如在家里通过 ssh 访问处于公司内网环境内的主机。

此处的讲解包括:

  1. 外网访问内网http 或 https 服务
  2. 外网访问内网ssh服务

粗略地理解反向代理(此解释看不懂可直接跳过):

  • 正向代理:假设A是客户端(访问资源的请求方,处于内网中),这里以A所在的网络为内网做为参照,B是代理服务器(数据转发的中间者,既处于内网又处于外网),C是web服务器(接收请求的服务方,对于A来说处于外网中)。由于各种网络原因A无法访问C(可以理解A处于内网中,A与C不在一个网络中,故无法访问),但A能够访问B(A和B处于一个内网中),B能够访问C(B和C都处于一个外网中),那么A就可以通过B做一个桥梁去访问C,即A去访问B,B再去访问C。B在这个过程中就负责转发A和C之间的数据包。当C收到B的请求后,将数据发送回给B,B再转发数据给A,A最终就能得到了想要的数据。

    数据传输的过程图:A—>B—>C---->B----->A

    特点:A向C访问数据时,对于用户来说B是不可见的。比如国内的某个用户想要访问google搜索页面,但由于你懂得的原因是访问不了的。所以他大胆地配置了一台代理服务器,在代理服务器上安装了代理服务软件,并且在自己的本机上安装了代理客户软件,那么他就可以直接在浏览器输入https://www.google.com来访问google搜索页面了,注意,虽然他向google web服务器的请求对于机器来说首先是发送到代理服务器的,但是他并不是输入代理服务器的域名或者ip路径。所以说代理服务器对于用户每次访问外网资源来说是透明不可见的。从这个例子可看出用户访问外网的服务器资源是看似直接正向地访问的,即对用户来说访问外网服务器资源是正向代理的访问过程。

  • 反向代理:与正向代理的原理也是很类似的。这里仍然以A所在的网络为内网做为参照,即各个主机处于内网和外网的概念没有改变,即:A 仍然处于内网中,A和B处于一个内网,B又和C处于一个外网。但此时主机(计算机)角色变了,即:A是web服务器(接收请求的服务方,处于内网中),B是代理服务器(数据转发的中间者,即处于内网又处于外网,角色没有变),C是客户端(访问资源的请求方,处于外网中)。现在变成了C去访问A,由于A处于自己所在的内网中,故C在外网中无法访问(找到)A(C和A不在一个网络中,故无法访问),但C能访问B(C和B都处于一个外网中),B能访问A(B和C都处于一个外网中),故C可以访问B,B再去访问A,A收到请求后将数据发送给B,B再将数据转发给C,C最终获得了想要的数据。

    特点:C访问A的过程中,对于用户来说A是不可见的,可见的只有B。比如:用户通过C访问A的时候,用户只知道B的域名和ip,并不知道A的域名和ip。用户直接发送请求给B,然后B再返回信息给用户,至于B怎么得到的数据,对于用户来说是看不见的。

    数据传输的过程图:C—>B—>A---->B----->C 。 刚好A和C的位置和正向代理中A和C的位置相反,故反向代理由此得出。

二、配置说明

1、实现功能

(1)自定义绑定域名访问内网web服务

2、配置前准备

(1)公网服务器1台
(2)内网服务器1台
(3)公网服务器绑定域名1个
(4)内网服务器部署一个web服务
(5)内网服务器部署安装了ssh服务(如只做web服务,可以省略此步)

三、安装frp

1.通过以下命令下载frp

$ wget https://github.com/fatedier/frp/releases/download/v0.16.1/frp_0.16.1_linux_amd64.tar.gz

2.解压文件

$ tar -zxvf frp_0.16.1_linux_amd64.tar.gz

3.进入解压目录

$ cd frp_0.16.1_linux_amd64

frpsfrps.ini这个两个是服务端文件,frpcfrpc.ini这两个是客户端文件

4.配置服务端

$ vi ./frps.ini
[common]
bind_port = 7000           #与客户端绑定的进行通信的端口
vhost_http_port = 8080     #访问客户端web服务http协议自定义的端口号,如果公网服务器已经搭建占用8080端口的web服务,请自行修改
vhost_https_port = 443    #访问客户端web服务https协议自定义的端口号,如果公网服务器已经搭建占用443端口的web服务,请自行修改

按”i”键进行编辑,按esc退出编辑状态,输入:wq退出

四、公网服务器开启端口

$ firewall-cmd --state #查看当前firewall防火墙服务是否开启

如果防护墙处于关闭状态的话无需进行以下端口号的开放步骤,否则继续。

$ firewall-cmd --list-all  #查看当前firewall服务所有端口开放情况

如果7000端口和8080端口已经开放并且没有进程占用端口的话,则无需进行以下端口号的开放步骤,否则继续。

$ firewall-cmd --permanent --add-port=7000/tcp  #开启与客户端绑定的进行通信的端口
$ firewall-cmd --permanent --add-port=8080/tcp #开启访问客户端web服务自定义的端口号
$ firewall-cmd --reload   #重启防火墙(修改配置后要重启防火墙)

五、启动服务端

临时启动

$ ./frps -c ./frps.ini

后台保持启动

$ nohup ./frps -c ./frps.ini &

六、配置客户端

根据客户端操作系统的情况下载frp客户端

需要注意的是:客户端和服务端的版本号要一致

不同操作系统操作大同小异。以linux为例:

$ vi ./frpc.ini #编辑frpc.ini配置文件
[common]  
#公网服务器ip  
server_addr = 144.34.145.10   
#与服务端bind_port一致    
server_port = 7000              


#公网访问内部web服务器以http方式  
[web]  
#访问协议
type = http   
#内网服务器ip                  
local_ip = 127.0.0.1  
#内网web服务的端口号            
local_port = 8080   
#访问公网服务器域名            
custom_domains = qcmoke.top     


#公网通过ssh访问内网主机(可选,如果不需要可以通过井号注释掉)
[ssh]
type = tcp
#内网服务器ip 
local_ip = 127.0.0.1   
#内网ssh端口
local_port = 22   
#公网服务器开放的处理ssh转发的端口,要确保服务器开放      
remote_port = 7001     

通过以下命令给服务器开放7001端口

# firewall-cmd --permanent --add-port=7001/tcp
# firewall-cmd --reload

所绑定的公网服务器域名,一级、二级域名都可以,绑定多个域名时用英文“,”分开

六、启动客户端(内网端)

临时启动

$ ./frpc -c ./frpc.ini

后台保持启动

$ nohup ./frpc -c ./frpc.ini &

Windows操作系统完成以上类似配置后直接双击运行frpc.exe即可。

如果需要通过ssh访问内网端,则内网端主机还要安装ssh服务,这里的ssh以ubuntu为例:

  • SSH服务端安装

    (1) ubuntu关闭防火墙sudo ufw disable或者放行ssh默认的22端口(关闭防火墙不同linux发行版可能不同)

    (2)查看是否安装ssh, ls /etc/ssh/

    (3)安装openssh-serversudo apt-get install openssh-server

    (4)还没结束,执行sudo vim /etc/ssh/sshd_config编辑sshd_config配置文件,找到 PermitRootLogin并将其值修改为 yes

    (5)执行/etc/init.d/ssh restart重启ssh服务以生效

七、测试http和ssh

  • http:

    浏览器打开访问http://域名:8080/资源路径,如:http://qcmoke.top:8080/myproject/index.html

  • ssh:

    ssh [-p port] [email protected]   #ssh远程连接服务器
    如:
    $ ssh -p 7001 [email protected]
    

sh服务以生效

七、测试http和ssh

  • http:

    浏览器打开访问http://域名:8080/资源路径,如:http://qcmoke.top:8080/myproject/index.html

  • ssh:

    ssh [-p port] [email protected]   #ssh远程连接服务器
    如:
    $ ssh -p 7001 [email protected]