详解基于docker搭建lanproxy内网穿透服务

文档更新说明

2018年04月06日 v1.0

内网穿透相信是后端开发者经常遇到的需求,可是怎么实现呢?其实有现成的服务:花生壳、ngrok等,但是,最近花生壳宣布,免费版的内网穿透将不支持80端口映射了,而免费版的ngrok也不够稳定,于是乎,我就开始需找新的解决方案了

本文使用了docker、nginx,要全部搞懂的话需要一定的后端基础(当然,基本上入个门就可以了),个人认为还是有一定阅读门槛的,但是你如果只是想把服务搭建起来,按照步骤来做是不难的

1、概述

内网穿透其实就是用服务器做一个中转,将请求转发,本文记录了在 ubuntu 16.04 上,基于 docker 搭建的内网穿透服务

1.1、原理

内网穿透的原理如下图所示:

  1. 用户访问我们的服务器,这个服务器是有公网IP的,所以用户可以无压力访问
  2. 服务器与本地电脑保持长链接,当有请求的时候,服务器将请求转发到我们的本地电脑
  3. 本地电脑将响应回复给服务器
  4. 服务器将响应回复给用户

1.2、实现

要搭建内网穿透,我们得完成两个任务

在公网能访问的服务器上运行我们的内网穿透服务; 在本地电脑上面运行内网穿透客户端。

当然,你可以自己根据原理实现一套,不过我们有现成的三方开源工具,可以帮我们实现这一套功能。这个就是我们今天的主角 lanproxy

2、实现步骤

现成的工具已经找到,接下来就是简单的搭建一下了,搭建过程分为服务端和本地电脑端

2.1、服务端流程:

  1. 在服务器上安装 dockernginx
  2. 在服务器上通过 docker 运行 lanproxy server
  3. 将域名解析到我们的服务器
  4. 配置 nginx 反向代理
  5. 打开 lanproxy 后台页面,添加客户端和映射信息

2.2、本地电脑流程:

  1. 运行要被映射的服务
  2. 运行本地电脑映射客户端程序( lanproxy client )

下面开始服务端的配置:

2.1.1、在服务器上安装 dockernginx

nginx 的安装是很简单的,一个命令就搞定

docker 也可以使用脚本安装,也是一句命令的事

# 1、安装nginx
$ sudo apt-get install nginx

# 2、安装docker
$ curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

# 可选步骤,建docker源修改为阿里云
$ sudo mkdir -p /etc/docker
$ sudo tee /etc/docker/daemon.json <<-'EOF'
{
 # 下面的链接需要到阿里云后台查看,每个人的加速地址是不一样的
 "registry-mirrors": ["https://abcdefg.mirror.aliyuncs.com"]
}
EOF
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

2.1.2 在服务器上通过 docker 运行 lanproxy server

服务安装完毕之后,就可以用docker跑服务了,可以自己写一个 Dockerfile ,这里,我就把自己写的放出来吧,大家可以拿去用着,gayhub 传送门

这里我修改了 proxy-server-0.1 的部分文件,因为在 docker 中,需要保存服务前台运行,否则容器会被 kill 掉,而官网默认的启动脚本是后台启动的,把 bin/startup.sh 里面的启动命令修改成前台启动即可(去掉nohub和后面的1&2 &)

# 1、克隆docker配置,如果要修改配置可以编辑 conf/config.properties 文件,配置方法见lanproxy官网
$ git clone https://github.com/fengqiangboy/lanproxy-docker.git lanproxy-docker

# 2、build docker镜像
$ cd lanproxy-docker
$ sudo bash build_container.sh

# 3、运行docker容器
$ bash run_container.sh

2.1.3 将域名解析到我们的服务器

需要两个域名,一个用来访问我们的 lanproxy 后台,一个用来访问我们需要内网穿透的服务

例如:

lanproxy.fengqiangboy.com -> 用来访问lanproxy后端

test.fengqiangboy.com -> 用来访问内网穿透服务

2.1.4配置 nginx 反向代理

将两个域名解析到我们的服务器之后,再通过反向代理,将其反代到我们的lanproxy端口

下面配置的最终效果就是:

  1. 我们可以通过 lanproxy.fengqiangboy.com 访问 lanproxy
  2. 我们可以通过 test.fengqiangboy.com 访问本地电脑映射的服务

lanproxy.fengqiangboy.com.conf:

server {
  listen 80;
  # 这里使用自己的域名
  server_name lanproxy.fengqiangboy.com;
  charset utf-8;
  location / {
    proxy_set_header  X-Real-IP $remote_addr;
    proxy_set_header  Host   $http_host;
    # 这里根据你的lanproxy配置,改成 config.server.port的值
    proxy_pass    http://127.0.0.1:8090;
    client_max_body_size 35m;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
  }
}

