0 - 前言
开篇之前,先抛出问题:什么是内网穿透?
内网很好理解,计算机不直接暴露在公网上,而是在局域网内,通过交换机,路由器等设备经过NAT和公网进行交互。
但是这个交互是单向的:只能是内网的计算机主动发起连接请求给公网上的资源,公网上的服务无法主动连接到内网的计算机。
那么,有没有什么方式,可以在公网上主动连接到内网的计算机呢?
有的,内网穿透技术。
内网穿透技术的本质就是:赋予内网资源一个公网IP,以提供资源。
1 - 原理和使用场景
内网穿透的原理是:利用一台具有公网IP的计算机作为服务端,内网需要穿透的计算机作为客户端,客户端主动连接到服务端,在传输层建立TCP/UDP连接,服务端作为跳板,将外部请求转发到内网客户端上,从而实现内网穿透。
内网穿透作为工作中的一大利器,可以帮助我们解决很多场景,非常实用。
相信以下这些场景,很多小伙伴都或多或少遇到过:
- 当放假在家的时候,被通知有一个线上bug急需立刻处理,但是家里没有开发环境和代码,只能立刻赶回单位
- 想搭建自己的博客系统或者个人网站甚至网络云盘之类的,家里的电脑配置好性能强,但苦于没有公网IP,外部访问不了,也只能闲置着(云主机便宜的性能不好,性能好的又不便宜)
- 家里台式机显卡超强,平时上班的时候,想利用家里的电脑训练个模型,但是连接不上
- 工程开发在不同阶段,代码会跑在不同的环境上:开发,测试,预生产和生产环境,如果四套环境都在公有云上,会是一笔不小的开销;如果开发、测试环境在内网搭建,遇到了跨地域的团队,又无法连通
- 等等
这些痛点场景,用内网穿透技术就可以统统搞定。
2 - 工具对比
下面介绍5种常用的内网穿透工具:
工具名称 | 支持API | 收费模式 | 采用语言 | Github stars | Github Last Commit | Github Issue | Last Release At |
---|---|---|---|---|---|---|---|
ngrok | 支持 | 按客户端数量收费 | go | 21.3k | 6 years ago | 333 | 2015.08.15 |
lanproxy | 不支持 | 免费 | java | 4.8k | 6 months ago | 120 | 2018.01.28 |
goproxy | 支持 | api版本收费 | go | 11.6k | Last months ago | 68 | 2022.01.31 |
frp | 不支持 | 免费 | go | 53.1k | 12 days ago | 95 | 2022.01.26 |
nps | 支持 | 免费 | go | 20.1k | 4 months ago | 250 | 2021.04.08 |
ngrok属于内网穿透的鼻祖,现在好多内网穿透平台都是基于ngrok做二次开发的,如natapp。Ngrok比较老旧了,最新一次的版本更新也在7年前,不适合。
lanproxy基于java开发,性能上比不过go,且最近一次的版本更新在4年前,属于不活跃维护状态,不合适。
goproxy支持API二次开发,社区活跃度也高,但是很多功能是是收费版本才具有的,不合适。
剩下frp和nps,社区活跃度都挺不错的,但是从star数和版本更新频率上,frp更甚一筹;而nps支持API二次开发和多租户功能(每个客户端一个单独的key)。所以,如果只是希望简单上手使用,没有二次开发或者多租户要求,可以选择frp,反之,选择nps。
考虑到实际情况,我们选择更加简单容易上手的frp来作为内网穿透的技术栈。
3 - 实战demo
先看两张图,快速理解下frp的系统架构和内网穿透原理。
从上面这张图可以看到,frp架构分为 frps 和 frpc,即服务端和客户端:
- 服务端部署在具有公网IP的主机上,将外部请求转发到客户端机器上
- 客户端部署在内网没有公网IP的主机上,承接来自服务端的请求,路由给对应的本地服务
具体流程如下图所示:
\0. frps启动,打开端口开始监听来自frpc的连接请求
- frpc启动,将自身注册到frps上
- 外部流量请求到frps
- frps通知frpc有新请求,需要frpc主动来建立连接
- frpc收到frps的通知,主动与frps建立连接
- frps在与frpc建立连接后,将外部流量转发给frpc
- frpc将流量转发给真正的内容服务
安装 frp:
到 Releases · fatedier/frp 下载最新版 frp,这里以
frp_0.39.0_freebsd_amd64.tar.gz 为例
# 下载地址
https://github.com/fatedier/frp/releases
解压得到
其中,frpc 和 frps 是二进制可执行文件,分别放到内网主机和外网主机上运行。frpc.ini 和 frps.ini 分别是客户端和服务端的最小化配置文件(全量配置文件 frpc_full.ini 和 frps_full.ini)。
frps.ini
[common]
bind_port = 7000 #服务端在外网主机上监听的端口号
frpc.ini
[common]
server_addr = 123.123.123.123 # 外网主机的公网IP地址
server_port = 7000 # 服务端在外网主机上监听的端口号
[ssh]# ssh连接:通过外网主机的6000端口,访问内网主机的22端口,进行ssh连接
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
启动客户端和服务端成功后,
在任何地方,通过 ssh 连接内网主机:
ssh -p 6000 root@123.123.123.123
评论区