概述

参考:

愚人BLOG:利用反向代理搭建内网穿透

知乎-波哥:彻底理解正向代理、反向代理、透明代理

首先大白话搞清楚两个专业名词

正、反向代理

正反向代理首先作为代理一定是相对服务器而言的。

正向代理,一般情况下,如果没有特别说明,代理技术默认说的是正向代理技术,比如科学上网技术。

反向代理,正是本文涉及到的技术手段,目的是从一个内网的外部去访问内网内部主机,当然一般情况下是访问不进去的,但使用了反向代理服务器就可以做到,此方式如何打开防火墙/网关?其实是内部主机主动向反向代理服务器发送请求后,反向代理服务器与内网客户端建立了一个链接,此时的反向代理服务器就可以通过防火墙/网关对内网设备(前提是发起过对反向代理服务器的请求)发起请求。

内网穿透

首先一般情况下,处于内网的你的主机,比如手机电脑接入互联网通过dhcp获取本地地址一定会是一个内网地址,肯定不会是公网地址,此时的地址是不能被外界访问的,但可以主动向外网地址发起请求,此时正好建立了一个链接,正在被你请求的公网地址是可以对你发请求的。但如果公网IP或者处于另一个内网的人想请求你主机上的服务,比如你搭建的网站,此时是不能被它们访问的,如果访问过来的话,就会被你的网关阻止,此时我们正好就需要一个概念叫做内网穿透

此方案巧妙的解决了,另一个公网IP或者处于另一个内网的人想请求你内网主机上的服务难题,但需要另一个拥有公网地址的服务器,比如我申请了一台云服务器,搭建了frps,写下配置frps监听端口7000,此端口就是让你的内网主机访问这个公网主机的7000端口,访问成功就代表,我的内网主机和云服务器建立了一个链接,即可以相互接收和发送请求,并不会被网关给关门外,此时的frps正好就在云服务器担任了一个代理服务器的角色,此角色会接收另一个公网IP或者处于另一个内网的人的请求,正好他请求的80端口,此时frps会把80端口接收到的数据发向你的内网主机,但你的内网主机也需要将这个请求代理转发到我的内网服务器8080端口。这样你的主机才能处理请求返回响应给云服务器再转发给另一个内网的人,请求和相应包会带有各自包的发送端口和接收端口,这样才能保证发送端口和接收端口对应,于是无论frps/frpc就需要配置各自的配置文件以满足frp代理会重新打包数据更改相应的收发包的IP和端口,以满足链接之间的主机通讯。

ngrok

之前用的内网穿透工具,早都(2015年)不开源了,处于安全考虑最后还是换成了frp。

参考:

GitHub-inconshreveable:ngrok

frp

一直开源的,配置参考愚人BLOG:利用反向代理搭建内网穿透

参考:

愚人BLOG:利用反向代理搭建内网穿透

GitHub-fatedier:frp

frp官方文档

多个服务反向代理至公网主机

结合frp官方文档通过自定义域名访问内网的 Web 服务,可知一个frpc可以监听多个本地服务,将多个服务按照、域名、端口、等划分。

可见我的配置可以这么写

frp/conf/frps.ini

1
2
[common]
bind_port = 1668

frp/conf/frpc.ini

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[common]
server_addr = x.x.x.x
server_port = 1668

[wx] # 不一定要填ssh,具体看是代理的啥服务自己起名
type = tcp
local_ip = 127.0.0.1
local_port = 8088
remote_port = 80

[h5]
type = tcp
local_ip = localhost
local_port = 8080
remote_port = 808

此时启动frp服务,就会请求x.x.x.x:1668,分别将本地8088、8080的服务转发至x.x.x.x的80、808端口。