ngrok是一个开源软件,官网在国外,用官网提供的服务速度会很慢,这里介绍下如何自建服务进行内网穿透。

首先有一台服务器和域名,然后对域名解析,下面是我的阿里云域名解析的配置。

ngrok1

配置

在服务器上安装go,配置goroot和一个环境变ngrok_domain,该值是前面在阿里云配置的二级域名,用来生成证书和后续客户端会用这个变量。

vim /etc/profile
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin
export NGROK_DOMAIN="ngrok.hiwangqi.com"   # 二级域名,生成证书会用到
source /etc/profile

下载ngrok 并生成证书。

cd /root
git clone https://github.com/inconshreveable/ngrok.git
cd /root/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 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

编译

编译服务端,编译好的可执行文件在当前目录下的bin目录

编译服务端
cd /root/ngrok/
make release-server

启动服务端

cd /root/ngrok/bin
./ngrokd -domain="$NGROK_DOMAIN"

可选配置:

-httpAddr=”:10087”

httpAddr、httpsAddr 分别是 ngrok 用来转发 http、https 服务的端口,可以随意指定。ngrokd 还会开一个 4443 端口用来跟客户端通讯(可通过 -tunnelAddr=”:xxx” 指定),如果你配置了 iptables 规则,需要放行这三个端口上的 TCP 协议。 现在,通过 https://你的域名:7009和 https://你的域名:7008就可以访问到 ngrok 提供的转发服务

编译客户端,可根据客户端的平台进行编译,我这里用windows,编译好之后将文件传到windows

# 32位linux客户端: 
GOOS=linux GOARCH=386 make release-client

# 64位linux客户端: 
GOOS=linux GOARCH=amd64 make release-client

#32位windows客户端: 
GOOS=windows GOARCH=386 make release-client

#64位windows客户端: 
GOOS=windows GOARCH=amd64 make release-client

#32位mac平台客户端:
GOOS=darwin GOARCH=386 make release-client

#64位mac平台客户端:
GOOS=darwin GOARCH=amd64 make release-client

#ARM平台linux客户端: 
GOOS=linux GOARCH=arm make release-client

接下来编写配置文件,将配置文件和客户端放在同一目录

192.168.0.166 为windows电脑上linux虚拟机的地址

#ngrok.cfg
server_addr: "ngrok.hiwangqi.com:4443" # 跟服务端通讯
trust_host_root_certs: false
tunnels:
  test:
    subdomain: "test.ngrok.hiwangqi.com"
    auth: "ngrok:123456" (auth为可选)
    proto:
      http: 192.168.0.166:80 (该地址可以是本机也可以是局域网内其他机器)
  ssh:
    remote_port: 10010
    proto:
      tcp: 192.168.0.166:22(将虚拟机22端口映射出去)
      

启动客户端

ngrok.exe -config ngrok.cfg start test ssh

ngrok2

http测试直接访问 http://test.ngrok.hiwangqi.com/ 测试即可。

tcp测试下可以通过ssh连接下windows上虚拟机里的mysql,用navicat 数据库管理工具创建个连接。