Total Pageviews

Saturday 26 May 2018

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

  • 内网穿透相信是后端开发者经常遇到的需求,可是怎么实现呢?其实有现成的服务:花生壳、ngrok等,但是,最近花生壳宣布,免费版的内网穿透将不支持80端口映射了,而免费版的ngrok也不够稳定,于是乎,我就开始需找新的解决方案了.
    本文使用了docker、nginx,要全部搞懂的话需要一定的后端基础(当然,基本上入个门就可以了),个人认为还是有一定阅读门槛的,但是你如果只是想把服务搭建起来,按照步骤来做是不难的.

1、概述

内网穿透其实就是用服务器做一个中转,将请求转发,本文记录了在ubuntu 16.04上,基于docker搭建的内网穿透服务
1.1、原理
内网穿透的原理:
  1. 用户访问我们的服务器,这个服务器是有公网IP的,所以用户可以无压力访问
  2. 服务器与本地电脑保持长链接,当有请求的时候,服务器将请求转发到我们的本地电脑
  3. 本地电脑将响应回复给服务器
  4. 服务器将响应回复给用户

1.2、实现
要搭建内网穿透,我们得完成两个任务
  1. 在公网能访问的服务器上运行我们的内网穿透服务;
  2. 在本地电脑上面运行内网穿透客户端。
