背景
我为什么要写这个文档,因为遇到的坑太多了。一方面算是纪念一下,另一方面给同样想做内网穿透的小伙伴,贡献一点微薄之力。开干:
首先要有一台有公网ip的机器
我用的是腾讯云的轻量型应用服务器。
ngrok源码地址
https://github.com/inconshreveable/ngrok/tree/master
1、安装golang
- 网上几乎都是这种方法,但是不推荐,因为ngrok是六七年前就写好的东西,
centos: yum install golang -y
ubuntu:apt-get install golang-go
- 推荐方式,题主亲测可用,关键是如果这个版本不行,换个版本就行
# 去官网下载匹配的压缩包:https://go.dev/dl/
# 以1.15.15为例,我的x86_64架构,linux系统
# 1. 下载
wget https://go.dev/dl/go1.15.15.linux-amd64.tar.gz
# 2. 解压
tar -xvf go1.15.15.linux-amd64.tar.gz
# 3.配置环境变量, vi ~/.bashrc ,加入下面几行(加入刚才的解压目录在/opt)
export GOPATH=/opt/go
export GOROOT=/opt/go
export PATH=$GOROOT/bin:$PATH
# 4. 验证,出现版本号即可
go version
# 5. 坑点
使用1.15+版本的go编译,会报
rpc error: code = Unavailable desc = connection error: desc = "transport: authentication handshake failed: x509: certificate relies on legacy Common Name field, use SANs or temporarily enable Common Name matching with GODEBUG=x509ignoreCN=0"
是因为 go 1.15 版本开始[废弃 CommonName](https://golang.org/doc/go1.15#commonname),因此推荐使用 SAN 证书。 如果想兼容之前的方式,需要设置环境变量 GODEBUG 为 `x509ignoreCN=0`,或者使用以前的版本编译
编译
遇到的坑最多
- 如果是用1.16版本的go编译ngrok ,有错误(TODO:待补充),我换成了1.15.15版本
- 换成1.15.15后仍旧报错,出现缺包:code.google.com/p/log4go 找不到,即下载失败;
主要是 code.google.com 网站已关闭导致的,有人把它 fork 到 github 上面了,发现了好几个,如
https://github.com/alecthomas/log4go
https://github.com/thinkboy/log4go
因此,把项目中的 log "code.google.com/p/log4go" 替换改为 log "github.com/thinkboy/log4go" 即可!
- 这还没有完,还会报错,这个包缺失:github.com/inconshreveable/go-update/check,这是因为版本go-update的版本不对,编译时自动拉取的是最新的版本(最近的里面没有check), 所以需要进入到 src/github.com/inconshreveable/go-update路径下,把go-update的代码clone一份,切换到filemode分支,再回到ngrok主目录编译就行了
至此,本题主遇到的所有问题才得以解决,顺利编译通过
至于剩下的安装过程,借用下别人的经验(以后再补充):https://zhuanlan.zhihu.com/p/149968878
PS:草草的记录一下,有空了再整理。
网友评论