参照 http://www.hackliu.com/?p=363
使用ngrok进行内网穿透
前提必需品:
- 有公网ip的服务器
- 域名
域名解析情况:
*.ngrok.wangzhaojin.top --> 106.14.146.125
ngrok.wangzhaojin.top --> 106.14.146.125
ngrok分为客户端和服务端, 服务端放到公网服务器上, 客户端放到自己的电脑上
1. 服务端操作(公网服务器)
1.1 安装环境
-
基础环境
yum update yum install gcc -y yum install git -y
-
安装go语言, 不要使用yum安装, 使用源码或二进制包安装, 安装完成以后配置GOPATH, GPROOT什么的
1.2 ngrok安装
-
获取软件包
git clone https://github.com/inconshreveable/ngrok.git
-
生成证书
cd ngrok export NGROK_DOMAIN="ngrok.wangzhaojin.top" #修改成自己的二级域名 openssl genrsa -out rootCA.key 2048 openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pem openssl genrsa -out device.key 2048 openssl req -new -key device.key -subj "/CN=$NGROK_DOMAIN" -out device.csr openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000
-
将新生成的证书替换,1. 执行下面命令后 “y” 回车 一行一行执行代码!
cp rootCA.pem assets/client/tls/ngrokroot.crt cp device.crt assets/server/tls/snakeoil.crt cp device.key assets/server/tls/snakeoil.key
-
编译生成ngrokd
make release-server 报错1:没有go-bindata 将go安装目录下的bin/go-bindata复制到ngrok/bin/下,若没有bin则mkdir 如果go安装目录下也没有, 百度安装go-bindata 不要使用yum或apt安装, 要用go get装 还有什么deps乱七八糟的报错, 只会是一下三个原因 1. go环境没配好 2. 所下载的资源被墙 3. 重新克隆软件包, 重新生成证书再编译 生成的ngrokd文件则为服务端,所在位置可能在以下两处 1. ngrok/bin/下 2. go的安装目录/bin/下 取决于你有没有cp go-bindata文件, 若有, 则在1下
1.3 启动服务端
./bin/ngrokd -tlsKey="assets/server/tls/snakeoil.key" \
-tlsCrt="assets/server/tls/snakeoil.crt" \
-domain="ngrok.wangzhaojin.top" \
-httpAddr=":80" \
-httpsAddr=":8082" \
-tunnelAddr=":443"
命令过长, 手动换行的
参数介绍:
tlsCrt 证书位置
domain 你自己的二级域名
httpAddr 监听的公网http请求的端口
httpsAddr监听的公网https请求的端口
tunnelAddr 隧道的端口,即与客户端通信的端口
到这一步就能通过http://ngrok.wangzhaojin.top:80
和https://ngrok.wangzhaojin.top:443
访问ngrok提供的转发服务了

如图所示显示 Tunnel ngrok.wangzhaojin.top not found
则服务器启动成功
1.4 编译客户端
make release-client
编译之后的文件位置同服务端一样, 文件名为ngrok
这一步看网上的教程需要设置客户端的参数, 不同系统编译成不同客户端
如下
win 平台 64 位系统:GOOS=windows GOARCH=amd64 make release-client
Linux 平台 32 位系统:GOOS=linux GOARCH=386 make release-client
Linux 平台 64 位系统:GOOS=linux GOARCH=amd64 make release-client
Windows 平台 32 位系统:GOOS=windows GOARCH=386 make release-client
Windows 平台 64 位系统:GOOS=windows GOARCH=amd64 make release-client
MAC 平台 32 位系统:GOOS=darwin GOARCH=386 make release-client
MAC 平台 64 位系统:GOOS=darwin GOARCH=amd64 make release-client
ARM 平台:GOOS=linux GOARCH=arm make release-client
我的服务端和客户端都是linux_64平台, 这样编译之后:
客户端在centos7上显示版本1.7,可以使用
客户端在Ubuntu16.04上显示版本1.6,一直报证书错误, 很迷
所以我说直接make release-client, 不加前面的参数
2. 客户端操作(内网服务器)
2.1 将服务端生成的ngrok客户端, 放到内网服务器上
客户端软件放上去之后可能没有执行权限
[root@wzj ~]# ll
-rw-r--r-- 1 root root 10779349 7月 17 14:08 ngrok
[root@wzj ~]# chmod 777 ngrok
[root@wzj ~]# ll
-rwxrwxrwx 1 root root 10779349 7月 17 14:08 ngrok
执行chmod 777 ngrok
即可
2.2 在同级目录下新建一个配置文件
vi ngrok.cfg
server_addr: "ngrok.wangzhaojin.top:443"
trust_host_root_certs: false
注意:
1.域名换成自己的
2.这里的server_addr前面的域名与生成ssl证书以及启动服务端指定的domain一致
3.server_addr后面的端口与启动服务端时的指定的tunnelAddr一致
2.3 启动客户端
ngrok -config=ngrok.cfg -subdomain=v1 80
参数介绍:
subdomain为子域名的前缀,例如我们之前一直用的是ngrok.wangzhaojin.top
这样项目启动后地址就为v1.ngrok.wangzhaojin.top
80: 本地项目启动的端口
可能会报一下错误
[root@wzj ~]# ngrok -config=ngrok.cfg -subdomain=v1 80
-bash: /usr/bin/ngrok: 没有那个文件或目录
解决:
[root@wzj ~]# ln ngrok /usr/bin/
启动成功以后会显示status online
如下图

此时就可以在浏览器通过http://v1.ngrok.wangzhaojin.top来访问内网的项目了如下图

这里是因为我本地没有跑在80端口的项目, 如果启动了nginx就会有welcome to nginx 如图

好吧, 我的nginx还没配好, 懒得配了, 反正ngrok是能用了
结语
搭了很久才搭出来, 图中各种报错, 最后把软件源码全部删了, 最后有clone一次就莫名其妙的好了
发现是编译的时候加了那个GOOS和GOARCH, 搭好之后有个惊为天人的发现, 原来ssh隧道一行命令就搞定了
原来一行命令就能搞定
远程服务器(公网服务器)修改ssh配置文件
修改一下配置文件
vim /etc/ssh/sshd_config
添加一行
GatewayPorts yes
重启sshd服务
systemctl restart sshd
在本机(内网服务器)执行如下命令
ssh -f -N -R 10003:localhost:80 root@106.14.146.125
解释:
将公网的106.14.146.125:10003端口请求转发到本机的80端口
因为ssh会经常自动断开连接, 所以我将密码作为命令的参数
将命令写入脚本, 定时执行
wzj@wzj-dev:/home/ubuntu$ cat autocontent.sh
shpass -p [password] ssh -f -N -R 10003:localhost:80 root@106.14.146.125
网友评论