内网穿透概念

什么是内网穿透?内网穿透,也即 NAT 穿透,进行 NAT 穿透是为了使具有某一个特定源 IP 地址和源端口号的数据包不被 NAT 设备屏蔽而正确路由到内网主机。

UDP 内网穿透的实质是利用路由器上的NAT 系统。NAT 是一种将私有(保留)地址转化为合法IP地址的转换技术,它被广泛应用于各种类型 Internet 接入方式和各种类型的网络中。NAT可以完成重用地址,并且对于内部的网络结构可以实现对外隐蔽。

但是有些情况下我们不能随意控制路由器的NAT功能,哪个就需要一些软件来辅助实现类似NAT功能的内网穿透。

应用场景:总结一句话就是本地运行的项目,如果不使用内网穿透,只能本机访问。用到了内网穿透,就会给一个公网的ip代替本地ip,这样别人就可以访问到你的本地项目啦。


用到的工具

ngrok 我们可以把他部署到windows上,当然也可以部署到linux上。接下来让我们以windows下的使用过程为例进行演示。

使用过程

1、注册ngrok账号

2、成功完成登录

【内网穿透】ngrok实现内网穿透详细教程_远程

3、下载ngrok客户端(根据自己得os选择对应的软件,我这里式Windows的)

4、下载后解压

PowerShell 7.3.8
PS D:\> cd E:\temp\ngfrok
PS E:\temp\ngfrok> .\ngrok help
NAME:
  ngrok - tunnel local ports to public URLs and inspect traffic

USAGE:
  ngrok [command] [flags]

DESCRIPTION:
  ngrok exposes local networked services behinds NATs and firewalls to the
  public internet over a secure tunnel. Share local websites, build/test
  webhook consumers and self-host personal services.
  Detailed help for each command is available with 'ngrok help <command>'.
  Open http://localhost:4040 for ngrok's web interface to inspect traffic.

Author:
  ngrok - <support@ngrok.com>

TERMS OF SERVICE: https://ngrok.com/tos

EXAMPLES:
  ngrok http 80                           # secure public URL for port 80 web server
  ngrok http --domain baz.ngrok.dev 8080  # port 8080 available at baz.ngrok.dev
  ngrok http foo.dev:80                   # tunnel to host:port instead of localhost
  ngrok http https://localhost            # expose a local https server
  ngrok tcp 22                            # tunnel arbitrary TCP traffic to port 22
  ngrok tls --domain=foo.com 443          # TLS traffic for foo.com to port 443
  ngrok start foo bar baz                 # start tunnels from the configuration file

COMMANDS:
  api                            use ngrok agent as an api client
  completion                     generates shell completion code for bash or zsh
  config                         update or migrate ngrok's configuration file
  credits                        prints author and licensing information
  diagnose                       diagnose connection issues
  help                           Help about any command
  http                           start an HTTP tunnel
  service                        run and control an ngrok service on a target operating system
  start                          start tunnels by name from the configuration file
  tcp                            start a TCP tunnel
  tls                            start a TLS tunnel
  tunnel                         start a tunnel for use with a tunnel-group backend
  update                         update ngrok to the latest version
  version                        print the version string

OPTIONS:
      --config strings    path to config files; they are merged if multiple
  -h, --help              help for ngrok
      --metadata string   opaque user-defined metadata for the tunnel session
  -v, --version           version for ngrok
PS E:\temp\ngfrok>

5、确定需要在外网访问到自己内网计算机的端口号以及使用的协议

可以使用netstat -ano | findstr xxx来查询

我这里以远程桌面端口3389为例,当然要记得设定好防火墙的例外。

【内网穿透】ngrok实现内网穿透详细教程_NAT_02

6、设置ngrok,使其连接到自己的账户:

ngrok config add-authtoken 2Wxhip**********************************KvmEVKE
PS E:\temp\ngfrok> .\ngrok config add-authtoken 2Wxhip**********************************KvmEVKE
Authtoken saved to configuration file: C:\Users\Administrator\AppData\Local/ngrok/ngrok.yml
PS E:\temp\ngfrok>

这串token代码在自己的账号下,每个账户都是自己独一无二的。

【内网穿透】ngrok实现内网穿透详细教程_远程_03

7、设置端口的对外映射

我这里是tcp的3389端口

PS E:\temp\ngfrok> netstat -ano | findstr 3389
  TCP    0.0.0.0:3389           0.0.0.0:0              LISTENING       1532
  TCP    [::]:3389              [::]:0                 LISTENING       1532
  UDP    0.0.0.0:3389           *:*                                    1532
  UDP    [::]:3389              *:*                                    1532
PS E:\temp\ngfrok> .\ngrok help

PS E:\temp\ngfrok> .\ngrok tcp 3389
ngrok                                                                                                                               (Ctrl+C to quit)                                                                                                                                                    Introducing Always-On Global Server Load Balancer: https://ngrok.com/r/gslb                                                                                                                                                                                                                             Session Status                online                                                                                                                Account                       GoodMan (Plan: Free)                                                                                                  Version                       3.3.5                                                                                                                 Region                        Japan (jp)                                                                                                            Latency                       33ms                                                                                                                  Web Interface                 http://127.0.0.1:4040                                                                                                 Forwarding                    tcp://0.tcp.jp.ngrok.io:13755 -> localhost:3389                                                                                                                                                                                                                           Connections                   ttl     opn     rt1     rt5     p50     p90                                                                                                         0       0       0.00    0.00    0.00    0.00

关键词:

(Ctrl+C to quit) 作用是告知按CTRL+C键退出。

Web Interfacehttp://127.0.0.1:4040作用是以网页的形式显示连接情况:

【内网穿透】ngrok实现内网穿透详细教程_远程_04

Forwarding tcp://0.tcp.jp.ngrok.io:13755 -> localhost:3389

作用是0.tcp.jp.ngrok.io:13755转发到本地的3389端口

9、测试连接

PS D:\> telnet 0.tcp.jp.ngrok.io 13755
连接成功

同时在外部网络的计算机上尝试穿越Internet远程桌面到这台计算机

【内网穿透】ngrok实现内网穿透详细教程_内网穿透_05

【内网穿透】ngrok实现内网穿透详细教程_ngrok_06

至此,成功完成!