Ngrok+Doker+Nginx 实现内网穿透
场景使用:通过在公共端点和本地运行的 Web 服务器之间建立一个安全的通道,实现内网主机的服务可以暴露给外网。ngrok 可捕获和分析所有通道上的流量,便于后期分析和重放,所以ngrok可以很方便地协助服务端程序测试。
环境要求:
linux服务器:公网访问的linux服务器,我这边使用的是阿里云和腾讯云
备案域名。映射内网的域名,我这边使用二级域名:s1.ljp123.cn,并且将域名的A记录解析到这台公网的linux服务器
一、安装ngrok
安装go语言环境
yum -y install zlib-devel openssl-devel perl hg cpio expat-devel gettext-devel curl curl-devel perl-ExtUtils-MakeMaker hg wget gcc gcc-c++ git //请下载合适自己的go语言包 wget https://storage.googleapis.com/golang/go1.8.3.linux-amd64.tar.gz tar -C /usr/local -xzf go1.8.3.linux-amd64.tar.gz vim /etc/profile //添加以下内容: export PATH=$PATH:/usr/local/go/bin source /etc/profile //检测是否安装成功go go version
下载ngrok源码包
mkdir -p /data/ngrok cd /data/ngrok git clone https://github.com/inconshreveable/ngrok.git
生成访问证书,我的域名是s1.ljp123.cn
cd /data/ngrok mkdir cert cd cert openssl genrsa -out rootCA.key 2048 openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=s1.ljp123.cn" -days 5000 -out rootCA.pem openssl genrsa -out device.key 2048 openssl req -new -key device.key -subj "/CN=s1.ljp123.cn" -out device.csr openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000
覆盖原本证书
cd /data/ngrok/cert yes|cp rootCA.pem /data/ngrok/ngrok/assets/client/tls/ngrokroot.crt yes|cp device.crt /data/ngrok/ngrok/assets/server/tls/snakeoil.crt yes|cp device.key /data/ngrok/ngrok/assets/server/tls/snakeoil.key
编译生成ngrok服务端
cd /data/ngrok/ngrok
GOOS=linux GOARCH=amd64 make release-server
运行测试
cd /data/ngrok/ngrok ./bin/ngrokd -tlsKey="assets/server/tls/snakeoil.key" -tlsCrt="assets/server/tls/snakeoil.crt" -domain="s1.ljp123.cn" -httpAddr=":6000" -httpsAddr=":6001" -tunnelAddr=":6002" #参数说明: #-domain 访问ngrok是所设置的服务地址生成证书时那个 #-httpAddr http协议端口 默认为80 #-httpsAddr https协议端口 默认为443 (可配置https证书) #-tunnelAddr 通道端口 默认4443
客户端编译和使用,编译生成win64位客户端(其他自行编译测试)
GOOS=windows GOARCH=amd64 make release-client #编译成功后会在ngrok/bin/下面生成一个windows_amd64目录下面有ngrok.exe #Linux 平台 32 位系统:GOOS=linux GOARCH=386 #Linux 平台 64 位系统:GOOS=linux GOARCH=amd64 #Windows 平台 32 位系统:GOOS=windows GOARCH=386 #Windows 平台 64 位系统:GOOS=windows GOARCH=amd64 #MAC 平台 32 位系统:GOOS=darwin GOARCH=386 #MAC 平台 64 位系统:GOOS=darwin GOARCH=amd64 #ARM 平台:GOOS=linux GOARCH=arm
配置客户端ngrok.cfg文件
server_addr: "s1.ljp123.cn:6002" trust_host_root_certs: false tunnels: truck: subdomain: "truck" proto: http: "127.0.0.1:8090" truck_api: remote_port: 6004 proto: tcp: "127.0.0.1:8090" test.ljp123.cn: hostname: "test.ljp123.cn" proto: http: "192.168.38.100:8092" https: "192.168.38.100:8092"
启动客户端(Windows系统)
E: cd E:\Internet\ljp123.cn\ngrok1 ngrok.exe -config=ngrok.cfg -log=log\ngrok.log start-all ngrok -config=ngrok.cfg start truck #启动truck服务 ngrok -config=ngrok.cfg start truck truck_api #同时启动两个服务 ngrok -config=ngrok.cfg start-all #启动所有服务
启动客户端(linux系统)
./ngrok -config=ngrok.cfg -log=logs/ngrok.log start-all
二、安装Docker环境
安装docker
yum -y install docker
启动docker服务
systemctl start docker.service
开机启动docker服务
systemctl enable docker.service
创建Dockerfile文件
cd /data/ngrok/ngrok vim Dockerfile #输入以下文件内容 FROM ubuntu:16.04 MAINTAINER liangjinhong ENV NGROK /opt/ngrok ENV DOMAIN s1.ljp123.cn //替换你自己的域名 EXPOSE 80 443 4443 COPY ngrok/bin/ngrokd $NGROK/ COPY cert/device.crt $NGROK/ssl.crt COPY cert/device.key $NGROK/ssl.key COPY cert/device.csr $NGROK/ssl.csr COPY run.sh $NGROK/ RUN chmod +x $NGROK/run.sh CMD .$NGROK/run.sh
创建run.sh文件
cd /data/ngrok/ngrok vim run.sh #输入以下文件内容 /opt/ngrok/ngrokd -tlsCrt="/opt/ngrok/ssl.crt" -tlsKey="/opt/ngrok/ssl.key" -domain="s1.ljp123.cn" -log="/opt/ngrok/logs/s1.log"
生成镜像
cd /data/ngrok/ngrok //$REPO_NAME 你的 repo名称 //$TAG 你的镜像 tag //docker build -t $REPO_NAME:$TAG . docker build -t ngrok1:test .
查看生成的镜像
[root@ngrok1 ngrok]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE ngrok1 test 56b909295025 6 days ago 125 MB docker.io/ubuntu 16.04 4a689991aa24 4 weeks ago 116 MB
运行容器
docker run -d --restart always --name s1 -v /var/log/ngrokd:/opt/ngrok/logs/ -p 6000:80 -p 6001:443 -p 6002:4443 -p 6003:6003 -p 6004:6004 -p 6005:6005 -p 6006:6006 -p 6007:6007 -p 6008:6008 -p 6009:6009 -p 6010:6010 -p 6011:6011 -p 6012:6012 -p 6013:6013 -p 6014:6014 -p 6015:6015 -p 6016:6016 -p 6017:6017 -p 6018:6018 -p 6019:6019 -p 6020:6020 -p 6021:6021 -p 6022:6022 -p 6023:6023 -p 6024:6024 -p 6025:6025 -p 6026:6026 -p 6027:6027 -p 6028:6028 -p 6029:6029 -p 6030:6030 ngrok1:test
三、安装nginx
yum install nginx
配置代理域名
cd /etc/nginx/conf.d/ vim ljp123.conf #输入以下文件内容 #ngrok服务开始 map $scheme $proxy_port { "http" "6000"; "https" "6001"; default "6000"; } server { listen 80; listen 443 ssl; server_name *.s1.ljp123.cn; location / { proxy_pass $scheme://127.0.0.1:$proxy_port; } ssl_certificate ssl/ljp123/ssl.crt; ssl_certificate_key ssl/ljp123/ssl.key; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } #ngrok服务结束
四、尾言
我平时启动顺序为:docker>nginx,这套教程配置没有账号认证,有时间我再增加账号认证的文档
1、关闭ngrok1容器
docker stop s1
2、启动ngrok1容器
docker start s1
3、删除容器
docker rm s1