使用Lanproxy搭建内网穿透服务完整教程

本文主要记录了使用基于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的文件夹,然后进入该文件夹。如下图所示:

使用Lanproxy搭建内网穿透服务完整教程_第1张图片

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 访问服务端。

这些端口需要在云服务器控制台的安全组中开放。

使用Lanproxy搭建内网穿透服务完整教程_第2张图片

3、启动Docker容器

lanproxy目录下,使用如下命令启动Docker容器:

docker-compose up -d

首次启动时,会下载几个十几M的镜像文件。

后续再次启动,则无需下载,直接运行,如下图所示。

image-20211119201943969

显示done后,表明服务端启动成功。

4.2 Lanproxy服务端的基本配置

1、访问后台

浏览器通过140.143.88.88:9000即可访问服务端的后台,其中用户号和密码是在前文yml文件中自定义的。

使用Lanproxy搭建内网穿透服务完整教程_第3张图片

2、添加客户端

访问添加客户端左侧菜单,输入任意客户端名称,随机生成秘钥,点击提交即可。

使用Lanproxy搭建内网穿透服务完整教程_第4张图片

客户端管理菜单下,可以看到已添加的客户端。

使用Lanproxy搭建内网穿透服务完整教程_第5张图片

这里的客户端秘钥需要记住,后续会用到。

3、配置端口

访问菜单配置管理,进入已添加的我的台式机客户端菜单下,进行配置的添加。

使用Lanproxy搭建内网穿透服务完整教程_第6张图片

一共需要配置3个信息,每个信息均有详细说明,如下图所示。

使用Lanproxy搭建内网穿透服务完整教程_第7张图片

  • 代理名称:随意输入
  • 公网端口:指的是服务器的端口。前面我们已经开放了9000~9100的端口,其中9000已用,则可以填这之间的其他任意端口。
  • 内网主机IP:内网主机项目的访问IP。比如本机某项目的访问地址是localhost:8080,则填写 127.0.0.1:8080。

提交。如下图所示。

使用Lanproxy搭建内网穿透服务完整教程_第8张图片

如上图的配置实例,最终实现的效果是公网访问 140.143.88.88:9001 可以访问内网主机的 127.0.0.1:9010 的项目。

至此,服务端配置完毕。

4.3 可选操作

服务器配置完成后,再前往服务器查看lanproxy文件夹下的配置文件,会发现多了一个JSON格式的配置文件,其存放的就是我们刚才配置的信息。

使用Lanproxy搭建内网穿透服务完整教程_第9张图片

主要是保证下次启动Docker项目时,数据不会遗失。

5. 内网主机配置

5.1 下载配置Lanproxy客户端

1、下载客户端

访问 https://file.nioee.com/d/2e81550ebdbd416c933f/ ,下载名为 proxy-java-client-0.1.zip 的Java客户端压缩包,然后解压,如下图所示。

使用Lanproxy搭建内网穿透服务完整教程_第10张图片

2、配置客户端

打开conf文件夹下的config.properties文件,按下图所示配置keyhost

使用Lanproxy搭建内网穿透服务完整教程_第11张图片

5.2 启动Lanproxy客户端

3、启动客户端

Windows系统下,双击运行 bin 文件夹下的startup.bat批处理命令,如下图所示。

使用Lanproxy搭建内网穿透服务完整教程_第12张图片

4、验证连接

然后访问服务端,刷新页面,客户端列表中的内网主机已在线,表明内网主机云服务器连接成功。

使用Lanproxy搭建内网穿透服务完整教程_第13张图片

6. 测试内网穿透

我们内网主机已经运行了一个9010端口的项目, 如下图所示。

使用Lanproxy搭建内网穿透服务完整教程_第14张图片

内网访问是正常的。

使用Lanproxy搭建内网穿透服务完整教程_第15张图片

然后使用服务器的公网IP+端口的形式访问,如下图所示。

使用Lanproxy搭建内网穿透服务完整教程_第16张图片

至此,互联网上的任何设备,均可以通过此地址访问我们内网的项目。

7. 域名绑定

在以上的所有操作中,我们的Lanproxy服务端,内网主机项目均使用IP+端口的形式进行访问。

在实际的开发中,比如本机支付接口的调试,这是行不通的。

接下来我们基于宝塔面板的Nginx,实现域名绑定、端口映射与SSL(https)。

在进行接下来的操作之前,需要有以下资料:

  • 云服务器安装宝塔面板(当然通过纯Nginx配置也可以实现,这里不讲)
  • 1个已备案的域名(分2个子域名,分别绑定Lanproxy服务端和内网主机项目)
  • 1个Nginx类型的SSL证书(用来开启https访问)

7.1 域名绑定

宝塔面板网站菜单下,点击添加站点,输入域名PHP版本选择纯静态,如下图所示。

使用Lanproxy搭建内网穿透服务完整教程_第17张图片

然后就可以使用此域名+9000端口,访问服务端后台了。

同时添加一个dev.XXXX.com的域名,就可以使用此域名+9001端口,访问内网主机的项目了。

使用Lanproxy搭建内网穿透服务完整教程_第18张图片

7.2 反向代理

接下来分别为两个域名添加反向代理,如下图所示。

使用Lanproxy搭建内网穿透服务完整教程_第19张图片

使用Lanproxy搭建内网穿透服务完整教程_第20张图片

然后,就可以只使用域名访问啦,如下图所示。

使用Lanproxy搭建内网穿透服务完整教程_第21张图片

7.3 开启SSL

接下来将dev域名的证书信息,添加至宝塔面板中,如下图所示。

使用Lanproxy搭建内网穿透服务完整教程_第22张图片

可以强制开启https。

然后访问dev的域名,将直接跳转至https开头的网址,如下图所示。

使用Lanproxy搭建内网穿透服务完整教程_第23张图片

至此,关于域名的相关配置完成。

参考:

  • https://github.com/ffay/lanproxy
  • https://hub.docker.com/r/franklin5/lanproxy-server

你可能感兴趣的