引言
从早上10点钟左右就开始做这个测试了,我是在学生,使用的是学校里面的校园网,没有路由器,不能做端口映射做内网穿透。当然使用花生壳等内网穿透工具还是可以得,但是有时候满足不了我的需求,比如我需要指定固定端口做转发,同时需要http和TCP的转发,并且直接局域网内的某台主机穿透,还有一点就是用自己的域名看着比较爽。经过几个小时的奋战,最终还是成功了,中间遇到了很多的坑。。结合了多个教程才完成的。下面简单记录一下。
Ngrok简介
Ngrok是一款可以搭建在Linux端上作为转发工具的服务,可以将自己定义的域名解析到该服务器,然后利用Ngrok服务,将指定端口发送来的数据转发到内网的主机上面,当然,内网主机也是需要Ngrok的客户端和服务器相连接的。这样就可以实现外网访问内网,在做web开发的时候,可以直接以内网服务器作为web服务端,直接使用域名访问,在渗透测试的时候,可以直接将靶机的TCP反弹连接反弹到内网服务器,实现控制靶机的功能。总之,Ngrok用起来还是比较爽的。
Ngrok服务器搭建
搭建之前首先需要有一台外网服务器和一个域名。我这里以waitgg.cn做测试,我已经将waitggl.cn泛解析为*.ngrok.waitggl.cn
1、安装go环境
因为Ngrok是用go语言编写的,所以我们首先安装go环境。
1 2 |
wget https://storage.googleapis.com/golang/go1.4.3.linux-amd64.tar.gz sudo tar -C /usr/local -xzf go1.4.3.linux-amd64.tar.gz |
这样我们就把go解压到了/usr/local目录下面,但是这时候输入go命令是无效的,这里需要做一下软连接。
1 |
ln <span class="sh_symbol">-</span>s <span class="sh_symbol">/</span>usr<span class="sh_symbol">/</span>local<span class="sh_symbol">/</span>go<span class="sh_symbol">/</span>bin<span class="sh_comment">/* /usr/bin/</span> |
3、下载Ngrok并生成口令
在这之前请确保服务器上面已经安装了最新版的git,若没有请自行百度安装方法。
下载Ngrok
1 2 3 4 5 |
cd /usr/local git clone https://github.com/inconshreveable/ngrok.git export GOPATH=/usr/local/ngrok/ export NGROK_DOMAIN="ngrok.waitggl.com" cd ngrok |
ps:上面的export是创建变量其中NGROK_DOMAIN 的值要改为你的域名。
生成证书,并拷贝到指定目录
1 |
1 2 3 4 5 6 7 8 9 10 |
#生成 openssl genrsa -out rootCA.key 2048 openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=ngrok.dou2b.com" -days 5000 -out rootCA.pem openssl genrsa -out device.key 2048 openssl req -new -key device.key -subj "/CN=ngrok.dou2b.com" -out device.csr openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000 #复制 cp -n rootCA.pem ./ngrok/assets/client/tls/ngrokroot.crt cp -n device.crt ./assets/server/tls/snakeoil.crt cp -n device.key ./assets/server/tls/snakeoil.key |
编译服务端
1 2 3 4 |
cd /usr/local/go/src GOOS=linux GOARCH=386 ./make.bash cd /usr/local/ngrok/ GOOS=linux GOARCH=386 make release-server |
ps:注意上面的GOOS和GOARCH可以通过命令go env看到,GOARCH=386代表的是32的操作系统,如果是64位的应该是amd64
编译客户端
客户端的编译分为多动,不同的操作系统对应着不同的客户端。
1)Windows客户端编译
1 2 3 4 |
cd /usr/local/go/src GOOS=windows GOARCH=amd64 ./make.bash cd /usr/local/ngrok/ GOOS=windows GOARCH=amd64 make release-client |
ps:上面的GOOS和GOARCH注意一下。代表Windows x64
2)Linux客户端编译
1 |
make release-client |
3)mac客户端编译
1 2 3 4 |
cd /usr/local/go/src/ GOOS=darwin GOARCH=amd64 CGO_ENABLED=0 ./make.bash cd /usr/local/ngrok GOOS=darwin GOARCH=amd64 make release-client |
4)树莓派客户端
1 2 3 4 |
cd /usr/local/go/src/ GOOS=linux GOARCH=arm CGO_ENABLED=0 ./make.bash cd /usr/local/ngrok GOOS=linux GOARCH=arm make release-client |
到此为止,我们的准备工作基本上就做完了,只要选择相应的客户端进行编辑就好。
我用的是window64位的操作系统,我们就以此为例
服务端和客户端都编译完成之后会在/usr/local/ngrok/bin目录下面有一个ngrok文件和windows_amd64文件夹,其中ngrok就是我们的服务端,windows_amd64下面会有一个ngrok.exe文件,这个就是我们的Windows客户端文件,我们把ngrok.exe文件复制到Windows机器上面。
4、运行Ngrok服务端和客户端
服务端启动
1 |
/usr/local/ngrok/bin/ngrokd -domain="$NGROK_DOMAIN" -httpAddr=":8081" |
ps:上面的$NGROK_DOMAIN就是我们的域名
当服务启动之后,服务器会监听8081、443、4443端口。所以在这之前最好不要有端口占用。当然这几个端口是可以指定的
客户端启动
在运行客户端之前,需要在ngrok.exe目录下面新建一个ngrok.cfg,内容如下:
1 2 |
server_addr: "ngrok.waitggl.cn:4443" trust_host_root_certs: false |
在cmd中进入到ngrok.exe目录下面,执行命令
1 |
ngrok -proto=http -config=./ngrok.cfg -subdomain=test 80 |
上面的-proto指定了转发方式,-cofig指定了刚才新建的文件,-subdomain指定的是域名域名的子域名,80是本地的端口,一般web的端口。
如果使用转发TCP命令如下:
1 |
ngrok -subdomain=test -proto=tcp -config=./ngrok.cfg 80 |
但是这种方式转发的TCP外网的端口是随机的,如果我们要使用固定的端口要用下面方式启动客户端:
修改ngrok.cfg文件为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
server_addr: "ngrok.waitggl.cn:4443" trust_host_root_certs: false tunnels: http: proto: http: 127.0.0.1:80 subdomain: test https: proto: https: 443 subdomain: test2 ssh: remote_port: 5555 proto: tcp: 5555 |
上面的127.0.0.1可以修改为局域网任何一个ip下面同样,不写默认127.0.0.1,ssh中的remote是服务器的tcp短发端口,proro中的tcp是本地的tcp端口。
启动命令如下
1 |
ngrok -config=ngrok.cfg start http https ssh |
上面的http、https、ssh是可选的,单个启动或者多个启动都可以
启动完成后的界面应该是这样:
这时候访问域名http://test.ngrok.waitggl.cn:8081/访问的就是本地的127.0.0.1:80 了。
结束语
Ngrok服务器的搭建基本的过程就是这样,若有什么错误,还请指正。
最后感谢以下参考文章:
http://www.sunnyos.com/article-show-48.html
http://www.tuicool.com/articles/aUJF7zf
http://www.07net01.com/2016/09/1676429.html
http://www.mamicode.com/info-detail-1368658.html