从0到1打造自己专属内网穿透工具

从0到1打造自己专属内网穿透工具

1、什么人适合看这篇文章

  • 正在使用teamview或者QQ等远程工具,但是经常掉线而烦恼的用户
  • 有很多个人的站点,但是不想花费很多的资金去购买ecs服务器的用户

2、问题的由来

从笔者的自身的角度出发,以上的2个痛点都有

  • teamview个人版经常是掉线,商业版本价格不菲。但是远程办公的场景是不可避免的
  • 个人电脑上搭建了一套漂亮的系统,想给不在一个局域网的朋友演示一番,对不起网络不通,难道必须要部署到一台具有公网ip的机器上才能达到目的,答案是No
  • 随着自己的兴趣和业务的拓展,当初的一台ecs服务器已经出现了资源不足了,难道只能不上线了或者继续砸钱购买ecs,答案同样是No

所以本文是能给你带来便利和省money的福利文章

3、基础知识准备

3.1、什么是内网穿透

说的简单直白一点就是把处于内网的机器映射出去,让不在同一局域网的用户可以直接访问。感知如何访问是公网的ip一样

3.2、基本的原理

  • 首先必须要有一台具有公网的ip的机器(暂且称为A)作为中心
  • 内网机器(暂且称为B)通过socket与A进行socket进行通讯
  • 用户直接访问A的地址,解析出对应的请求需要转发到B,所以消息的方式发送到B
  • B收到消息,在本地执行请求的命令,然后到执行的结果以消息的方式回发给A
  • A将结果返回给用户
  • 实现的效果如同用户直接访问B一样

3.3、常规的实现方案

  • 反向代理(如nginx,代理的机器需要和nginx在同一局域网内)
  • 花生壳
  • nat123
  • ngrok
  • frp

4、本文需要介绍的重点

本篇重点介绍的是其中的一款ngrok

ngrok是一款开源的老牌的内网穿透工具,目前开源值1.7,2.0以上版本回归商业版,不过对于个人用户来说已经足够了,稳定好用,国内有不少的基于ngrok的二次开发收费工具。其实自己会搭建,何必花冤枉钱

5、ngrok搭建详细步骤

5.1、前期的必要准备

  • 一台ecs
  • 一个域名

域名需要本案,同时添加域名映射,ngrok.xx.com

需要添加三级域名映射 *.ngrok.xx.com (这个是重点,很多教程中都没提到这一点,走了不少弯路)

5.2、获取源码

  • 源码的地址是https://github.com/chen-xing/ngrok-one-key-install

5.2.1、很多的教程的步骤是

  • 搭建linux环境
  • 安装 git go 环境
  • 下载代码
  • 生成证书
  • 编译代码,根据平台分别生成不同版本的 服务端和客户端
  • 启动服务端
  • 配置config,启动客户端,连接客户端

5.2.2、难点

前置的环境步骤过多,而且很多都是国外,连接性不好

步骤繁琐,影响出现拦路虎而不不知所措

5.2.3、不一样的步骤

从git 上直接下载编译好的服务端和客端

下载地址:https://github.com/chen-xing/ngrok-one-key-install/tree/master/latest

从0到1打造自己专属内网穿透工具_第1张图片

注意匹配自己的机器的系统类型

5.3、服务端启动步骤

  • 在服务端程序的同级目录下执行命令

    nohup ./ngrokd -domain="ngrok.xxx.com" -httpAddr=":8080" -httpsAddr=":8000" -tunnelAddr=":8001"
    命令参数解释
    nohup 在操作系统后台运行次程序,防止控制台关闭,程序退出
    domain  指定代理的域名,需要在域名服务上做好解析,客户端连接的时候需要对应上
    httpAttr http请求的代理端口
    httpsAttr https的请求的代理端口
    tunnelAddr soket通讯的端口
    
    出现以下的提示信息的时候说明是启动成功
    [07:31:47 CST 2019/05/03] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [registry] [tun] No affinity cache specified
    [07:31:47 CST 2019/05/03] [INFO] (ngrok/log.Info:112) Listening for public http connections on [::]:8080
    [07:31:47 CST 2019/05/03] [INFO] (ngrok/log.Info:112) Listening for public https connections on [::]:8000
    [07:31:47 CST 2019/05/03] [INFO] (ngrok/log.Info:112) Listening for control and proxy connections on [::]:8001
    [07:31:47 CST 2019/05/03] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [metrics] Reporting every 30 seconds
    [07:31:48 CST 2019/05/03] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [pub:b078d6f] New connection from 58.101.43.167:9229
    
    

