内网穿透-搭建ngrok服务器

时间:2022-06-01 18:45:29

有时需要让外网访问本机的web或者远程或者微信开发调试等其他,但本机没有公网ip就需要内网穿透,用花生壳等又受限制那就可以尝试自己搭建。
需要有个带公网IP的服务器和域名,我们可以用 ngrok 代码编译到自己服务器上(就相当于花生壳服务器),ngrok官方目前只开源1.x版本,下面以我的Centos6.x为例。
如果你想直接用成品,戳这里 http://www.wintercoder.com:81/

一、域名泛解析

到域名商处开启泛解析,解析到服务器

二、安装依赖环境

  1. 卸载Centos的yum自带的1.7版git,装上最新的,等会编译过程如果是老版本git就会卡在那。

    yum remove git

    wget https://github.com/git/git/archive/v2.2.1.tar.gz
    tar zxvf v2.2.1.tar.gz
    cd git-2.2.1
    make configure
    ./configure --prefix=/usr/local/git --with-iconv=/usr/local/libiconv
    make all doc
    make install install-doc install-html
    echo "export PATH=$PATH:/usr/local/git/bin" >> /etc/bashrc
    source /etc/bashrc

    git --version
  2. 其他

    yum install -y golang make mercurial 

三、生成证书

假设你希望到时客户端的域名是 ramdon.tunnel.wintercoder.com 这种,那下面的 NGROK_DOMAIN 就跟着改。
如果希望是直接的随机二级域名就改为 wintercoder.com 这种。
下面我们假设将证书放在 /key 下,ngrok代码等放在 /ngrok 下。

mkdir key
cd key

NGROK_DOMAIN="tunnel.wintercoder.com"
openssl genrsa -out base.key 2048
openssl req -new -x509 -nodes -key base.key -days 10000 -subj "/CN=$NGROK_DOMAIN" -out base.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 base.pem -CAkey base.key -CAcreateserial -days 10000 -out server.crt

之后这个key目录下会生成6个文件,如果上面代码被CSDN坑了显示不完全请按F12或者右键看源码

四、下载编译

# 刚才是在/key下,现在回到/
cd ..

git clone https://github.com/inconshreveable/ngrok.git

# 将自己域名的证书替换ngrok自带证书
cp -f key/base.pem ngrok/assets/client/tls/ngrokroot.crt
cp -f key/server.crt ngrok/assets/server/tls/snakeoil.crt
cp -f key/server.key ngrok/assets/server/tls/snakeoil.key

cd ngrok

# 优化步骤:修改默认域名,客户端运行就不需要配置文件
vi ./src/ngrok/client/model.go
修改 defaultServerAddr = "ngrokd.ngrok.com:443" 为 tunnel.wintercoder.com:4443

# 优化步骤:修改客户端左上角文字logo
Vi ./src/ngrok/client/views/term/view.go
第100行 v.APrintf(termbox.ColorBlue|termbox.AttrBold, 0, 0, "ngrok") 替换那个"ngrok"

# 编译
服务器端: make release-server
linux版客户端: make release-client
windows客户端32位: GOOS=windows GOARCH=386 make release-client
windows客户端64位: GOOS=windows GOARCH=amd64 make release-client
编译好的都在 bin/ 里

如果你的 cp 加了 -f 也需要确认,请输y,不想有提示的话按如下操作

vi ~/.bashrc
注释掉 alias cp='cp -i' 这行,wq 保存退出

运行

服务器端

如果希望默认的http跑在 xxx.tunnel.wintercoder.com 的8081端口(避免80端口冲突)则如下,https部分可以不要

./bin/ngrokd -domain="tunnel.wintercoder.com" -httpAddr=":8081" -httpsAddr=":8082"

客户端测试成功后就可以让它在后台运行且不因SSH的退出而暂停

nohup ./bin/ngrokd -domain="tunnel.wintercoder.com" -httpAddr=":8081" &

客户端

HTTP

客户端下载回来后命令行跑

ngrok -proto=http -subdomain sb 80

就有 http://sb.tunnel.wintercoder.com:8081 可以访问本地的80端口Web了,不指定 subdomain 的话就随机生成。
有做上面的默认域名优化的话也可以直接

ngrok 80

输出日志到文本且只显示INFO级别以上的日志

ngrok -log 1.txt -log-level=info 80

TCP端口

ngrok -proto=tcp 3389

后续

如果需要修改为直接二级域名的话再生成次证书,重编译就行了。

参考资料
https://blog.kuoruan.com/99.html
http://blog.lzp.name/archives/24