Dockerfile
https://hub.docker.com/_/golang
FROM golang:1.18.0-alpine
ADD build.sh /
RUN apk add --no-cache git make openssl
RUN git clone https://github.com/inconshreveable/ngrok.git --depth=1 /ngrok
RUN sed -i "109,109s/tcp/tcp4/g" /ngrok/src/ngrok/server/tunnel.go
RUN sed -i "57,57s/tcp/tcp4/g" /ngrok/src/ngrok/conn/conn.go
RUN sh /build.sh
EXPOSE 8081
VOLUME [ "/ngrok" ]
CMD [ "/ngrok/bin/ngrokd"]
build.sh
export NGROK_DOMAIN="n.htmltoo.com"
cd ssl
cp device.crt assets/server/tls/device.crt
cp device.key assets/server/tls/device.key
make release-server
GOOS=linux GOARCH=386 make release-client
GOOS=linux GOARCH=amd64 make release-client
GOOS=windows GOARCH=386 make release-client
GOOS=windows GOARCH=amd64 make release-client
GOOS=darwin GOARCH=386 make release-client
GOOS=darwin GOARCH=amd64 make release-client
GOOS=linux GOARCH=arm make release-client
export NGROK_DOMAIN="n.htmltoo.com"
cd /ngrok/
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 device.key 2048
openssl req -new -key device.key -subj "/CN=$NGROK_DOMAIN" -out device.csr
openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000
cp rootCA.pem assets/client/tls/ngrokroot.crt
cp device.crt assets/server/tls/snakeoil.crt
cp device.key assets/server/tls/snakeoil.key
make release-server
GOOS=linux GOARCH=386 make release-client
GOOS=linux GOARCH=amd64 make release-client
GOOS=windows GOARCH=386 make release-client
GOOS=windows GOARCH=amd64 make release-client
GOOS=darwin GOARCH=386 make release-client
GOOS=darwin GOARCH=amd64 make release-client
GOOS=linux GOARCH=arm make release-client
docker run --rm -it -e DOMAIN="ecleads.com" -v /data/docker/nginx/ngrok:/wln ngrok /bin/sh /start.sh
docker run -d -p 4443:4443 --restart=always --name ngrok -e DOMAIN="ecleads.com" -v /data/docker/nginx/ngrok:/wln ngrok
docker run -d -p 80:80 -p 443:443 -p 4443:4443 --restart=always --name ngrok -e DOMAIN="ecleads.com" -v /data/docker/nginx/ngrok:/wln -tlsKey="/wln/server.key" -tlsCrt="/wln/server.crt" ngrok
docker build -t ngrok .
docker run -it -p 8081:8081 -p 4443:4443 -p 4444:4444 -d ngrok /ngrok/bin/ngrokd -domain="n.htmltoo.com" -httpAddr=":8081"
-启动容器的时候指定证书路径,映射80和443端口
docker run -it -p 80:80 -p 443:443 -p 4443:4443 -d ngrok /ngrok/bin/ngrokd -domain="ngrok.xxxx.com" -tlsKey="/ngrok/assets/server/tls/snakeoil.key" -tlsCrt="/ngrok/assets/server/tls/snakeoil.crt"
启动容器的时候指定证书路径,映射80和443端口
====ngrok服务端已经完成
-下载客户端
docker inspect 容器id
Mounts ---> Source --> 查看路径 ---> cd Bin
-配置客户端
server_addr: "ngrok.xxxx.com:4443"
trust_host_root_certs: false
tunnels:
webapp:
proto:
http: 8081
subdomain: test
tcp12345:
remote_port: 4444
proto:
tcp: 12345
这里配置了2个隧道。一个http的请求,一个tcp转发。
-启动客户端
./ngrok -config=config.yml start-all
http://ip:8081
==============
cd /opt
git clone https://github.com/inconshreveable/ngrok.git
sed -i "109,109s/tcp/tcp4/g" /opt/ngrok/src/ngrok/server/tunnel.go
sed -i "57,57s/tcp/tcp4/g" /opt/ngrok/src/ngrok/conn/conn.go
cd ngrok
export NGROK_DOMAIN="ecleads.com"
openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -key ca.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out ca.crt
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 ca.pem -CAkey ca.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
-在国内的服务器需要执行此步, 香港或者国外的服务器不需要
vim /opt/ngrok/src/ngrok/log/logger.go
log "github.com/keepeye/log4go"
cd /usr/local/go/src
GOOS=linux GOARCH=amd64 ./make.bash
---设置变量并生成ngrok服务端和客户端
cd /opt/ngrok/
go env -w GO111MODULE=auto
-编译服务端:
make release-server
-编译客户端
GOOS=linux GOARCH=amd64 make release-client
-交叉编译生成windows客户端
GOOS=windows GOARCH=amd64 make release-client
-ngrokd就是ngrok的服务端程序,ngrok就是ngrok的客户端程序
-服务端
cd /opt/ngrok
cp bin/ngrokd /usr/local/bin/ngrokd
chmod -R 777 /usr/local/bin/ngrokd
./bin/ngrokd -domain="ecleads.com" -httpAddr=":800"
ngrokd -tlsKey=assets/server/tls/snakeoil.key -tlsCrt=assets/server/tls/snakeoil.crt -domain="你的域名" -httpAddr=":8000" -httpsAddr=":8001" &
-后台运行
nohup ngrokd -tlsKey=assets/server/tls/snakeoil.key -tlsCrt=assets/server/tls/snakeoil.crt -domain="ecleads.com" -log="/opt/ngrok/ngrok.log" -httpAddr=":800" &
httpAddr、httpsAddr 分别是 ngrok 用来转发 http、https 服务的端口,可以随意指定。ngrokd 还会开一个 4443 端口用来跟客户端通讯(可通过 -tunnelAddr=":xxx" 指定, 默认4443)
-客户端
vi /opt/ngrok/ngrok.cfg
server_addr: "ecleads.com:4443"
trust_host_root_certs: false
cd /opt/ngrok/
cp ngrok /usr/local/bin/ngrok
ngrok -config=ngrok.cfg start http
ngrok -config=ngrok.cfg -subdomain 202 20280
ngrok -subdomain 202 -proto=http -config=ngrok.cfg 20280
ngrok客户端启动参数说明:
"202" 是你自己定义的二级域名,不能与其他人重复
"800" 是你本地服务的端口
可以在外网通过访问http://202.ecleads.com:800这个地址来访问本地800端口服务了
-修改默认服务地址
vim /opt/ngrok/src/ngrok/client/model.go
# 找到第24,25行
defaultServerAddr = "ecleads.com:4443"
defaultInspectAddr = "0.0.0.0:4040"
-修改客户端蓝色文字logo
Vim /opt/ngrok/src/ngrok/client/views/term/view.go
找到第 100 行, 将
v.APrintf(termbox.ColorBlue|termbox.AttrBold, 0, 0, "ngrok")
修改为
v.APrintf(termbox.ColorBlue|termbox.AttrBold, 0, 0, "your logo")
-映射 HTTP
如果不加参数 -subdomain=test,将会随机自动分配子域名。
./ngrok -config=ngrok.cfg -subdomain=test 80
-映射TCP
./ngrok -proto=tcp 22
#安装golang
https://abc.htmltoo.com/thread-45936.htm
https://www.svenbit.com/2014/09/run-ngrok-on-your-own-server/