内网穿透

作者: aq_wzj | 来源:发表于2019-07-17 14:54 被阅读183次

参照 http://www.hackliu.com/?p=363

使用ngrok进行内网穿透
前提必需品:

  1. 有公网ip的服务器
  2. 域名

域名解析情况:

*.ngrok.wangzhaojin.top  --> 106.14.146.125
ngrok.wangzhaojin.top  --> 106.14.146.125

ngrok分为客户端和服务端, 服务端放到公网服务器上, 客户端放到自己的电脑上

1. 服务端操作(公网服务器)

1.1 安装环境
  1. 基础环境

    yum update
    yum install gcc -y
    yum install git -y
    
  2. 安装go语言, 不要使用yum安装, 使用源码或二进制包安装, 安装完成以后配置GOPATH, GPROOT什么的

1.2 ngrok安装
  1. 获取软件包

    git clone https://github.com/inconshreveable/ngrok.git
    
  2. 生成证书

    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
    
  3. 将新生成的证书替换,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
    
  4. 编译生成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:80https://ngrok.wangzhaojin.top:443访问ngrok提供的转发服务了

image.png

如图所示显示 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如下图

image.png

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

image.png

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

image.png

好吧, 我的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

相关文章

  • 钉钉内网穿透vs花生壳vsNATAPP

    目前常用的内网穿透有3种:钉钉内网穿透,花生壳内网穿透,natapp内网穿透。下面我们来对比一下他们的优略以及使用...

  • 内网端口穿透

    内网端口穿透 内网穿透在实际生活中,我们经常会在内网里部署服务让外网访问内网应用。这里我用的花生壳免费的内网穿透。...

  • Sunny-Ngrok实现自定义域名内网穿透

    内网穿透 + Sunny-Ngrok + 自定义域名 1、内网穿透 1.1 内网IP:内网IP,过多官方的解释这里...

  • 自建NAS系列04——网络服务

    内网穿透 花生壳 公网服务器与frp 内网穿透 内网穿透就是将自己内网中的服务映射到公网ip,达到公网可访问的目的...

  • frp内网穿透

    1-内网穿透 内网穿透即内网映射,可以将局域网变公网,从而可以让外网访问本地局域网内的服务。内网穿透原理技术有这么...

  • sunny-ngrok 内网穿透

    sunny-ngrok 内网穿透是基于 ngrok 的一个内网穿透服务,提供免费的用于开发的内网穿透隧道。 接下来...

  • RaspberryPi的内网穿透

    RaspberryPi的内网穿透 所谓的内网穿透,就是能在公网上访问到你局域网里的机器。 内网穿透到工具有很多,最...

  • 内网穿透(Windows+Linux):SakuraFrp详解

    前言 不会就学,内网穿透搞起 内网穿透 百度百科的介绍: SakuraFrp 今天找到的内网穿透工具,一次直接成功...

  • NATAPP内网穿透工具的使用教程

    内网穿透: 内网穿透简单来说就是将内网外网通过natapp隧道打通,让内网的数据让外网可以获取。 项目场景: 在本...

  • 内网穿透

    使用frp进行内网穿透,可以很方便地进行调试,比如微信公众号。穿透前,需要有一台能连接公网的机器,京东云最近做活动...

网友评论

    本文标题:内网穿透

    本文链接:https://www.haomeiwen.com/subject/fsiqlctx.html