原创

从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、获取源码

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

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

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页面


  ![](https://img2018.cnblogs.com/blog/493641/201905/493641-20190506200918757-214970505.png)

#### 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

正文到此结束