目 录CONTENT

文章目录

内网穿透用得好,咖啡奶茶少不了

ZOUNAN
2022-02-10 / 0 评论 / 0 点赞 / 770 阅读 / 2,133 字
温馨提示:
本文最后更新于 2022-03-05,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

0 - 前言

开篇之前,先抛出问题:什么是内网穿透?

内网很好理解,计算机不直接暴露在公网上,而是在局域网内,通过交换机,路由器等设备经过NAT和公网进行交互。

但是这个交互是单向的:只能是内网的计算机主动发起连接请求给公网上的资源,公网上的服务无法主动连接到内网的计算机。

那么,有没有什么方式,可以在公网上主动连接到内网的计算机呢?

有的,内网穿透技术。

内网穿透技术的本质就是:赋予内网资源一个公网IP,以提供资源。

1 - 原理和使用场景

内网穿透的原理是:利用一台具有公网IP的计算机作为服务端,内网需要穿透的计算机作为客户端,客户端主动连接到服务端,在传输层建立TCP/UDP连接,服务端作为跳板,将外部请求转发到内网客户端上,从而实现内网穿透。

内网穿透用得好,咖啡奶茶少不了

内网穿透作为工作中的一大利器,可以帮助我们解决很多场景,非常实用。

相信以下这些场景,很多小伙伴都或多或少遇到过:

  1. 当放假在家的时候,被通知有一个线上bug急需立刻处理,但是家里没有开发环境和代码,只能立刻赶回单位
  2. 想搭建自己的博客系统或者个人网站甚至网络云盘之类的,家里的电脑配置好性能强,但苦于没有公网IP,外部访问不了,也只能闲置着(云主机便宜的性能不好,性能好的又不便宜)
  3. 家里台式机显卡超强,平时上班的时候,想利用家里的电脑训练个模型,但是连接不上
  4. 工程开发在不同阶段,代码会跑在不同的环境上:开发,测试,预生产和生产环境,如果四套环境都在公有云上,会是一笔不小的开销;如果开发、测试环境在内网搭建,遇到了跨地域的团队,又无法连通
  5. 等等

这些痛点场景,用内网穿透技术就可以统统搞定。

2 - 工具对比

下面介绍5种常用的内网穿透工具:

工具名称支持API收费模式采用语言Github starsGithub Last CommitGithub IssueLast Release At
ngrok支持按客户端数量收费go21.3k6 years ago3332015.08.15
lanproxy不支持免费java4.8k6 months ago1202018.01.28
goproxy支持api版本收费go11.6kLast months ago682022.01.31
frp不支持免费go53.1k12 days ago952022.01.26
nps支持免费go20.1k4 months ago2502021.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的连接请求

  1. frpc启动,将自身注册到frps上
  2. 外部流量请求到frps
  3. frps通知frpc有新请求,需要frpc主动来建立连接
  4. frpc收到frps的通知,主动与frps建立连接
  5. frps在与frpc建立连接后,将外部流量转发给frpc
  6. 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 
0

评论区