test.fengqiangboy.com.conf:

server {
  listen 80;
  # 这里使用自己的域名
  server_name test.fengqiangboy.com;
  charset utf-8;
  location / {
    proxy_set_header  X-Real-IP $remote_addr;
    proxy_set_header  Host   $http_host;
    # 这里根据你的lanproxy配置,改成 外网接口 的值,在lanproxy后台网页上配置,后面配置
    proxy_pass    http://127.0.0.1:50000;
    client_max_body_size 35m;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
  }
}

2.1.5 打开 lanproxy 后台页面,添加客户端和映射信息

  1. 打开 http://lanproxy.fengqiangboy.com
  2. 用前面 conf/config.properties 文件中配置的账号和密码登录后台
  3. 添加一个客户端,记住客户端密钥
  4. 添加完客户端之后添加一个配置,配置如下图

到此,服务端的配置就完成了。下面开始本地电脑的配置。

2.2.1 运行要被映射的服务

既然要把内网的服务映射出去,那首先就要把本地电脑的服务跑起来吧,不然拿什么来映射?这里就很多操作方法了,各个语言都不一样,把自己的服务跑起来就行

2.2.2 运行本地电脑映射客户端程序( lanproxy client )

这里有两个方法,一个方法是使用官网提供的 go 版本,不需要安装 java 环境在本地电脑上,另外一种是使用官网提供的 java 版本,这里我使用 java 版本的。

克隆 lanproxy 代码到本地电脑

$ git clone https://github.com/ffay/lanproxy.git lanproxy

打包 lanproxy

打包之前需要确保你安装了 maven

$ cd lanproxy
$ mvn package

修改配置文件信息

打包完成之后,客户端文件会出现在 distribution/proxy-client-0.1 目录下,打开之后有是个文件夹: binconfliblog ,配置信息在 conf/config.properties 文件内,根据前面服务端的配置信息修改一下。

# 这里是在lanproxy后台配置的密钥
client.key=key

# 配置ssl信息,根据服务端的配置填写
ssl.enable=true
ssl.jksPath=test.jks
ssl.keyStorePassword=123456

# 服务器的ip
server.host=163.162.161.160

#根据服务端配置,开启ssl的话填写ssl的端口,否则填写普通端口
server.port=4993

启动客户端

客户端信息配置完成之后就可以启动客户端了

# mac/linux使用这个
$ bash bin/startup.sh

# Windows 直接运行 bin/startup.bat

访问测试

按照前面的配置,这时候我们应该是可以通过 test.fengqiangboy.com 来访问我们的内网服务了的,用浏览器打开看看

3、一点补充

为什么要使用docker?

使用docker主要是为了不破坏服务端环境,只是给 lanproxy 安装了一个 jdk8 的环境,不影响其他服务继续运行;而且使用 docker 还可以很方便的转移到其它机器上面部署,只要把 Dockerfile 拷贝过去就可以了。

这样搭建,服务器重启的话需要手动重启 lanproxy 吗?

不需要,在服务端启动 docker 容器的脚本下,我添加了 --restart unless-stopped 参数,只要 docker 服务启动了,容器就会跟着启动,如果你不需要这个需求,可以去掉这个参数

为什么不用花生壳?