当然,你可以自己根据原理实现一套,不过我们有现成的三方开源工具,可以帮我们实现这一套功能。这个就是我们今天的主角 lanproxy。(https://github.com/ffay/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,这里,我就把自己写的放出来吧,大家可以拿去用着,传送门
这里我修改了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.yourdomain.com -> 用来访问lanproxy后端

test.yourdomain.com -> 用来访问内网穿透服务
2.1.4配置nginx反向代理
将两个域名解析到我们的服务器之后,再通过反向代理,将其反代到我们的lanproxy端口
下面配置的最终效果就是:
  • 我们可以通过lanproxy.yourdomain.com访问lanproxy后台
  • 我们可以通过test.yourdomain.com访问本地电脑映射的服务
lanproxy.yourdomain.com.conf:
server {
    listen 80;
    # 这里使用自己的域名
    server_name lanproxy.yourdomain.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.yourdomain.com.conf:
server {
    listen 80;
    # 这里使用自己的域名
    server_name test.yourdomain.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后台页面,添加客户端和映射信息
  • 打开 http://lanproxy.yourdomain.com
  • 用前面conf/config.properties文件中配置的账号和密码登录后台
  • 添加一个客户端,记住客户端密钥
  • 添加完客户端之后添加一个配置,配置如下图:

到此,服务端的配置就完成了。下面开始本地电脑的配置。
2.2.1 运行要被映射的服务
既然要把内网的服务映射出去,那首先就要把本地电脑的服务跑起来吧,不然拿什么来映射?这里就很多操作方法了,各个语言都不一样,把自己的服务跑起来就行.
2.2.2 运行本地电脑映射客户端程序(lanproxy client)
这里有两个方法,一个方法是使用官网提供的go版本,不需要安装java环境在本地电脑上,另外一种是使用官网提供的java版本,这里我使用java版本的。
  1. 克隆lanproxy代码到本地电脑
    $ git clone https://github.com/ffay/lanproxy 
    
  2. 打包lanproxy
    打包之前需要确保你安装了maven
    $ cd lanproxy
    $ mvn package
    
  3. 修改配置文件信息
    打包完成之后,客户端文件会出现在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
    
  4. 启动客户端
    客户端信息配置完成之后就可以启动客户端了
    # mac/linux使用这个
    $ bash  bin/startup.sh
    
    # Windows 直接运行 bin/startup.bat
    
  5. 访问测试
    按照前面的配置,这时候我们应该是可以通过test.yourdomain.com来访问我们的内网服务了的,用浏览器打开看看.

3、一点补充

  1. 为什么要使用docker?
    使用docker主要是为了不破坏服务端环境,只是给lanproxy安装了一个jdk8的环境,不影响其他服务继续运行;而且使用docker还可以很方便的转移到其它机器上面部署,只要把Dockerfile拷贝过去就可以了。
  2. 这样搭建,服务器重启的话需要手动重启lanproxy吗?
    不需要,在服务端启动docker容器的脚本下,我添加了--restart unless-stopped参数,只要docker服务启动了,容器就会跟着启动,如果你不需要这个需求,可以去掉这个参数.

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

    一款带Web管理面板的内网穿透工具:lanproxy使用教程

今天找Frp管理面板的时候,无意间发现了lanproxy内网穿透工具,自带Web管理面板,让我们在服务端配置方便了很多,而且一个服务端可以支持多个客户端连接,看起来还不错,这里就分享下。

简介

lanproxy是一个将局域网个人电脑、服务器代理到公网的内网穿透工具,目前仅支持tcp流量转发,可支持任何tcp上层协议,可用作访问内网网站、本地支付接口调试、SSH访问、远程桌面等等,而且带Web在线管理面板,添加端口配置十分简单。

相关链接

服务端安装

服务端需要安装在一个有公网IP的服务器上,系统为Linux/Windows均可。
1、安装JAVA
java版本至少为1.7,查看命令为java -version
2、Linux系统安装
首先下载发布包,服务端发布包下载地址:点击进入
#下载最新发布包
wget -O lanproxy-server-20171116.zip 'https://seafile.io2c.com/d/3b1b44fee5f74992bb17/files/?p=/lanproxy-server/lanproxy-server-20171116.zip&dl=1'
#解压发布包
unzip lanproxy-server-20171116.zip
然后编辑配置文件conf/config.properties,参考如下:
server.bind=0.0.0.0

#与代理客户端通信端口
server.port=4900

#ssl相关配置
server.ssl.enable=true
server.ssl.bind=0.0.0.0
server.ssl.port=4993
server.ssl.jksPath=test.jks
server.ssl.keyStorePassword=123456
server.ssl.keyManagerPassword=123456

#这个配置可以忽略
server.ssl.needsClientAuth=false

#WEB在线配置管理相关信息
config.server.bind=0.0.0.0
config.server.port=8090
config.admin.username=admin
config.admin.password=admin
运行lanproxy
cd /root/proxy-server*/bin
chmod +x startup.sh
./startup.sh
然后打开地址http://ip:8090,使用上面配置中配置的用户名密码登录,进入Web管理面板,且配置数据存放在~/.lanproxy/config.json文件中。
#如果打不开Web界面,就需要开启防火墙,一般CentOS系统出现情况最多
#Centos 6系统
iptables -I INPUT -p tcp --dport 8090 -j ACCEPT
service iptables save
service iptables restart

#CentOS 7系统
firewall-cmd --zone=public --add-port=8090/tcp --permanent 
firewall-cmd --reload
3、Windows系统安装
方法参考上面,只是启动的时候双击bin文件夹里的startup.bat即可运行。

客户端使用

客户端一般安装在一个内网的VPS服务器或Windows电脑上使用。这里说下JAVA和非JAVA两个客户端的使用方法,客户端下载地址:点击进入
1、配置服务端
首先我们通过http://ip:8090进入服务端Web管理界面,先添加客户端,名称随便填。
然后点击刚刚添加的客户端名称,再添加配置,设置公网端口,后端IP:端口
截图的配置意思是将内网的888端口映射到服务器的8080端口,也就是访问服务器ip:8080等于访问内网ip:888
这时候基本配置好了一个客户端节点,且该节点可以供多个客户端使用。
2、JAVA客户端使用
本版本需要安装java,且版本依然至少为1.7,查看命令为java -version
然后进入客户端下载地址,下载lanproxy-java-client.zip,再将文件解压到服务器或者Windows电脑上,编辑conf/config.properties配置文件,修改如下:
#与在proxy-server配置后台创建客户端时填写的秘钥保持一致;
client.key=
ssl.enable=true
ssl.jksPath=test.jks
ssl.keyStorePassword=123456

#这里填写实际的proxy-server地址;没有服务器默认即可,自己有服务器的更换为自己的proxy-server(IP)地址
server.host=lp.thingsglobal.org

#proxy-server ssl默认端口4993,默认普通端口4900
#ssl.enable=true时这里填写ssl端口,ssl.enable=false时这里填写普通端口
server.port=4993
最后运行lanproxy
#运行方法可参考服务端运行步骤
linuxmac)系统:直接进入bin目录,然后运行startup.sh脚本
windows系统:直接双击bin目录下的startup.bat
3、非JAVA客户端使用
该方法可以不用安装java即可在客户端运行lanproxy,首先下载对应版本的JAVA客户端,然后解压出来,再运行以下命令:
#以下需要使用的参数是服务端IP,服务端端口,客户端密匙
1、普通端口连接
#mac 64位
nohup ./client_darwin_amd64 -s SERVER_IP -p SERVER_PORT -k CLIENT_KEY &
#linux 64位
nohup ./client_linux_amd64 -s SERVER_IP -p SERVER_PORT -k CLIENT_KEY &
#windows 64 位
./client_windows_amd64.exe -s SERVER_IP -p SERVER_PORT -k CLIENT_KEY

2、SSL端口连接
#mac 64位
nohup ./client_darwin_amd64 -s SERVER_IP -p SERVER_SSL_PORT -k CLIENT_KEY -ssl true &
#linux 64位
nohup ./client_linux_amd64 -s SERVER_IP -p SERVER_SSL_PORT -k CLIENT_KEY -ssl true &
#windows 64 位
client_windows_amd64.exe -s SERVER_IP -p SERVER_SSL_PORT -k CLIENT_KEY -ssl true
这里单独说下Windows电脑使用方法,首先按住Win+R,输入cmd进入命令窗口。
#如果你将客户端exe文件解压到了D盘的RATS文件夹,则使用命令进入RATS文件夹
cd /d d:\RATS
#如果你是SSL端口连接,先替换自己的IP,端口,CLIENT_KEY后运行,普通端口命令参考上面
client_windows_amd64.exe -s SERVER_IP -p SERVER_SSL_PORT -k CLIENT_KEY -ssl true
最后客户端运行后,服务端Web界面的配置状态显示在线即连接成功.
如果显示不在线检查下防火墙端口和配置是否正确什么的。
-----------------------------

Lanproxy is a reverse proxy to help you expose a local server behind a NAT or firewall to the internet. it supports any protocols over tcp (http https ssh ...) 

Lanproxy-go-client

go client for lanproxy

QuickStart

Download precompiled Releases.
./client_darwin_amd64 -s SERVER_IP -p SERVER_PORT -k CLIENT_KEY
eg: nohup ./client_darwin_amd64 -s lp.thingsglobal.org -p 4900 -k 01c1e176d6ee466c8db717a8 &
GLOBAL OPTIONS:
   -k value       client key
   -s value       proxy server host
   -p value       proxy server port (default: 4900)
   --ssl value    enable ssl (default: "false", -p value should be server ssl port)
   --cer value    ssl cert path, default skip verify certificate
   --help, -h     show help
   --version, -v  print the version

Install from source

$go get -u github.com/ffay/lanproxy-go-client/src/main

All precompiled releases are genereated from build-release.sh script.

No comments:

Post a Comment