说在前面 :
ngrok是一个比较好用的内网穿透工具,通过他外网用户可以直接访问内网的设备,本文主要讲述如何自己搭建ngrok服务器。
准备:
为了搭建服务器,需要有一个外网ip地址,现在云服务很方便,可以随便租用一台设备来搭建服务器。
安装go编译器:
网上有很多安装的教程,需要注意的是1.4之后的版本需要使用1.4版本来进行编译,所以必须先安装go1.4然后再安装指定版本,网上很多教程都会忽略这一步,导致编译安装失败。下面有一个比较详细的教程,可以作为参考:
https://studygolang.com/articles/3188
在使用的时候ngrok客户端可能会在windows或者linux上使用,而go语言本身提供了交叉编译方法,所以不需要我们做修改去适配不同的机器,交叉编译参考下面的文档:
https://studygolang.com/topics/21
下载ngrok源码编译:
https://github.com/inconshreveable/ngrok
启动服务:
nohup ./bin/ngrokd -domain="your-ip" -httpAddr=":8081" -httpsAddr=":8082" -tunnelAddr=":443"
在shell下启动的服务当shell退出后会被自动杀死,所以在启动时使用nohup用于后台运行;
启动客户端:
./ngrok -config=ngrok.cfg start ssh
ngrok.cfg文件内容:
server_addr: "your-ip:443"
trust_host_root_certs: false
tunnels:
ssh:
remote_port: 35884
proto:
tcp: 22
windows下如果每次都用cmd输入命令则太过麻烦,所以可以自己写一个批处理文件来执行:
ngrok.bat:
ngrok -config=ngrok.cfg start ssh
pause
搭建服务时遇到的问题:
客户端链接失败:
服务器打印: Failed to read message: EOF
定位原因:
服务器端显示连接失败,百度之后确定为对端提前结束了tcp连接;
客户端启动时添加-log信息,显示客户端证书认证失败;
重新生成证书,并且采用debug方式编译server和client;
客户端启动时提示找不到证书,按照其指明的路径拷贝证书之后,连接ok;
最终解决方案:
由于服务是个人使用,所以没有那么关注安全认证,而且证书的路径是源码编译时的路径,本人没有找到如何修改为相对路径,所以直接修改client\debug.go中的rootcrtpaths,把内容删除,则可不要求证书直接连接。