软件工具 · 2024年9月6日 0

NAT内网穿透

你是否被以下问题所困扰

我想装个B让其他同学在外网访问我的程序,应该怎么办?

接了个小外包,给客户演示Demo没有站点怎么办?

做微信、支付宝支付等其他第三方平台的功能,没有外网回调地址,应该怎么办?

内网穿透,又叫NAT穿透,是计算机用语,翻译过来就是 你的电脑可以直接被你朋友访问。 通常我们的电脑是无法自己被访问的。因为我们的电脑缺少自己的独立的ip地址。现在ip稀缺,电信运营商已经不会随便分配固定ip给个人。

通常实现内网穿透,是通过路由器上端口映射来实现的。但是路由器通常不是每个人都有权限可以访问和设置,而且可能存在多级路由器较为复杂的网络结构。端口映射也无法实现。

工具对比

  • Ngrok开源,老牌穿透工具,源码很久没有更新了
  • 钉钉穿透工具基于ngrok封装,简单、见效快,新手、个人开发者最佳选择
  • 花生壳需要建立账号实名认证,支付2包卫龙辣条费用,可自选一个壳域名,注册过程比较麻烦,流量限制
  • NATAPP免费通道:提供http,tcp,udp全隧道穿透,随机域名/随机TCP,UDP端口,不定时强制更换域名/端口4包卫龙辣条的费用可以享有不限流量,自定义域名等好处
  • FRP自建开源,强大牛逼,适合企业中开发使用,可穿透任意常规合法端口(包含22),需要提供云服务器,自己的域名,宽带由云服务器所决定

Ngrok(强大)

三个可选版本

ngrok国际版

登录国际版官网 (opens new window),注册账号,但国外版访问很慢,时间就是金钱,不推荐去折腾,急切装逼的我果断放弃。

ngrok国内版

因为访问速度原因,有个国内版,名字叫Sunny-Ngrok (opens new window),访问地址如下:

  • 官网:http://ngrok.cc
  • 后台地址:https://www.ngrok.cc/user

使用步骤如下:

  1. 访问ngrok官网下载 (opens new window)下载对应你电脑的客户端,Mac就下Mac版

2.现在网站呢注册好之后,登录后台地址

3.提示绑定公众号,扫码绑定即可

4.开通免费隧道试试效果,如果经常使用,建议购买个10块钱的

5.配置服务器映射信息

上图的隧道ID是重点,圈起来,接下来要使用

6.开启客户端

打开命令行窗口CMD,切花到下载的客户端目录

7.输入如下命令启动客户端

上图表示前面的域名映射到我本机的9080端口,意思就是访问前面的域名跟访问我后面的127.0.0.1:9080是一个效果

8.接下来本地起一个可以访问的服务,端口为9080

9.浏览器访问,或者让你朋友在远方访问,顺便装个B

接下来再次访问

10.总结

  • 下载客户端
  • 在官网购买隧道,该隧道作为打通你本地的通道,记录下来隧道ID
  • 设置http授权信息(可选)
  • 使用命令行启动客户端,输入对应指令和隧道ID,返回启动成功的页面
  • 开启本地对应映射端口的Http服务(任一语言实现即可)
  • 使用客户端给出的域名进行访问观看

小米球ngrok

