本文主要记录了使用基于Docker的Lanproxy搭建内网穿透服务的过程,其中包括服务端和客户端的详细配置,并且基于宝塔面板的Nginx实现域名绑定、反向代理与SSL。
本文主要内容:
- 1. 解决的问题
- 2. 硬件与开发环境
- 2.1 内网主机(客户端)
- 2.2 公网云服务器(服务端)
- 2.3 域名(可选)
- 3. 实现原理
- 4. 服务器端配置
- 4.1 安装Lanproxy服务端
- 4.2 Lanproxy服务端的基本配置
- 4.3 可选操作
- 5. 内网主机配置
- 5.1 下载配置Lanproxy客户端
- 5.2 启动Lanproxy客户端
- 6. 测试内网穿透
- 7. 域名绑定
- 7.1 域名绑定
- 7.2 反向代理
- 7.3 开启SSL
1. 解决的问题
本地开发的项目,身在千里之外的朋友如何访问?
本地支付接口如何调试?
通过本教程,这些问题都将得到解决。
本教程将介绍如何搭建内网穿透服务(NAT穿透服务),将没有公网IP的主机映射至公网,实现任意地点访问内网的主机。
2. 硬件与开发环境
注:以下环境是本教程推荐使用的,复现较简单。但这不是必须的,均有其他实现方案。
2.1 内网主机(客户端)
内网主机,可以通俗的理解为自己的笔记本、主机等。
本教程的内网主机使用的是Windows10
的主机,并且正在运行一个通过localhost
可以访问的项目。
本教程内网主机使用的开发环境如下。
环境 | 说明 |
---|---|
Java | 版本要求1.7及以上环境。 |
Maven | 可选 |
网卡 | 必须可以连接到互联网 |
2.2 公网云服务器(服务端)
本教程以
阿里云ECS服务器
为例。
本教程云服务器推荐使用的开发环境如下。
环境 | 说明 |
---|---|
公网IP | 云服务器必须具有公网IP 地址。 |
Docker | 需要掌握Docker的基本使用方法。 |
Docker Compose | 需要掌握Docker Compose的基本使用方法。 |
Nginx | 不配置域名与SSL,可不用。 |
2.3 域名(可选)
如果使用域名,域名必须
备案
。如果不使用域名,则可以使用IP地址:端口
的形式,进行测试访问。
3. 实现原理
首先我们定义内网主机(客户端)和公网云服务器(服务端)的IP信息。
硬件 | 角色 | IP | 系统 |
---|---|---|---|
内网主机 | 客户端 | 127.0.0.1 | Windows10 |
公网云服务器 | 服务端 | 140.143.88.88 | Ubuntu20.04 |
实现的内网穿透的基本原理是这样的:
1、用户访问服务器公网IP;
2、服务器响应用户的访问请求,根据配置信息,将用户的请求信息转发至内网主机;
3、内网主机处理用户请求,将请求结果返回给云服务器;
4、云服务器将请求结果转发给用户。
其基本的数据流是 公网←→云服务器←→内网
。
在整个过程中,云服务器与内网主机之间是始终保持通信的。
这也就导致使用第三方的内网穿透服务,存在数据包经过对方服务器所引发的数据安全性问题。
4. 服务器端配置
4.1 安装Lanproxy服务端
在开始之前,请先保证云服务器已经安装了Docker和Docker Compose。
如果不使用Docker,可以使用普通的Java方式安装运行。
1、创建项目目录
在 /usr/local/docker
目录下,新建名为lanproxy
的文件夹,然后进入该文件夹。如下图所示:
2、创建Docker Compose文件
在lanproxy
文件夹内,使用vi
命令新建一个名为docker-compose.yml
的文件,写入如下信息并保存。
version: '3.1'
services:
lanproxy-client:
# 镜像地址
image: franklin5/lanproxy-server
container_name: lanproxy-server
environment:
# 配置你的账号
- LANPROXY_USERNAME=input_username
# 配置你的密码
- LANPROXY_PASSWORD=input_password
volumes:
# 用于保存创建的配置文件,避免重启服务后配置消失
- ./config-data:/root/.lanproxy
ports:
- 9000:8090 # 左:服务器(宿主机)的IP,也是访问地址;右:容器地址
- 4900:4900 # 左:服务器(宿主机)的IP;右:容器地址
- 4993:4993 # 左:服务器(宿主机)的IP;右:容器地址
- 9001-9100:9001-9100 # 这里添加100组端口映射,后续用来添加映射
restart: always # 始终重启
其中每一项配置的说明,见注释。
这里重点记住容器地址为8090的端口所对应的宿主机的端口。
如上实例,需要记住9000端口,这说明可以通过 140.143.88.88:9000 访问服务端。
这些端口需要在云服务器控制台的安全组中开放。
3、启动Docker容器
在lanproxy
目录下,使用如下命令启动Docker容器:
docker-compose up -d
首次启动时,会下载几个十几M的镜像文件。
后续再次启动,则无需下载,直接运行,如下图所示。
显示done后,表明服务端启动成功。
4.2 Lanproxy服务端的基本配置
1、访问后台
浏览器通过140.143.88.88:9000即可访问服务端的后台,其中用户号和密码是在前文yml文件中自定义的。
2、添加客户端
访问添加客户端
左侧菜单,输入任意客户端名称
,随机生成秘钥
,点击提交
即可。
在客户端管理
菜单下,可以看到已添加的客户端。
这里的客户端秘钥需要记住,后续会用到。
3、配置端口
访问菜单配置管理,进入已添加的我的台式机客户端菜单下,进行配置的添加。
一共需要配置3个信息,每个信息均有详细说明,如下图所示。
- 代理名称:随意输入
- 公网端口:指的是服务器的端口。前面我们已经开放了9000~9100的端口,其中9000已用,则可以填这之间的其他任意端口。
- 内网主机IP:内网主机项目的访问IP。比如本机某项目的访问地址是localhost:8080,则填写 127.0.0.1:8080。
提交。如下图所示。
如上图的配置实例,最终实现的效果是公网访问 140.143.88.88:9001 可以访问内网主机的 127.0.0.1:9010 的项目。
至此,服务端配置完毕。
4.3 可选操作
服务器配置完成后,再前往服务器查看lanproxy
文件夹下的配置文件,会发现多了一个JSON格式的配置文件,其存放的就是我们刚才配置的信息。
主要是保证下次启动Docker项目时,数据不会遗失。
5. 内网主机配置
5.1 下载配置Lanproxy客户端
1、下载客户端
访问 https://file.nioee.com/d/2e81550ebdbd416c933f/ ,下载名为 proxy-java-client-0.1.zip 的Java客户端压缩包,然后解压,如下图所示。
2、配置客户端
打开conf
文件夹下的config.properties
文件,按下图所示配置key
和host
5.2 启动Lanproxy客户端
3、启动客户端
Windows系统下,双击运行 bin
文件夹下的startup.bat
批处理命令,如下图所示。
4、验证连接
然后访问服务端
,刷新页面,客户端列表
中的内网主机已在线
,表明内网主机
和云服务器
连接成功。
6. 测试内网穿透
我们内网主机已经运行了一个9010端口的项目, 如下图所示。
内网访问是正常的。
然后使用服务器的公网IP+端口的形式访问,如下图所示。
至此,互联网上的任何设备,均可以通过此地址访问我们内网的项目。
7. 域名绑定
在以上的所有操作中,我们的Lanproxy服务端,内网主机项目均使用IP+端口的形式进行访问。
在实际的开发中,比如本机支付接口的调试,这是行不通的。
接下来我们基于宝塔面板的Nginx
,实现域名绑定、端口映射与SSL(https)。
在进行接下来的操作之前,需要有以下资料:
- 云服务器安装
宝塔面板
(当然通过纯Nginx配置也可以实现,这里不讲) - 1个
已备案的域名
(分2个子域名,分别绑定Lanproxy服务端和内网主机项目) - 1个Nginx类型的
SSL证书
(用来开启https访问)
7.1 域名绑定
宝塔面板
的网站
菜单下,点击添加站点
,输入域名
,PHP版本
选择纯静态
,如下图所示。
然后就可以使用此域名+9000端口,访问服务端后台了。
同时添加一个dev.XXXX.com
的域名,就可以使用此域名+9001端口,访问内网主机的项目了。
7.2 反向代理
接下来分别为两个域名添加反向代理,如下图所示。
然后,就可以只使用域名访问啦,如下图所示。
7.3 开启SSL
接下来将dev域名的证书信息,添加至宝塔面板中,如下图所示。
可以强制开启https。
然后访问dev的域名,将直接跳转至https
开头的网址,如下图所示。
至此,关于域名的相关配置完成。
参考:
- https://github.com/ffay/lanproxy
- https://hub.docker.com/r/franklin5/lanproxy-server