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