CentOS 7 下搭建自己的 ngrok 内网穿透服务

概述

现在的家庭宽带或者部分公司的宽带都没有直接分配公网 IP ,这个给我们做开发调试时带来的很大的不便,比如我们需要对接微信公众号、支付宝等第三方系统时,第三方系统需要通过异步回调通知我们的服务,但是我们自己电脑上的应用程序都无法对外访问,这样也就通知不了,无法很好的进行联调测试。

在这样的背景下,ngrok 对于我们来说就提供了很大的帮助,他可以让我们内网的应用可以对外访问,无论是 HTTP(s) 服务还是 TCP/SSH 等场景,均可以通过 ngrok 服务内网穿透来达到对外提供访问的目的。

 

搭建步骤

第一步:安装 golang 环境

博主的服务器统一使用的 CentOS 7 发行版本,所以通过 yum install golang 就可以安装好 golang 环境,如果是其他操作系统可以参考官方文档 How to install golang

 

第二步:下载 ngrok 源码

目前 ngrok 2.x 版本已经闭源,我们能下载到的最新版本为 ngrok-1.7.1.zip
下载完成之后解压 zip 包,这里我们需要修改 src/ngrok/log/logger.go 中的源代码,
将 log "code.google.com/p/log4go" 修改为 log "github.com/alecthomas/log4go",
否则编译时会报错 build fails: 'package code.google.com/p/log4go: unable to detect version control system for code.google.com/ path'

 

第三步:生成 TLS 证书

例如我们以 4kb.cn 域名为例,我们在生成证书的时候可以指定 ngrok.4kb.cn 这个域名指定 ngrok 服务器地址(需要 DNS 解析到 ngrok 所在服务器的 IP 上),同时我们对外提供 ngrok 域名为 .4kb.cn (需要泛域名解析 .4kb.cn 到 ngrok 所在服务器的 IP 上),这里的 ngrok.4kb.cn 和 *.4kb.cn 解析并不冲突。

生成 TLS 证书的命令如下:

openssl genrsa -out rootCA.key 2048

openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=ngrok.4kb.cn" -days 3650 -out rootCA.pem

openssl genrsa -out device.key 2048

openssl req -new -key device.key -subj "/CN=ngrok.4kb.cn" -out device.csr

openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 3650

 

第四步:覆盖 ngrok 默认 TLS 证书

cp rootCA.pem assets/client/tls/ngrokroot.crt

cp device.crt assets/server/tls/snakeoil.crt

cp device.key assets/server/tls/snakeoil.key

 

第五步:设置 Golang 编译目录和参数

export GOPATH=/go

为了可以在 docker 环境下运行,我们还需要运行下面的命令,否则会报错 Unable to run a go program inside docker /bin/sh: ./ngrokd: not found

export CGO_ENABLED=0

 

第六步:编译 ngrok 服务端和客户端

Linux 32 位系统 ngrok 编译命令

export GOOS=linux GOARCH=386

make release-server release-client

Linux 64 位系统 ngrok 编译命令

export GOOS=linux GOARCH=amd64

make release-server release-client

Windows 32 位系统 ngrok 编译命令

export GOOS=windows GOARCH=386

make release-server release-client

Windows 64 位系统 ngrok 编译命令

export GOOS=windows GOARCH=amd64

make release-server release-client

macOS 32 位系统 ngrok 编译命令

export GOOS=darwin GOARCH=386

make release-server release-client

macOS 64 位系统 ngrok 编译命令

export GOOS=darwin GOARCH=amd64

make release-server release-client

其他操作系统修改 GOOS 和 GOARCH 为对应的即可:Go (Golang) GOOS and GOARCH

 

第七步:运行 ngrokd 服务端

编译完成之后可以在 bin 目录下看到 ngrokd(服务端)和 ngrok(客户端),运行服务端时需要将 assets/server/tls/snakeoil.crt 和 assets/server/tls/snakeoil.key
复制到同级目录,启动的命令参考如下:

./ngrokd -tlsKey=snakeoil.key -tlsCrt=snakeoil.crt -domain="4kb.cn" -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":4443"

如果使用默认 80、443、4443 端口,则可以使用以下命令运行:

./ngrokd -tlsKey=snakeoil.key -tlsCrt=snakeoil.crt -domain="4kb.cn"

 

第八步:运行 ngrok 客户端

运行之前我们需要编写一个 ngrok.cfg 文件,内容如下

server_addr: "ngrok.4kb.cn:4443"

trust_host_root_certs: false

这里的 server_addr 需要和第三步生成 TLS 时保持一致,否则服务端会报 tls: bad certificate 证书错误,
编辑完成之后使用 ngrok 客户端运行即可

./ngrok -config=ngrok.cfg 8080

指定域名运行命令

./ngrok -config=ngrok.cfg -subdomain=xxx 8080

映射 SSH 22 端口,使用 tcp 协议