由个人开发者基于ngrok1.7版本源码进行搭建,官网:http://ngrok.ciqiuwl.cn/

  1. 前往控制台(https://manager.xiaomiqiu.com/)注册,获取token(免费)

2.登录后,在控制台首页下载windows版本的客户端,解压到你喜欢的目录

3.在控制台获取token

4.修改解压目录下的ngrok.conf配置文件,因为部分参数已经被占用

上述端口也可根据当前实际情况进行修改

5.在命令行下进入到ngrok客户端目录下

6.启动bat快捷程序,或执行如下命令

.执行命令

格式: ngrok.exe -config ngrok.conf -log=ngrok.log start 隧道名称

示例: ngrok.exe -config ngrok.conf -log=ngrok.log start httptun

.点击快捷程序bat启动

.成功的结果如下,如果失败了,请检查token是否正确,子域名是否够复杂

.失败的结果如下

7.启动服务器验证请求穿透结果是否生效

8.用法几乎跟ngrok国内版一样,说明国内版也是基于开源程序编写后提供的服务


钉钉穿透(简单)

官方文档地址 (opens new window)Github下载地址(opens new window)

准备好的下载地址

  • 链接:https://pan.baidu.com/s/1KbQG-omGNzsZMb3g7aKdTg
  • 提取码:nsnh

#Windows使用

我存放在D:\tifang\code\tfserver\pierced\目录下

  • 打开CMD命令行,进入到当前目录,输入如下参数

— 详细命令

C:\Users\nobug>D:

D:\>cd D:\tifang\code\tfserver\pierced\

D:\tifang\code\tfserver\pierced>cd windows_64

D:\tifang\code\tfserver\pierced\windows_64>ding.exe -config=./ding.cfg -subdomain=abcdefg 9085

执行后的结果

开启本地9085端口服务,然后在浏览器访问接口

尝试访问穿透域名


花生壳(个性化)

  1. 打开花生壳官网 (opens new window),下载花生壳客户端并安装
  2. 注册花生壳账号并登陆
  3. 根据帮助视频花生壳官方帮助手册 (opens new window)进行配置使用
  4. 花生壳遭人诟病的地方是,使用复杂,偶尔抽风,网速慢

NATAPP(一般般)

  1. 打开NATAPP官网,下载对应的客户端到本地
  2. 注册natapp账号登陆
  3. 购买免费隧道并配置,获取token
  4. 在本地使用cmd命令行的方式启动exe文件,并指定token
natapp.exe -authtoken=c92c66463fa9fc69

浏览器访问

官方文档地址:https://natapp.cn/article/natapp_newbie
------------------------------------------------------------------

内网穿透原理


FRP自建(最强,企业首选)

#基础使用

自建frp需要部署服务端与客户端,服务端类似于跟花生壳服务端,ngrok服务端一样,暴露出通信端口,客户端连接后进行通信

  • 服务端需要有公网ip,最合适的机器为云服务(阿里云/腾讯云)
  • 客户端本地的Linux虚拟机或者其他物理机

1.分别在服务端与客户端下载frp源码

$ wget https://github.com/fatedier/frp/releases/download/v0.33.0/frp_0.33.0_linux_amd64.tar.gz

$ tar xzvf frp_0.33.0_linux_amd64.tar.gz
$ mv frp_0.33.0_linux_amd64 frp

2.服务端删除掉客户端相关配置

$ rm -f frpc frpc.ini frpc_full.ini

3.客户端删除掉服务端的相关配置

$ rm -f frps frps.ini frps_full.ini

4.查看客户端与服务端的默认配置项

服务端配置如下
[common]
bind_port = 7000

客户端配置如下
[common]
server_addr = 127.0.0.1
server_port = 7000

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000

5.配置最简单的frps

$ vim frps.ini

[common]
bind_port = 7000 # 表示监听7000端口作为客户端对话的入口

开启云服务器7000端口的防火墙,使外界能够通过7000端口连接到内网服务

我的客户端ip属于101.81.125.0端口范围内,所以客户端通过7000端口能够连接上这台服务器

6.启动服务端

$ nohup ./frps -c frps.ini &

7.客户端配置如下

$ vim frpc.ini

[common]
server_addr = 云服务器公网ip
server_port = 7000

8.启动客户端

$ nohup ./frpc -c frpc.ini &

仪表盘使用
1.服务端配置

[common]
服务端连接客户端的端口
bind_port = 7000
服务端仪表板面板的端口
dashboard_port = 7500
仪表板页面登录的用户名
dashboard_user = admin
仪表板页面登录的密码
dashboard_pwd = admin

2.客户端配置

[common]
server_addr = 云服务器公网ip
server_port = 7000

3.配置7500端口的访问安全组

4.打开网页浏览frp仪表盘,在浏览器访问:http://服务器公网ip:7500端口,输入用户名和密码进行登录


WEB穿透

  1. 服务端配置

[common]
bind_addr = 0.0.0.0
bind_port = 7000
privilege_token = tokenABC
vhost_http_port = 80 #HTTP主机使用的端口,我这里80端口被Nginx占用了
vhost_https_port = 443 #HTTPS主机使用的端口

vhost_http_port = 80 和 vhost_https_port = 443 为将服务器的80端口做http,443端口做https,原理就像nginx一样,可以多个网站使用这两个端口。

vhost_http_port和vhost_https_port一般使用80和443,但这2个端口很容易被nginx占用,我这里就是被Nginx占用了,换成了808,,或者利用nginx的反向代理实现frp服务端与nginx共用80端口

2.客户端配置

[common]
server_addr = 云服务器的ip
server_port = 7000
privilege_token = tokenABC

[webtest]
type = http
local_ip = 127.0.0.1
local_port = 80
custom_domains = webtest.it235.com

3.阿里云需要开放7000端口给客户端访问

4.服务端的80端口不能被占用,占用后如果想去除端口必须配合Nginx使用,由Nginx反向代理到808端口

5.本地需要使用Nginx进行域名接收反向代理

server {
listen 80;
server_name webtest.it235.com;

    location / {
        proxy_pass http://127.0.0.1:9080/;
    }
}

MySQL穿透

  1. 服务端配置

[common]
bind_port = 7000

2.客户端配置

[common] server_addr = 云服务器的ip

server_port = 7000

type = tcp

local_ip = 127.0.0.1

local_port = 3306

remote_port = 3366

3.外网连接MySQL时可以使用云服务器ip+3366端口进行连接