本文主要讲解如何使用 ngrok 自建一个内网穿透服务器,通过本文,你可以掌握:
- 在 centos 等其他 linux 衍生版本上搭建一个 ngrok server。
- 通过 openssl 生成证书。
- 在 windows,linux,arm 系统上使用生成 ngrok 客户端进行内网穿透。
1. 准备工作
1.1 域名解析
- 增加泛子域名和普通子域名解析
1.2 配置环境
- ngrok 基于golang,若没有 golang 环境的需进行安装。
sudo yum install -y golang
- 将 ngrok.git 克隆一份下来,也可以直接下载后直接拷贝至服务器,按需即可。如果没有安装 git 客户端或者版本太低需升级,可通过如下命令进行安装/更新。
- 查看版本信息:
- 更新/安装 git
yum remove git
yum install epel-release
yum install https://centos7.iuscommunity.org/ius-release.rpm
yum install git2u
- 本博文发布时,镜像中的 git 版本为 2.16.5
- 克隆 ngrok 库到本地
cd /etc
git clone https://github.com/inconshreveable/ngrok
1.3 SSL 证书
#1.指定 ngrok 所用域名:这里以域名 bangwogaoding.com 为例
export NGROK_DOMAIN="ngrok.bangwogaoding.com";
#2.直接使用自带 ssl 证书生成工具:
#2.1 key 文件
openssl genrsa -out bangwogaodingCA.key 2048
#2.2 pem 文件
openssl req -x509 -new -nodes -key bangwogaodingCA.key -subj "/CN=$NGROK_DOMAIN" -days 3650 -out bangwogaodingCA.pem
#2.3 客户端 key
openssl genrsa -out ngrokClientCA.key 2048
#2.3 客户端 csr 文件
openssl req -new -key ngrokClientCA.key -subj "/CN=$NGROK_DOMAIN" -out ngrokClientCA.csr
#2.5 创建私钥
openssl x509 -req -in ngrokClientCA.csr -CA bangwogaodingCA.pem -CAkey bangwogaodingCA.key -CAcreateserial -out ngrokClientCA.crt -days 3650
- 上面生成的 bangwogaodingCA.pem,ngrokClientCA.crt,ngrokClientCA.key 复制到
assets/client/tls 和 assets/server/tls,这两个目录分别存放着ngrok和ngrokd的默认证书。具体如下:
cp bangwogaodingCA.pem assets/client/tls/ngrokroot.crt
cp ngrokClientCA.crt assets/server/tls/snakeoil.crt
cp ngrokClientCA.key assets/server/tls/snakeoil.key
1.4 编译 ngrokd 和 ngrok 可执行文件
#编译服务端,生成的文件在 ./bin 文件夹对应的目录中,如:ngrokd
GOOS="linux" GOARCH="amd64" make release-server
#编译客户端,生成的文件在 ./bin 文件夹对应的目录中,如 windows_amd64
GOOS="windows" GOARCH="amd64" make release-client
启动 ngrokd 服务器
cd /etc/ngrok/bin
./ngrokd -domain="ngrok.bangwogaoding.com" -httpAddr=":80" -httpsAddr=":443"
启动 ngrok 客户端
-
生成的客户端位于生成目录下的 /bin 文件夹内,如:
- 可使用 ftp 工具将其拷贝至需要内网穿透的电脑中,这里以 windows 系统为例:
- 复制 ngrokd.exe 到本地文件夹
- 增加配置文件 config.d
#config.d 内容,请自行使用一开始解析的子域名
server_addr: "ngrok.bangwogaoding.com:4443"
trust_host_root_certs: false
- 启动客户端
# config.d 为上面增加的配置文件,也可不使用配置文件,直接显式指定。
# demo:subdomain,即设定的泛子域名
# 5002 端口,表示的是本机需要对外穿透出去的端口
ngrok.exe -config=config.d -subdomain=demo -log=log.txt 5002
- 关于第三点,也可以使用批处理文件方便调整和修改。
# run.bat
@echo off
ngrok.exe -config=config.d -subdomain=demo -log=log.txt 5002
效果
- 内网需要穿透的站点如下:
- 启动客户端
- 外网访问效果
注意事项
- 防火墙启用的状态下,确保服务器的端口都打开,如 4443 是必须的,其他的,如 80,443端口根据你自己需要打开。
# 查看目前已经打开的端口
firewall-cmd --list-ports
- 如果使用的是 云资源,如阿里云,华为,腾讯,AWS等,请确保相关安全组已经允许通过 443,80,4443 等端口。