300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 云服务器+ngrok搭建内网穿透服务(只有公网ip无域名)

云服务器+ngrok搭建内网穿透服务(只有公网ip无域名)

时间:2023-01-04 08:49:59

相关推荐

云服务器+ngrok搭建内网穿透服务(只有公网ip无域名)

有的时候在项目开发或者远程开发时,需要把本地端口映射到公网上,让本地端口可以远程访问(TCP(ssh), http, https等),如果自己没有一台拥有公网ip的服务器的话可以租一台阿里云服务器或者腾讯云服务器。

服务器上操作:

购买完成后,在腾讯云服务器中添加安全组开放端口,注意,ngrok默认使用4443端口进行通信。

远程ssh连接到阿里云服务器上,更新(由于腾讯云服务器默认没有root权限,所以加sudo,或者切换为root用户,如果是有root权限,则不用加上sudo)。

apt-get update

安装git和go语言(为ngrok提供支持)

go安装

下载

下载地址:/dl

解压

tar -zxvf go2.25.1.linux-amd64.tar.gz

配置

vim /etc/profile

#GOexport PATH=$PATH:/opt/go/go/bin#GOPATH#export GOPATH=/opt/go/workspace#export PATH=$PATH:$GOPATH/bin# Set the GOPROXY environment variableexport GOPROXY=https://goproxy.io,direct# Set environment variable allow bypassing the proxy for specified repos (optional)export GOPRIVATE=,/my/private

编辑完成之后运行下面的命令

source /etc/profile

验证

go version

git 安装

apt-get install git

验证

git --version

下载源码ngrok (项目早已停止更新,源码完全固定)

下载地址

或者使用git下载。

git clone /inconshreveable/ngrok.git

使用ip生成自签证书

解决报错:开启服务后,服务端报错Failed to read message: remote error: bad certificate, 客户端端报错 x509: cannot validate certificate for xx.xx.xx.xx because it doesn't contain any IP SANs

(参考 /p/d308b92e58ea)

# 添加环境配置vim /etc/profileexport DOMAIN=xx.xx.xx.xx # 域名,这里我用了 ip# 刷新配置serouce /etc/profile# 验证配置成功没有echo $DOMAIN# 生成自签证,一年过期echo subjectAltName = IP:xx.xx.xx.xx > f #如果使用ip直接访问的话必须加这一句以及最后的-extfile fopenssl genrsa -out rootCA.key 2048openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$DOMAIN" -days 10000 -out rootCA.pemopenssl genrsa -out device.key 2048openssl req -new -key device.key -subj "/CN=$DOMAIN" -out device.csropenssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 10000 -extfile f# 复制并覆盖到 assets 构建的时候自动引用yes|cp rootCA.pem assets/client/tls/ngrokroot.crtyes|cp device.crt assets/server/tls/snakeoil.crtyes|cp device.key assets/server/tls/snakeoil.key

去掉随机生成的 subdomain

ngrok 客户端会自动生成一个随机子域名或者用户自定义一个,总之无论如何都会有一个域名,这就会导致 ip 域名无效, 例如http://92832de0.1.1.1.1 -> localhost:80, 解决办法就是改源码,去掉随机生成的 subdomain。代码地址:src/ngrok/server/tunnel.go 第89 行

// src/ngrok/server/tunnel.go #89 行// Register for random URLt.url, err = tunnelRegistry.RegisterRepeat(func() string {return fmt.Sprintf("%s://%x.%s", protocol, rand.Int31(), vhost)}, t)

修改后:

return fmt.Sprintf("%s://%s", protocol, vhost)

注意: 删掉%x. ,rand.Int31(), 以及该文件第一行引入的math/rand,重新编译出服务端与客户端即可。这样不加 -subdomain 选项就不会有子域名

编译服务端(编译可能会很慢,慢慢等)

如果出现GnuTLS recv error (-110): The TLS connection was non-properly terminated,安装gnutls-bin

apt-get install gnutls-bin

如果出现go: go.mod file not found in current directory or any parent directory; see 'go help modules'

解决办法

开启go modules功能,命令行输入

#开启go env -w GO111MODULE=on#关闭go env -w GO111MODULE=off

再不行关了在开。

生成客户端与服务端

<!--linux服务端/客户端-->GOOS=linux GOARCH=386 make release-server (32位)GOOS=linux GOARCH=amd64 make release-server(64位)GOOS=linux GOARCH=386 make release-client (32位)GOOS=linux GOARCH=amd64 make release-client(64位)<!--Mac OS服务端/客户端-->GOOS=darwin GOARCH=386 make release-serverGOOS=darwin GOARCH=amd64 make release-serverGOOS=darwin GOARCH=386 make release-clientGOOS=darwin GOARCH=amd64 make release-client<!--windows服务端/客户端-->GOOS=windows GOARCH=386 make release-serverGOOS=windows GOARCH=amd64 make release-serverGOOS=windows GOARCH=386 make release-clientGOOS=windows GOARCH=amd64 make release-client

编译完成后在bin目录下应当有如下文件:

go-bindata ngrok ngrokd windows_amd64

ngrokd是公网阿里云服务器上运行的程序,ngrok是本地运行的程序,可以使用scp拷贝到本地或者使用xftp传输到本地

启动服务器

./bin/ngrokd -tlsKey=device.key -tlsCrt=device.crt -domain="xx.xx.xx.xx" -httpAddr=":8000" -httpsAddr=":8443"

参数说明:

-httpAddr=":8000" http服务的访问端口 默认80

-httpsAddr=":8443" https服务的访问端口 默认443

-tunnelAddr=":4443" 客户端连接服务端的端口 默认4443

注意事项,使用端口时,同时记得配置防火墙。

启动客户端

以windows为例:

/bin/windows_amd64/ngrok.exe文件传输到本地。

然后在当前目录下新建文件ngrok.cfg,注意与ngrok.exe在相同目录下。

server_addr: "xx.xx.xx.xx:4443" trust_host_root_certs: false

然后新建脚本start.bat

ngrok -config=ngrok.cfg -log=ngrok.log 8080

8080就是本地端口的地址

norok.log 就是日志的日志的名称

双击start.bat即可。

使用tmux在后台运行程序

apt-get install tmux

新建tmux窗口(名称为ngrok)并进入,退出用Ctrl+D,或者直接关闭窗口

tmux new-session -s ngrok

连接tmux窗口

tmux attach-session -t ngrok

列出所有tmux窗口

tmux ls

关闭某个tmux窗口

tmux kill-window -t ngrok

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。