虚拟机搭建ngrok
在开发和测试过程中,常常需要将本地服务暴露到公网,ngrok 是一款常用的内网穿透工具,能够将本地端口映射到公网,并提供临时域名,本文将介绍如何在虚拟机中搭建 ngrok 服务,实现本地服务的公网访问。

环境准备
首先需要准备一台虚拟机,推荐使用 Linux 系统(如 Ubuntu 或 CentOS),确保虚拟机能够访问互联网,并已安装必要的依赖工具,如 git、go(ngrok 的编译需要 Go 环境),以 Ubuntu 为例,可通过以下命令安装依赖:
sudo apt update sudo apt install -y git golang
关闭虚拟机的防火墙或开放相应端口(如默认的 443 和 80 端口),避免服务被拦截。
下载并编译 ngrok
ngrok 的源代码托管在 GitHub 上,可通过 git 克隆仓库并编译,执行以下命令:
git clone https://github.com/inconshreveable/ngrok.git cd ngrok
ngrok 需要一个自定义的域名和证书,首先生成自签名证书(仅用于测试环境):
NGROK_DOMAIN="yourdomain.com" # 替换为自定义域名 openssl genrsa -out base.key 2048 openssl req -new -x509 -nodes -key base.key -days 10000 -subj "/CN=$NGROK_DOMAIN" -out base.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 base.pem -CAkey base.key -CAcreateserial -days 10000 -out server.crt cp base.pem assets/client/tls/ngrokroot.crt
编译 ngrok 服务端和客户端:

make release-server release-client
编译完成后,可执行文件位于 bin/ 目录下,分别为 ngrok(客户端)和 ngrokd(服务端)。
启动 ngrok 服务端
在虚拟机中启动 ngrok 服务端,监听 443 和 80 端口:
sudo ./bin/ngrokd -domain="$NGROK_DOMAIN" -httpAddr=":80" -httpsAddr=":443"
服务端启动后,会绑定自定义域名,并提供 HTTP 和 HTTPS 隧道支持,若需后台运行,可使用 nohup 或 systemd 管理进程。
配置客户端并连接
在本地机器上下载 ngrok 客户端(与虚拟机编译版本一致),创建配置文件 ngrok.cfg:
server_addr: "yourdomain.com:4443" # 服务端地址,4443 为默认通信端口 trust_host_root: "true"
启动客户端,映射本地端口(如 8080):

./ngrok -config=ngrok.cfg 8080
客户端启动后,会生成公网隧道地址(如 http://abc123.yourdomain.com),通过该地址即可访问本地服务。
注意事项
- 域名解析:确保自定义域名的 DNS 解析指向虚拟机的公网 IP。
- 证书安全:生产环境建议使用权威机构签发的证书,避免自签名证书带来的信任问题。
- 端口冲突:检查虚拟机是否占用 80、443 等端口,必要时修改 ngrok 配置。
- 性能优化:若并发量较大,可配置多个 ngrok 实例或使用负载均衡。
通过以上步骤,即可在虚拟机中搭建完整的 ngrok 服务,实现本地服务的公网穿透,这一方案适用于个人开发、测试环境,或小型团队的临时需求,灵活且易于部署。


