前不久看到花生壳的公告,说从4月1日开始,免费版将不提供80端口映射,实际上我用这个映射最大的需求就是做微信调试,去掉80端口就不能做微信调试了,不满足我的需求了,当然,花生壳还是不错的,如果能满足你的需求,还是可以省时省力完成内网穿透的

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • docker中使用mongodb数据库详解(在局域网访问)

    前言 有了docker,基本上就告别了各种软件.数据库的安装,直接从镜像库pull下来,爽,想想以前那真是一个遭罪啊. 这文章就来看一下如何跑mongo的docker镜像,并且可以在局域网访问,内容相对简单,也是记录我的自学过程. 第一步 获得mongo镜像,命令如下, # 拉取mongo镜像 docker pull mongo # 查看本地库mongo镜像 docker images mongo 第二步 启动mongo镜像,如下 # 启动mongo镜像 docker run -itd -P -

  • docker 学习笔记之docker连接网络的设置

    1.如果docker主机不需要通过代理连接外网 则docker的相关命令(如docker search)或docker容器与网络相关的操作都可以正常进行,不需要特殊设置. 2.当docker主机 是通过代理才能连接外网时,采用服务方式启动守护进程 如果docker守护进程是通过服务的方式启动的(sudo start docker) 当我们执行如  docker search ubuntu 命令时,会报错 Error response from daemon: Get https://index.

  • Docker 如何分配宿主机网段 IP

    工作需要临时启动一个 gitlab,无奈 gitlab 需要 ssh 的 22 端口;而使用传统网桥方式映射端口则 clone 等都需要输入端口号,很麻烦;22 端口宿主机又有 sshd 监听;研究了下 docker 网络,记录一下如何分配宿主机网段 IP 创建 macvlan 网络 关于 Docker 网络模式这里不再细说;由于默认的网桥方式无法满足需要,所以需要创建一个 macvlan 网络 复制代码 代码如下: docker network create -d macvlan  --sub

  • Docker容器通过独立IP暴露给局域网的方法

    Docker容器非常轻量,系统开销非常少,比VMware或者VirtualBox用起来方便,部署起来也非常容易.官方推荐我们通过端口映射的方式把Docker容器的服务提供给宿主机或者局域网其他容器使用.一般过程是: 1.Docker进程通过监听宿主机的某个端口,将该端口的数据包发送给Docker容器 2.宿主机可以打开防火墙让局域网其他设备通过访问宿主机的端口进而访问docker的端口 这里以CDNS为例,CDNS是一个用于避免DNS污染的程序,通过CDNS可以把你的计算机变成一个抗污染的DNS

  • Docker 网络模式(四种)详细介绍

    Docker 网络模式 本文首先介绍了Docker自身的4种网络工作方式, Docker作为目前最火的轻量级容器技术,有很多令人称道的功能,如Docker的镜像管理.然而,Docker同样有着很多不完善的地方,网络方面就是Docker比较薄弱的部分.因此,我们有必要深入了解Docker的网络知识,以满足更高的网络需求. 四种网络模式 我们在使用docker run创建Docker容器时,可以用--net选项指定容器的网络模式,Docker有以下4种网络模式: · host模式,使用--net=h

  • Docker网络代理设置详解

    背景 在一些实验室环境,服务器没有直接连接外网的权限,需要通过网络代理.我们通常会将网络代理直接配置在/etc/environment./etc/profile之类的配置文件中,这对于大部分操作都是可行的.然而,docker命令却使用不了这些代理. 比如docker pull时需要从外网下载镜像,就会出现如下错误: $ docker pull hello-world Unable to find image 'hello-world:latest' locally Pulling reposit

  • centos修改docker网络配置方法分享

    在为客户使用docker运行php-fpm的时候,发现有的可以正常连接服务器,有的不可以.经过诊断发现客户端的ip网段和docker创建的默认docker0网卡网段冲突. docker0默认的网络一般都是172.17.0.1/24或192.168.0.1/24.如果客户端的ip是172.17.111.1,则这时候访问基于docker部署的应用的时候,会遇到网络问题. 解决的方案,有两种. 1:使用host模式运行docker,但是需要删除默认的docker0虚拟网卡.在下次docker daem

  • Docker为网络bridge模式指定容器ip的方法

    前言 众所周知bridge模式是Docker默认的网络设置,此模式会为每一个容器分配Network Namespace.设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上.下面来看看Docker为网络bridge模式指定容器ip的方法. 实现方法 如果只是简单创建一个bridge模式的网络是无法给容器指定ip的 [root@vultrvpn conf.d]# docker network create --driver bridge wordpress_net ad1ff3d972

  • docker中使用mysql数据库详解(在局域网访问)

    前言 开发过程中经常需要安装.调试mysql数据库,还需要在各种操作系上安装包依赖,实在是繁琐,因此就研究了一下如何在docker上运行一个mysql镜像,省却了我安装.找依赖的问题. 注:本文所有内容均在CentOS Linux release 7.2.1511 (Core) 上测试完成 假设,你已经安装好docker.如果没有安装好docker可以参考centos7上安装docker 使用 docker pull mysql 获得mysql镜像,接着使用 docker images 查看镜像

  • Docker 容器指定自定义网段的固定IP/静态IP地址

    Docker容器指定自定义网段的固定IP/静态IP地址 第一步:创建自定义网络 备注:这里选取了172.172.0.0网段,也可以指定其他任意空闲的网段 docker network create --subnet=172.172.0.0/16 docker-ice 注:docker-ice为自定义网桥的名字,可自己任意取名. 第二步:在你自定义的网段选取任意IP地址作为你要启动的container的静态IP地址 备注:这里在第二步中创建的网段中选取了172.172.0.10作为静态IP地址.这

随机推荐