| 2025-03-18
利用 ngrok 和云服务器搭建隧道,能够有效实现内网服务的公网访问,为开发测试、远程协作等场景提供便利。以下为详细教程。
准备工作
1.云服务器一台:建议选择配置适中、网络稳定且带宽充足的云服务器,如阿里云、腾讯云等平台的产品。需确保对云服务器拥有 root 权限,以便后续进行安装和配置操作。
2.域名一个:为了使访问更加便捷和规范,最好准备一个已备案的域名(国内使用未备案域名进行网络服务属于违规行为)。可在各大域名注册商处注册域名,并按照相应平台的备案流程完成备案。
3.本地开发环境:确保本地运行有需要进行内网穿透的服务,如 Web 服务、SSH 服务等,并明确其监听的端口。
云服务器端操作
1.安装必要软件包:通过 SSH 连接到云服务器,以 root 用户身份执行以下命令安装相关依赖包,这些包将用于后续安装 git 和编译 ngrok 等操作。
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++
2.安装 git:执行以下命令下载并安装 git:
wget https://www.kernel.org/pub/software/scm/git/git-2.16.2.tar.gz
tar zxvf git-2.16.2.tar.gz
cd git-2.16.2
./configure --prefix=/usr/local/git
make install
rm git-2.16.2.tar.gz -y
安装完成后,将 git 的可执行文件路径添加到系统环境变量中,编辑 “/etc/profile” 文件,在文件末尾添加:
export PATH=$PATH:/usr/local/git/bin
执行 “source /etc/profile” 使环境变量生效。
3.安装 Go 语言环境:由于 ngrok 是基于 Go 语言开发的,需安装 Go 语言环境。前往 Go 语言官网下载适合云服务器系统的安装包,假设下载的是 “go1.12.4.linux-amd64.tar.gz”(根据实际版本替换),执行以下命令进行安装:
wget https://dl.google.com/go/go1.12.4.linux-amd64.tar.gz
tar -zxvf go1.12.4.linux-amd64.tar.gz -C /usr/local/
安装完成后,设置 Go 语言的环境变量,编辑 “/etc/profile” 文件,添加如下内容:
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin
再次执行 “source /etc/profile” 使环境变量生效。通过执行 “go version” 命令,若能正确输出版本信息,则表示 Go 语言安装成功。
4.下载并编译 ngrok:克隆 ngrok 的源代码仓库,执行命令:
git clone https://github.com/inconshreveable/ngrok.git
克隆完成后,进入 ngrok 目录,执行以下命令生成证书(假设使用的域名为 “yourdomain.com”,需替换为自己的域名):
export NGROK_DOMAIN="yourdomain.com"
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
生成证书后,将其覆盖到 ngrok 相应目录,执行:
cp rootCA.pem assets/client/tls/ngrokroot.crt
cp server.crt assets/server/tls/snakeoil.crt
cp server.key assets/server/tls/snakeoil.key
然后编译生成 ngrok 服务端,执行命令:
GOOS=linux GOARCH=amd64 make release-server
编译完成后,在 “bin” 目录下会生成 “ngrokd” 文件,这就是 ngrok 服务端程序。
5.启动 ngrok 服务端:在 ngrok 目录下执行以下命令启动 ngrok 服务端:
./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="yourdomain.com" -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":4443"
参数说明:
--domain:指定用于访问的域名,需与之前生成证书时使用的域名一致。
--httpAddr:设置 http 协议的转发端口,默认为 80。
--httpsAddr:设置 https 协议的转发端口,默认为 443。
--tunnelAddr:设置隧道端口,用于客户端和服务端通信,默认为 4443。此端口需在云服务器的安全组规则中开放,以确保客户端能够正常连接。
本地客户端操作
1.下载 ngrok 客户端:在 ngrok 官网下载适合本地操作系统的 ngrok 客户端程序。
2.配置 ngrok 客户端:创建一个配置文件,例如 “ngrok.cfg”,在其中添加如下内容(假设云服务器的域名为 “yourdomain.com”,隧道端口为 4443):
server_addr: "yourdomain.com:4443"
trust_host_root_certs: false
3.启动 ngrok 客户端:假设本地有一个 Web 服务监听在 8080 端口,执行以下命令启动 ngrok 客户端:
ngrok -config=ngrok.cfg http 8080
执行该命令后,ngrok 客户端会连接到云服务器上的 ngrok 服务端,并生成一个公网 URL,通过该 URL 即可访问到本地 8080 端口的 Web 服务。
通过以上步骤,即可成功利用 ngrok 和云服务器搭建起隧道,实现内网服务的公网访问。在实际操作过程中,需注意各步骤的参数设置和网络配置,确保操作正确无误。
拓展阅读
-反向代理与正向代理区别:正向代理作为客户端代理,从互联网获取资源返回给客户端,服务端不知客户端 IP;反向代理作为服务器端代理,客户端借其访问后端服务器资源,不知后端服务器存在。
-域名备案具体流程:一般在域名注册商平台提交备案申请,填写网站信息、上传相关证件(如身份证、营业执照等),等待通信管理局审核,周期通常 1 - 20 个工作日。
-云服务器安全组规则设置:登录云服务器管理控制台,找到安全组设置页面,添加规则允许特定端口(如 ngrok 服务端的 80、443、4443 端口等)的入站和出站流量,以保障服务正常运行且安全。