5.4、客户端的启动步骤

  • 在客户端程序的同级目录下创建ngrok.cfg文件

    server_addr: "ngrok.xxx.com:8001"
    trust_host_root_certs: false
    
    server_addr 指定服务端的通讯的端口,与服务端的tunnelAddr一致
    trust_host_root_certs  关闭支持TLS加密协议的证书信任
  • 执行客户端的启动命令

    ngrok -config=ngrok.cfg -subdomain %clientid% %port%
    %clientid%  为需要映射出来的三级子域名,如aa
    %port% 为代理的本地的端口 如8080
    
    
    ngrok                                                                                        (Ctrl+C to quit)
    
    Tunnel Status                 online
    Version                       1.7/1.7
    Forwarding                    http://aa.ngrok.xx.com:8080 -> 127.0.0.1:9080
    Forwarding                    https://aa.ngrok.xx.com:8080 -> 127.0.0.1:9080
    Web Interface                 127.0.0.1:4040
    # Conn                        1161
    Avg Conn Time                 5006.61ms
    出现以下的页面的时候说明连接成功,可以使用 http://aa.ngrok.xx.com:8080 来访问你本地的站点
    
    127.0.0.1:4040 则是本地流量回放的web页面
    
    

    从0到1打造自己专属内网穿透工具_第2张图片

5.5、远程桌面或远程服务代理

  • 执行启动命令
ngrok -config=ngrok.cfg -proto=tcp %clientid%
%port% 为代理的本地的端口 如22

执行成功就会把本地的22端口映射成公网地址,其他局域网的用不就可以用这个映射地址通过ssh工具来访问你的 机器
其他 3389 3306处理方式一样
  • 客户端的命令说明

      -log string
            Write log messages to this file. 'stdout' and 'none' have special meanings (default "none")
      -log-level string
            The level of messages to log. One of: DEBUG, INFO, WARNING, ERROR (default "DEBUG")
      -proto string
            The protocol of the traffic over the tunnel {'http', 'https', 'tcp'} (default: 'http+https') (default "http+https")
      -subdomain string
            Request a custom subdomain from the ngrok server. (HTTP only)
    
    Examples:
            ngrok 80
            ngrok -subdomain=example 8080
            ngrok -proto=tcp 22
            ngrok -hostname="example.com" -httpauth="user:password" 10.0.0.1
    
    
    Advanced usage: ngrok [OPTIONS]  [command args] [...]
    Commands:
            ngrok start [tunnel] [...]    Start tunnels by name from config file
            ngrok list                    List tunnel names from config file
            ngrok help                    Print help
            ngrok version                 Print ngrok version
    
    Examples:
            ngrok start www api blog pubsub
            ngrok -log=stdout -config=ngrok.yml start ssh
            ngrok version

使用ngrok进行代理ssh的时候,服务端的端口是随机生成的,但是服务端处于安全性的考虑,能够开放的端口的有限的,那么如何固定ssh时候,服务端的端口

  • 参考的配置

    创建yml文件 ngrok.yml
    server_addr: "ngrok.chenzhuofan.top:8001"
    trust_host_root_certs: false
    tunnels:
      ssh:
       remote_port: 36826
       proto:
         tcp: 3389
    
    
       启动脚本
       ngrok -log=stdout -config=ngrok.yml start ssh
    
  • 完整版的参考

    server_addr: youdomain.com:4443
    trust_host_root_certs: false
    inspect_addr: disabled
    auth_token: 用户ID
    password: "认证ID"
    
    tunnels:
    
        httptun:
          remote_port: 8443
          subdomain: "www.test"
          proto:
            https: 192.168.1.1:80
        nas:
          remote_port: 5000
          subdomain: "nas"
          proto:
            https: 192.168.1.20:5000
        mian:
            remote_port: 12322
            proto:
                tcp: 192.168.1.1:22
    

6、后续

更多精彩,敬请关注, 程序员导航网 https://chenzhuofan.top

从0到1打造自己专属内网穿透工具_第3张图片

你可能感兴趣的:(从0到1打造自己专属内网穿透工具)