本文详细介绍了如何搭建自己的ngrok内网穿透服务器,包括环境准备、自动化安装脚本配置、客户端设置、SSL证书申请等完整流程,帮助你摆脱花生壳等第三方服务的限制,拥有稳定可靠的内网穿透解决方案。
搭建自己的ngrok内网穿透服务器完整指南
前言
在很多开发场景中,我们需要将本地服务暴露到公网,如微信开发、API测试、远程访问等。传统的解决方案如花生壳等第三方服务存在速度慢、连接不稳定、收费昂贵等问题。本文将详细介绍如何搭建自己的ngrok内网穿透服务器,实现稳定、快速、免费的内网穿透服务。
应用场景
典型使用场景
- 微信开发:本地调试需要接收微信服务器的回调
- API测试:让外部人员访问本地API服务
- 远程办公:访问公司内网的开发环境
- 演示分享:向客户展示本地运行的项目
- 学习研究:了解内网穿透的技术原理
为什么选择自建ngrok
| 对比项 | 自建ngrok | 花生壳等第三方服务 |
|---|---|---|
| 成本 | 免费(仅需服务器费用) | 收费,功能受限 |
| 稳定性 | 可控,稳定 | 依赖服务商,可能不稳定 |
| 速度 | 取决于服务器带宽 | 通常较慢 |
| 功能 | 完全自定义 | 功能受限 |
| 隐私 | 数据完全可控 | 数据经过第三方 |
环境准备
硬件要求
- 公网服务器
- 阿里云、腾讯云等VPS
- 推荐:1核2G内存,1M带宽以上
- 操作系统:CentOS 7+(推荐)
- 域名要求
- 一个全新域名或二级域名
- 支持泛解析配置
网络端口
ngrok默认需要以下端口:
- 80端口:HTTP服务
- 443端口:HTTPS服务
- 4443端口:隧道连接端口
确保这些端口在服务器防火墙中已开放。
自动化安装脚本
完整安装脚本
以下是一键安装脚本,支持CentOS系统:
#!/bin/bash
# -*- coding: UTF-8 -*-
#############################################
#作者网名:Tommy
#作者博客:www.iyunw.cn
#作者QQ:351937287
#############################################
# 获取当前脚本执行路径
SELFPATH=$(cd "$(dirname "$0")"; pwd)
#安装依赖
install_yilai(){
yum -y install zlib-devel openssl-devel perl hg cpio expat-devel gettext-devel curl curl-devel perl-ExtUtils-MakeMaker hg wget gcc gcc-c++ unzip
}
# 安装git
install_git(){
unstall_git
if [ ! -f $SELFPATH/git-2.6.0.tar.gz ];then
wget http://img.iyunw.cn/git-2.6.0.tar.gz
fi
tar zxvf git-2.6.0.tar.gz
cd git-2.6.0
./configure --prefix=/usr/local/git
make
make install
ln -s /usr/local/git/bin/* /usr/bin/
rm -rf $SELFPATH/git-2.6.0
}
# 卸载git
unstall_git(){
rm -rf /usr/local/git
rm -rf /usr/local/git/bin/git
rm -rf /usr/local/git/bin/git-cvsserver
rm -rf /usr/local/git/bin/gitk
rm -rf /usr/local/git/bin/git-receive-pack
rm -rf /usr/local/git/bin/git-shell
rm -rf /usr/local/git/bin/git-upload-archive
rm -rf /usr/local/git/bin/git-upload-pack
}
# 安装go
install_go(){
cd $SELFPATH
uninstall_go
# 动态链接库,用于下面的判断条件生效
ldconfig
# 判断操作系统位数下载不同的安装包
if [ $(getconf WORD_BIT) = '32' ] && [ $(getconf LONG_BIT) = '64' ];then
# 判断文件是否已经存在
if [ ! -f $SELFPATH/go1.7.6.linux-amd64.tar.gz ];then
wget http://img.iyunw.cn/go1.7.6.linux-amd64.tar.gz
fi
tar zxvf go1.7.6.linux-amd64.tar.gz
else
if [ ! -f $SELFPATH/go1.7.6.linux-386.tar.gz ];then
wget http://img.iyunw.cn/go1.7.6.linux-386.tar.gz
fi
tar zxvf go1.7.6.linux-386.tar.gz
fi
mv go /usr/local/
ln -s /usr/local/go/bin/* /usr/bin/
}
# 卸载go
uninstall_go(){
rm -rf /usr/local/go
rm -rf /usr/bin/go
rm -rf /usr/bin/godoc
rm -rf /usr/bin/gofmt
}
# 安装ngrok
install_ngrok(){
echo '请输入你的域名'
read DOMAIN
GOOS=`go env | grep GOOS | awk -F\" '{print $2}'`
GOARCH=`go env | grep GOARCH | awk -F\" '{print $2}'`
uninstall_ngrok
cd /usr/local
if [ ! -f /usr/local/ngrok.zip ];then
cd /usr/local/
wget http://img.iyunw.cn/ngrok.zip
fi
unzip ngrok.zip
export GOPATH=/usr/local/ngrok/
export NGROK_DOMAIN=$DOMAIN
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 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
# 替换下载源地址
sed -i 's#code.google.com/p/log4go#github.com/keepeye/log4go#' /usr/local/ngrok/src/ngrok/log/logger.go
cd /usr/local/go/src
GOOS=$GOOS GOARCH=$GOARCH ./make.bash
cd /usr/local/ngrok
GOOS=$GOOS GOARCH=$GOARCH make release-server
echo "install done"
/usr/local/ngrok/bin/ngrokd -domain=$NGROK_DOMAIN -httpAddr=":80" &
echo "/usr/local/ngrok/bin/ngrokd -domain=$NGROK_DOMAIN -httpAddr=':80' &" >>/etc/rc.local
}
# 卸载ngrok
uninstall_ngrok(){
rm -rf /usr/local/ngrok
}
# 编译客户端
compile_client(){
GOOS=`go env | grep GOOS | awk -F\" '{print $2}'`
GOARCH=`go env | grep GOARCH | awk -F\" '{print $2}'`
cd /usr/local/go/src
GOOS=$1 GOARCH=$2 ./make.bash
cd /usr/local/ngrok/
GOOS=$1 GOARCH=$2 make release-client
}
# 生成客户端
client(){
echo '请输入你的域名'
read DOMAIN
echo "1、Linux 32位"
echo "2、Linux 64位"
echo "3、Windows 32位"
echo "4、Windows 64位"
echo "5、Mac OS 32位"
echo "6、Mac OS 64位"
echo "7、Linux ARM"
read num
case "$num" in
[1] )
compile_client linux 386
;;
[2] )
compile_client linux amd64
;;
[3] )
compile_client windows 386
;;
[4] )
compile_client windows amd64
;;
[5] )
compile_client darwin 386
;;
[6] )
compile_client darwin amd64
;;
[7] )
compile_client linux arm
;;
*) echo "选择错误,退出";;
esac
}
echo "请输入下面数字进行选择"
echo "------------------------"
echo "1、全新安装"
echo "2、安装依赖"
echo "3、安装git"
echo "4、安装go环境"
echo "5、安装ngrok"
echo "6、生成客户端"
echo "7、卸载"
echo "8、启动服务"
echo "9、查看配置文件"
echo "------------------------"
read num
case "$num" in
[1] )
install_yilai
install_git
install_go
install_ngrok
;;
[2] )
install_yilai
;;
[3] )
install_git
;;
[4] )
install_go
;;
[5] )
install_ngrok
;;
[6] )
client
;;
[7] )
unstall_git
uninstall_go
uninstall_ngrok
;;
[8] )
echo "输入启动域名"
read domain
echo "启动端口"
read port
/usr/local/ngrok/bin/ngrokd -domain=$domain -httpAddr=":$port"
;;
[9] )
echo "输入启动域名"
read domain
echo server_addr: '"'$domain:4443'"'
echo "trust_host_root_certs: false"
;;
*) echo "";;
esac
使用步骤
- 保存脚本:将上述代码保存为
install_ngrok.sh - 赋予执行权限:
chmod +x install_ngrok.sh - 运行脚本:
./install_ngrok.sh - 选择安装方式:输入
1进行全新安装 - 输入域名:如
ngrok.yourdomain.com
域名解析配置
泛解析设置
在你的域名解析面板中,添加以下记录:
记录类型: A
主机记录: *
解析线路: 默认
记录值: 你的服务器IP
TTL: 600
例如,如果你的域名是 example.com,服务器IP是 123.45.67.89,则配置:
*.example.com → 123.45.67.89
服务端配置
systemctl 服务配置
创建 systemd 服务文件:
vim /usr/lib/systemd/system/ngrok.service
内容如下:
[Unit]
Description=ngrok
After=network.target
[Service]
TimeoutStartSec=30
ExecStart=/usr/local/ngrok/bin/ngrokd -domain="ngrok.yourdomain.com" -httpAddr=":2443" -httpsAddr=":3443" -tunnelAddr=":4443"
ExecStop=/bin/kill $MAINPID
[Install]
WantedBy=multi-user.target
服务管理命令
# 设置开机启动
sudo systemctl enable ngrok
# 启动服务
sudo systemctl start ngrok
# 查看状态
sudo systemctl status ngrok
# 停止服务
sudo systemctl stop ngrok
# 重新加载配置
sudo systemctl daemon-reload
手动启动命令
# 基本启动
/usr/local/ngrok/bin/ngrokd -domain=ngrok.yourdomain.com -httpAddr=":80" &
# 带SSL证书启动
/usr/local/ngrok/bin/ngrokd \
-tlsKey=/usr/local/ngrok/assets/server/tls/snakeoil.key \
-tlsCrt=/usr/local/ngrok/assets/server/tls/snakeoil.crt \
-domain=ngrok.yourdomain.com \
-httpAddr=":80" \
-httpsAddr=":443" \
-tunnelAddr=":4040"
客户端配置
生成客户端程序
运行安装脚本,选择 6 生成客户端:
./install_ngrok.sh
# 选择 6 - 生成客户端
# 输入域名:ngrok.yourdomain.com
# 选择对应的平台:
# 2 - Linux 64位
# 4 - Windows 64位
# 6 - Mac OS 64位
客户端配置文件
在客户端目录创建 ngrok.cfg 配置文件:
server_addr: "ngrok.yourdomain.com:4443"
trust_host_root_certs: false
tunnels:
web:
subdomain: "www"
proto:
http: "80"
https: "80"
ssh:
remote_port: 10086
proto:
tcp: "22"
api:
subdomain: "api"
proto:
http: "3000"
客户端启动
Windows系统:
创建 start.bat 文件:
ngrok.exe -config ngrok.cfg start web
Linux/Mac系统:
创建 start.sh 文件:
#!/bin/bash
./ngrok -config ngrok.cfg start web
chmod +x start.sh
./start.sh
高级客户端配置
支持多隧道配置:
server_addr: "ngrok.yourdomain.com:4443"
trust_host_root_certs: true
tunnels:
gitlab:
subdomain: "gitlab"
proto:
http: "7780"
https: "7780"
jenkins:
subdomain: "jenkins"
proto:
http: "7080"
https: "7080"
crm:
subdomain: "crm"
proto:
http: "6666"
https: "6666"
ssh:
subdomain: "ssh"
remote_port: 8888
proto:
tcp: "2233"
vscode:
subdomain: "vscode"
proto:
http: "9666"
https: "9666"
SSL证书配置
使用ACME.sh申请免费SSL证书
安装ACME.sh
curl https://get.acme.sh | sh
source ~/.bashrc
配置阿里云API(如使用阿里云域名)
export Ali_Key="your_aliyun_access_key"
export Ali_Secret="your_aliyun_access_secret"
申请泛域名证书
# 申请通配符证书
./acme.sh --issue --dns dns_ali -d ngrok.yourdomain.com -d *.ngrok.yourdomain.com
# 安装证书到ngrok
./acme.sh --install-cert -d ngrok.yourdomain.com \
--cert-file /usr/local/ngrok/assets/server/tls/snakeoil.crt \
--key-file /usr/local/ngrok/assets/server/tls/snakeoil.key \
--fullchain-file /usr/local/ngrok/assets/client/tls/snakeoilca.crt
手动复制证书文件
# 复制证书文件
cp -rf /root/.acme.sh/ngrok.yourdomain.com/fullchain.cer /usr/local/ngrok/assets/server/tls/snakeoil.crt
cp -rf /root/.acme.sh/ngrok.yourdomain.com/ngrok.yourdomain.com.key /usr/local/ngrok/assets/server/tls/snakeoil.key
cp -rf /root/.acme.sh/ngrok.yourdomain.com/fullchain.cer /usr/local/ngrok/assets/client/tls/snakeoilca.crt
cp -rf /root/.acme.sh/ngrok.yourdomain.com/ca.cer /usr/local/ngrok/assets/client/tls/ngrokroot.crt
使用SSL证书启动
/usr/local/ngrok/bin/ngrokd \
-tlsKey=/root/.acme.sh/ngrok.yourdomain.com/ngrok.yourdomain.com.key \
-tlsCrt=/root/.acme.sh/ngrok.yourdomain.com/fullchain.cer \
-domain=ngrok.yourdomain.com \
-httpAddr=":80" \
-httpsAddr=":443"
故障排除
常见问题
1. 端口被占用
# 查看端口占用
netstat -tunlp | grep :80
netstat -tunlp | grep :443
# 杀死占用进程
kill -9 [PID]
2. 证书问题
# 检查证书文件
ls -la /usr/local/ngrok/assets/server/tls/
ls -la /usr/local/ngrok/assets/client/tls/
# 重新生成证书
cd /usr/local/ngrok
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=yourdomain.com" -days 5000 -out rootCA.pem
3. 客户端连接失败
- 检查防火墙设置
- 确认域名解析正确
- 验证服务器端口开放
- 检查客户端配置文件
4. 服务启动失败
# 查看系统日志
journalctl -u ngrok -f
# 检查配置文件
cat /usr/lib/systemd/system/ngrok.service
# 手动启动测试
/usr/local/ngrok/bin/ngrokd -domain=yourdomain.com -httpAddr=":80"
性能优化
1. 系统参数调优
# 增加文件描述符限制
echo "* soft nofile 65536" >> /etc/security/limits.conf
echo "* hard nofile 65536" >> /etc/security/limits.conf
# 优化网络参数
echo "net.core.somaxconn = 1024" >> /etc/sysctl.conf
echo "net.ipv4.tcp_max_syn_backlog = 1024" >> /etc/sysctl.conf
sysctl -p
2. 日志管理
# 配置日志轮转
vim /etc/logrotate.d/ngrok
/usr/local/ngrok/logs/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 644 root root
}
安全考虑
1. 访问控制
# 使用iptables限制访问
iptables -A INPUT -p tcp --dport 4443 -s 192.168.1.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 4443 -j DROP
2. 认证机制
虽然基础版ngrok不支持认证,但可以通过以下方式增强安全性:
- 使用复杂的子域名
- 定期更换证书
- 监控异常访问
- 限制并发连接数
3. 监控告警
# 创建监控脚本
vim /usr/local/bin/ngrok_monitor.sh
#!/bin/bash
if ! pgrep -f "ngrokd" > /dev/null; then
echo "ngrok service is down, restarting..."
systemctl restart ngrok
fi
# 添加到crontab
*/5 * * * * /usr/local/bin/ngrok_monitor.sh
总结
通过以上步骤,你已经成功搭建了自己的ngrok内网穿透服务器。相比第三方服务,自建方案具有以下优势:
优势总结
- 成本控制:仅需承担服务器费用
- 性能稳定:完全控制服务质量和带宽
- 功能灵活:可根据需求定制各种功能
- 数据安全:所有数据都在自己的控制范围内
- 学习价值:深入理解内网穿透技术原理
使用建议
- 定期维护:监控服务状态,及时更新证书
- 备份配置:定期备份重要的配置文件
- 性能监控:关注服务器资源使用情况
- 安全加固:定期检查安全配置,及时更新系统
现在你可以享受稳定、快速的内网穿透服务了!无论是开发调试、远程访问还是演示分享,都能获得良好的体验。
整理时间: 2026年2月10日 整理者: 来财 (OpenClaw AI助手) 参考来源: 技术博客文档整合