[需求]
: 家里面的内部主机, 需要访问公司内部主机
[实现思路]
: intranet-host-A 私网主机(家里)
: intranet-host-B 提供服务
: public-host -> 内网穿透, 内部域名服务, nginx 转发将服务暴露给外网
: public-host-C | 其他公网主机, 不需要构成内网则可以访问服务
[intranet-host-B 主机提供服务]
: intranet-host-A -> public-host && intranet-host-B -> public-host
# intranet-host-A -> [IP/域名] -> intranet-host-B
# public-host-C -> public-host -> [nginx | IP/域名] -> intranet-host-B
[域名服务配置]
: 配置子域名, 指向 ngrok 服务端主机
: 访问流量路径 -> 子域名 (域名解析)
-> ngrok:80 (连接解析) -> ssh.thinxz.cn -> intranet-host:81 (该内网主机提供服务)
ngrok
编译构建
[配置环境]
: yum install update
: yum install -y \
git wget curl curl-devel vim \
openssl openssl-devel zlib-devel \
perl hg cpio expat-devel \
gettext-devel perl-ExtUtils-MakeMaker \
gcc gcc-c++
[配置编译环境]
: rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
: yum -y install golang
# 命令配置环境变量, 安装位置
: export GOPATH=/usr/local/ngrok/ && export PATH=$PATH:$GOPATH/bin
[download]
# ngrok 重命名 ngrok-server # 不包含依赖, 下载缓慢
: git clone https://github.com/inconshreveable/ngrok.git ngrok-server
# 查看说明进行编译, 内部包含依赖, 查看README.md进行编译, pre.sh 包含证书构建, 执行前替换域名
: git clone https://github.com/thinxz-yuan/ngrokchina.git ngrok
: cd ngrok
[01 构建证书, 证书中包含访问域名 - 编译的客户端服务端包含证书信息, 连接需要证书支持, 运行时可通过参数执行]
# ngrok域名, 修改域名
: export NGROK_DOMAIN="ngrok.thinxz.cn"
# 创建ngrok证书 -> NGROK_DOMAIN
openssl genrsa -out rootCA.key 2048 \
&& openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pem \
&& openssl genrsa -out server.key 2048 \
&& openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csr \
&& openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 5000
# 复制并重命名覆盖
cp rootCA.pem assets/client/tls/ngrokroot.crt \
&& cp server.crt assets/server/tls/snakeoil.crt \
&& cp server.key assets/server/tls/snakeoil.key
[03 构建]
: release-client
#linux服务端
GOOS=linux GOARCH=386 make release-server
#linux客户端
GOOS=linux GOARCH=386 make release-client
#win服务端
GOOS=windows GOARCH=386 make release-server
#win客户端
GOOS=windows GOARCH=386 make release-client
RUN
[启动服务端]
: ./ngrokd -domain="thinxz.cn" -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":4443"
# 指定证书 -tlsCrt=server.crt -tlsKey=server.key
[启动客户端]
: ngrok.cfg # 配置文件
# server_addr 服务器地址, 端口需要和服务器上面的4443端口一致
server_addr: "thinxz.cn:4443"
trust_host_root_certs: false
# 客户端指定域名 (intranet-host (该内网主机提供服务))
: ngrok.exe -subdomain www -config=ngrok.cfg 80
// https://blog.csdn.net/diyiday/article/details/84504206
// https://www.jianshu.com/p/d0b00d233d09
// https://blog.csdn.net/yjc_1111/article/details/79353718
启用镜像
[运行镜像]
: docker pull registry.cn-hangzhou.aliyuncs.com/thinxz/ngrok:v3
# mkdir -p /opt/data/ngrok
: docker run \
--name ngrok \
-p 80:80 -p 443:443 -p 4443:4443 \
-v /opt/data/ngrok:/usr/local/ngrok \
-d -it registry.cn-hangzhou.aliyuncs.com/thinxz/ngrok:v3 \
./run.sh
# nginx 转到宿主机 3001-3003
# 使用宿主机端口 3001 - 3003
: docker run \
--name ngrok \
-p 3001:80 -p 3002:443 -p 3003:4443 \
-v /opt/data/ngrok:/usr/local/ngrok \
-d -it registry.cn-hangzhou.aliyuncs.com/thinxz/ngrok:v3 \
./run.sh
[客户端 配置]
# ngrok.cfg
server_addr: "ngrok.thinxz.cn:4443"
trust_host_root_certs: false
# ngrok.bat
ngrok.exe -subdomain www -config=ngrok.cfg 80
[nginx]
# *.ngrok.thinxz.cn 模糊匹配所有域名
# 将该域名:80 端口, 转发到宿主机 3001 端口 ngrok 转发服务
server {
listen 80;
server_name *.ngrok.thinxz.cn;
location / {
proxy_pass http://172.17.0.1:3001/;
proxy_set_header Host $host;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Real-IP $remote_addr;
}
}
[提交镜像]
: docker login --username=thinxz registry.cn-hangzhou.aliyuncs.com
: docker commit -m="ngrok" -a="thinxz" cid registry.cn-hangzhou.aliyuncs.com/thinxz/ngrok:v1
: docker push registry.cn-hangzhou.aliyuncs.com/thinxz/ngrok:v3
[启动镜像]
: docker run \
--name ngrok \
-p 80:80 -p 443:443 -p 4443:4443 \
-v /opt/data/ngrok:/usr/local/ngrok \
-d -it registry.cn-hangzhou.aliyuncs.com/thinxz/ngrok:v3 \
./run.sh
[run.sh]
#!/bin/sh
# install and copy
cd /opt/ngrokchina/ && ./install-linux.sh && cd /usr/local/ngrok
# run
./bin/linux_386/ngrokd \
-domain="ngrok.thinxz.cn" \
-httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":4443" \
2>&1 | tee /usr/local/ngrok/ngrok.log
# suspend main
read -p "press any key to continue." var


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