./ngrok -config=ngrok.cfg -proto=tcp 22

 

总结

我们搭建完成 ngrok 服务端后,任意能连接到服务器的应用程序均可以通过 ngrok 内网穿透,
不仅 Java、PHP 等开发的网站可以通过 ngrok 映射对外提供域名访问,也可以让 SSH 的 22 端口映射之后
我们连接无公网 IP 的服务器(比如在家里面搭建一个私有服务器),甚至还可以将 MySQL 的 3306 端口
映射之后,在任意地点远程连接内网的数据库。这给我们带来来极大的方便,也不需要购买第三方服务(例如花生壳)。

 

稿件来源:阿里云开发者社区

 

 

<think>好的,我需要帮助用户了解如何通过TCP协议进行内网穿透,并推荐相关技术和工具。首先,我要理解内网穿透的基本概念,特别是TCP相关的。内网穿透允许外部网络访问内网中的服务,通常用于开发测试或远程访问。 接下来,用户提到了cpolar这个工具,引用中的信息显示它是一个安全的内网穿透服务,支持HTTP和TCP协议。我需要确认cpolar是否确实支持TCP穿透,并查看其文档。根据提供的官网和文档链接,访问cpolar的网站,查找关于TCP穿透的具体配置步骤。例如,cpolar可能需要用户安装客户端,然后通过命令行或配置文件设置TCP隧道。 然后,用户可能需要更多工具或方法,而不仅仅是cpolar。我应该回忆其他常用的内网穿透工具,比如ngrok、frp、NATAPP等,确认它们是否支持TCP协议。例如,ngrok确实支持TCP隧道,而frp是一个开源项目,配置灵活,适合自行搭建。需要简要介绍每个工具的特点、安装步骤和基本使用方法,确保信息准确。 此外,还需要考虑TCP穿透的技术原理,比如端口映射、反向代理等,帮助用户理解底层机制。但用户可能更关注实际应用,所以需要平衡理论和操作步骤。 用户的问题还涉及实现方法,所以除了推荐工具,可能需要简要说明实现步骤,例如安装工具、配置本地端口、启动服务等。同时,要提醒用户注意安全性,比如使用加密、访问控制等,避免内网暴露带来的风险。 最后,生成相关问题,考虑用户可能的后续疑问,比如工具比较、安全性、自建服务器等。确保问题覆盖用户可能感兴趣的其他方面。 需要检查所有技术细节的准确性,例如安装命令、配置示例是否正确,避免提供错误信息。同时,保持回答结构清晰,分点列出工具和步骤,便于用户理解。</think>### 通过TCP协议实现内网穿透的方法与工具 #### 一、TCP内网穿透的核心原理 TCP内网穿透通过建立公网与内网之间的双向通信隧道实现。基本原理是**反向代理技术**:用户在内网运行客户端,将本地TCP服务端口映射到公网服务器,公网请求通过固定域名或IP转发到内网服务[^1]。关键技术包括端口映射、心跳保活和协议转换。 #### 二、推荐工具及实现步骤 1. **cpolar(云服务型)** - **特点**:无需公网IP,支持HTTP/HTTPS/TCP协议,提供固定二级子域名 - **安装与使用**: ```bash # CentOS安装 curl -L https://www.cpolar.com/static/downloads/install-release-cpolar.sh | sudo bash systemctl enable cpolar cpolar authtoken [您的授权令牌] # 从官网获取 # 创建TCP隧道 cpolar tcp 22 # 将内网SSH端口(22)映射到公网 ``` - 访问官网控制台查看公网地址`tcp://3.tcp.cpolar.top:10246` 2. **frp(自建服务器型)** - **特点**:开源、可自定义服务器,支持TCP/UDP/HTTP - 实现步骤: 1. 在公网服务器部署frps(服务端) ```ini # frps.ini [common] bind_port = 7000 ``` 2. 在内网机器部署frpc(客户端) ```ini # frpc.ini [common] server_addr = x.x.x.x # 公网IP server_port = 7000 [ssh] type = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = 6000 # 公网访问端口 ``` 3. 通过`公网IP:6000`访问内网SSH服务 3. **Ngrok(开发者友好型)** - **特点**:提供即时域名,支持TCP/HTTP - 快速启动: ```bash ngrok tcp 3389 # 映射远程桌面端口 ``` #### 三、关键配置对比表 | 工具 | 协议支持 | 需公网服务器 | 适用场景 | |---------|------------|--------------|--------------------| | cpolar | TCP/HTTP | 否 | 快速演示、临时测试 | | frp | TCP/UDP | 是 | 长期稳定服务 | | Ngrok | TCP/HTTP | 否 | 开发调试 | #### 四、安全建议 1. 启用TLS加密传输(如frp的`tls_enable = true`) 2. 设置访问密码(cpolar的`-auth`参数) 3. 限制IP白名单(frps的`allow_ports`)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值