你是否被以下问题所困扰
我想装个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
使用步骤如下:
- 访问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/
- 前往控制台(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端口服务,然后在浏览器访问接口
尝试访问穿透域名
花生壳(个性化)
- 打开花生壳官网 (opens new window),下载花生壳客户端并安装
- 注册花生壳账号并登陆
- 根据帮助视频和花生壳官方帮助手册 (opens new window)进行配置使用
- 花生壳遭人诟病的地方是,使用复杂,偶尔抽风,网速慢
NATAPP(一般般)
- 打开NATAPP官网,下载对应的客户端到本地
- 注册natapp账号登陆
- 购买免费隧道并配置,获取token
- 在本地使用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 = 60005.配置最简单的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穿透
- 服务端配置
[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穿透
- 服务端配置
[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端口进行连接