1. [需求]
  2. : 家里面的内部主机, 需要访问公司内部主机
  3. [实现思路]
  4. : intranet-host-A 私网主机(家里)
  5. : intranet-host-B 提供服务
  6. : public-host -> 内网穿透, 内部域名服务, nginx 转发将服务暴露给外网
  7. : public-host-C | 其他公网主机, 不需要构成内网则可以访问服务
  8. [intranet-host-B 主机提供服务]
  9. : intranet-host-A -> public-host && intranet-host-B -> public-host
  10. # intranet-host-A -> [IP/域名] -> intranet-host-B
  11. # public-host-C -> public-host -> [nginx | IP/域名] -> intranet-host-B
  12. [域名服务配置]
  13. : 配置子域名, 指向 ngrok 服务端主机
  14. : 访问流量路径 -> 子域名 (域名解析)
  15. -> ngrok:80 (连接解析) -> ssh.thinxz.cn -> intranet-host:81 (该内网主机提供服务)

ngrok

编译构建

  1. [配置环境]
  2. : yum install update
  3. : yum install -y \
  4. git wget curl curl-devel vim \
  5. openssl openssl-devel zlib-devel \
  6. perl hg cpio expat-devel \
  7. gettext-devel perl-ExtUtils-MakeMaker \
  8. gcc gcc-c++
  9. [配置编译环境]
  10. : rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
  11. : yum -y install golang
  12. # 命令配置环境变量, 安装位置
  13. : export GOPATH=/usr/local/ngrok/ && export PATH=$PATH:$GOPATH/bin
  14. [download]
  15. # ngrok 重命名 ngrok-server # 不包含依赖, 下载缓慢
  16. : git clone https://github.com/inconshreveable/ngrok.git ngrok-server
  17. # 查看说明进行编译, 内部包含依赖, 查看README.md进行编译, pre.sh 包含证书构建, 执行前替换域名
  18. : git clone https://github.com/thinxz-yuan/ngrokchina.git ngrok
  19. : cd ngrok
  20. [01 构建证书, 证书中包含访问域名 - 编译的客户端服务端包含证书信息, 连接需要证书支持, 运行时可通过参数执行]
  21. # ngrok域名, 修改域名
  22. : export NGROK_DOMAIN="ngrok.thinxz.cn"
  23. # 创建ngrok证书 -> NGROK_DOMAIN
  24. openssl genrsa -out rootCA.key 2048 \
  25. && openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pem \
  26. && openssl genrsa -out server.key 2048 \
  27. && openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csr \
  28. && openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 5000
  29. # 复制并重命名覆盖
  30. cp rootCA.pem assets/client/tls/ngrokroot.crt \
  31. && cp server.crt assets/server/tls/snakeoil.crt \
  32. && cp server.key assets/server/tls/snakeoil.key
  33. [03 构建]
  34. : release-client
  35. #linux服务端
  36. GOOS=linux GOARCH=386 make release-server
  37. #linux客户端
  38. GOOS=linux GOARCH=386 make release-client
  39. #win服务端
  40. GOOS=windows GOARCH=386 make release-server
  41. #win客户端
  42. GOOS=windows GOARCH=386 make release-client

RUN

  1. [启动服务端]
  2. : ./ngrokd -domain="thinxz.cn" -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":4443"
  3. # 指定证书 -tlsCrt=server.crt -tlsKey=server.key
  4. [启动客户端]
  5. : ngrok.cfg # 配置文件
  6. # server_addr 服务器地址, 端口需要和服务器上面的4443端口一致
  7. server_addr: "thinxz.cn:4443"
  8. trust_host_root_certs: false
  9. # 客户端指定域名 (intranet-host (该内网主机提供服务))
  10. : ngrok.exe -subdomain www -config=ngrok.cfg 80
  11. // https://blog.csdn.net/diyiday/article/details/84504206
  12. // https://www.jianshu.com/p/d0b00d233d09
  13. // https://blog.csdn.net/yjc_1111/article/details/79353718

启用镜像

  1. [运行镜像]
  2. : docker pull registry.cn-hangzhou.aliyuncs.com/thinxz/ngrok:v3
  3. # mkdir -p /opt/data/ngrok
  4. : docker run \
  5. --name ngrok \
  6. -p 80:80 -p 443:443 -p 4443:4443 \
  7. -v /opt/data/ngrok:/usr/local/ngrok \
  8. -d -it registry.cn-hangzhou.aliyuncs.com/thinxz/ngrok:v3 \
  9. ./run.sh
  10. # nginx 转到宿主机 3001-3003
  11. # 使用宿主机端口 3001 - 3003
  12. : docker run \
  13. --name ngrok \
  14. -p 3001:80 -p 3002:443 -p 3003:4443 \
  15. -v /opt/data/ngrok:/usr/local/ngrok \
  16. -d -it registry.cn-hangzhou.aliyuncs.com/thinxz/ngrok:v3 \
  17. ./run.sh
  18. [客户端 配置]
  19. # ngrok.cfg
  20. server_addr: "ngrok.thinxz.cn:4443"
  21. trust_host_root_certs: false
  22. # ngrok.bat
  23. ngrok.exe -subdomain www -config=ngrok.cfg 80
  24. [nginx]
  25. # *.ngrok.thinxz.cn 模糊匹配所有域名
  26. # 将该域名:80 端口, 转发到宿主机 3001 端口 ngrok 转发服务
  27. server {
  28. listen 80;
  29. server_name *.ngrok.thinxz.cn;
  30. location / {
  31. proxy_pass http://172.17.0.1:3001/;
  32. proxy_set_header Host $host;
  33. proxy_set_header REMOTE-HOST $remote_addr;
  34. proxy_set_header X-Real-IP $remote_addr;
  35. }
  36. }
  1. [提交镜像]
  2. : docker login --username=thinxz registry.cn-hangzhou.aliyuncs.com
  3. : docker commit -m="ngrok" -a="thinxz" cid registry.cn-hangzhou.aliyuncs.com/thinxz/ngrok:v1
  4. : docker push registry.cn-hangzhou.aliyuncs.com/thinxz/ngrok:v3
  5. [启动镜像]
  6. : docker run \
  7. --name ngrok \
  8. -p 80:80 -p 443:443 -p 4443:4443 \
  9. -v /opt/data/ngrok:/usr/local/ngrok \
  10. -d -it registry.cn-hangzhou.aliyuncs.com/thinxz/ngrok:v3 \
  11. ./run.sh
  12. [run.sh]
  13. #!/bin/sh
  14. # install and copy
  15. cd /opt/ngrokchina/ && ./install-linux.sh && cd /usr/local/ngrok
  16. # run
  17. ./bin/linux_386/ngrokd \
  18. -domain="ngrok.thinxz.cn" \
  19. -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":4443" \
  20. 2>&1 | tee /usr/local/ngrok/ngrok.log
  21. # suspend main
  22. read -p "press any key to continue." var

image.png

image.png

FRP

  1. // https://www.jianshu.com/p/00c79df1aaf0