如何安全的利用内网穿透技术巧妙解决开发中的难题

关于内网穿透

内网穿透可以简单的理解就是把本地服务暴露到外网。这里不讲太多,有兴趣可以进行网络搜索,或者查看我之前的两篇文章:

开发中的棘手问题

在开发过程中,我们总是一边调试,一边开发,难免会遇到一问题。比如:

  1. 开发H5页面的时候,我们希望能够随时通过手机查看页面效果。
  2. 我们于使用第三方服务时,通常是需要一个公网IP或者域名。

第一个问题还容易解决一些,要手机和开发机连接同一个局域网,但是在一些情况下,你的电脑IP会变,也是比较麻烦的。

对于第二个问题,比如,系统需要接微信支付,在整个支付系统中,微信是需要访问一个公网的备案域名。在接入这样的第三方系统时,开发过程通常是比较痛苦的,比如,需要频繁部署代码,打印日志,查看错误信息。整个过程下来,基本都在部署代码和查看日志了,非常麻烦。

内容穿透如何解决这些问题?

结合开源工具很容易解决这些问题,但是如果有定制化,就需要做些功课,总之,都不难。

下面是简单实用的一个方案:

  1. 我们需要一个公网服务器,公网服务器需要有一个公网IP,比如8.8.8.8。

  2. 我们通过DNS给公网服务绑定域名,比如:

  3. 服务器上配置 frp 服务端(一个开源软件,后续简单介绍):

    1. frps.toml
    ini 复制代码
    [common]
    bind_port = 7000
    vhost_http_port = 80 # 监听的服务器端口
    token = "12345678" # 类似于密码
    1. 启动 ./frps -c ./frps.toml
  4. 开发机配置 frp 客户端:

    1. frpc.toml
    ini 复制代码
    [common]
    server_addr = "你的公网服务器IP地址"
    server_port = 7000 # 与服务端的 bind_port 对应
    token = "12345678" # 与服务器的 token 对应
    
    [dev-serve]
    type = "http"
    local_ip = "127.0.0.1"
    local_port = 3000
    custom_domains = "dev-web.xxx.com"
    
    [dev-web]
    type = "http"
    local_ip = "127.0.0.1"
    local_port = 8000
    custom_domains = "dev-serve.xxx.com"
    1. 启动 ./frpc -c ./frpc.toml
  5. 开发机启动 3000 服务和 8000 服务。

上面的配置,逻辑也很简单:配置了DNS之后,用户就可以通过公网访问dev-web.xxx.com,经过dev-web.xxx.com的流量就会转发到你本地3000端口,3000端口的响应数据会沿着这条链路返回到用户那里。于是,你就可以在本地实时观察公网数据。

上面的配置过程是不是很简单?这么简单的方案,可以完美解决上面的棘手问题,特别是第一个,至少使对接效率成几十倍的提高。为什么?

还是以支付为例,需要调试的接口和数据都可以通过打断点来观察每一步发生了什么,实时的查看分析问题。比部署查看日志要提高太多太多。

关于 FRP

frp 是GitHub上一个开源项目。是一种快速反向代理,允许您将位于 NAT 或防火墙后面的本地服务器暴露给 Internet。目前支持TCPUDP ,以及HTTPHTTPS协议,可以将请求通过域名转发到内部服务。

这里,我们利用了它支持HTTP协议的功能。

部署 FRP 服务端

以 Ubuntu 为例,进行安装配置:

  1. 下载目前最新版本: frp_0.54.0_linux_amd64.tar.gz。下载适合自己服务器的包。

  2. 上传到 home 目录进行解压。

  3. cd 到 frp_0.54.0_linux_amd64 目录。

  4. 进行服务端配置,打开 frp_0.54.0_linux_amd64 下的 frps.toml,写入以下内容:

    ini 复制代码
    [common]
    bind_port = 7000 # 所有客户端需要绑定端口
    vhost_http_port = 80 # 监听的服务器端口
    token = "12345678" # 类似于密码
  5. 在当前目录下执行./frps -c ./frps.toml启动服务。

非常简单,使用上没有什么复杂的东西需要理解。

部署 FRP 客户端

以 Mac M系列芯片为例,进行安装配置:

  1. 下载目前最新版本:frp_0.54.0_darwin_arm64。下载适合自己客户端的包。

  2. 解压到合适目录。

  3. cd 到 frp_0.54.0_darwin_arm64 目录。

  4. 进行客户端配置,打开 frp_0.54.0_darwin_arm64 下的 frpc.toml,写入以下内容:

    ini 复制代码
    [common]
    server_addr = "你的公网服务器IP地址"
    server_port = 7000 # 与服务端的 bind_port 对应
    token = "12345678" # 与服务器的 token 对应
    
    [dev-serve]
    type = "http"
    local_ip = "127.0.0.1"
    local_port = 3000
    custom_domains = "dev-web.xxx.com"
    
    [dev-web]
    type = "http"
    local_ip = "127.0.0.1"
    local_port = 8000
    custom_domains = "dev-serve.xxx.com"
  5. 在当前目录下执行./frpc -c ./frpc.toml启动服务。

也是非常简单,使用上也是没有什么需要理解的,照葫芦画瓢就行。

总结

对于服务端和客户端主要区别这两个文件和这两个命令:

  1. 服务端:配置文件frps.toml,启动命令./frps -c ./frps.toml
  2. 客户端:配置文件frpc.toml,启动命令./frpc -c ./frpc.toml

很像,就是server和client的区别。

思考

其实这种基础东西对于一线开发者来说本不应该自己去折腾,但是目前很多公司没有配置这样的服务,一线开发者不得不寻找各种解决方案。

但是,这种基础的东西,也可以认为是开发中的一环,如果设计一个平台,集成各种工具,使开发和部署变得异常简单,不知道这种服务会不会有人买单。但是至少一个大公司,应该有团队去统一解决这些问题,这样可以极大的提高研发效率。

如果你们公司有这样的需求,而恰巧你服务于效能团队,可以思考下这些问题,希望提供一个思路。

相关推荐
VT.馒头12 分钟前
【力扣】2695. 包装数组
前端·javascript·算法·leetcode·职场和发展·typescript
css趣多多24 分钟前
一个UI内置组件el-scrollbar
前端·javascript·vue.js
源代码•宸36 分钟前
大厂技术岗面试之谈薪资
经验分享·后端·面试·职场和发展·golang·大厂·职级水平的薪资
island131442 分钟前
CANN ops-nn 算子库深度解析:神经网络计算引擎的底层架构、硬件映射与融合优化机制
人工智能·神经网络·架构
C澒44 分钟前
前端整洁架构(Clean Architecture)实战解析:从理论到 Todo 项目落地
前端·架构·系统架构·前端框架
roman_日积跬步-终至千里1 小时前
【架构实战-Spring】动态数据源切换方案
架构
C澒1 小时前
Remesh 框架详解:基于 CQRS 的前端领域驱动设计方案
前端·架构·前端框架·状态模式
Charlie_lll1 小时前
学习Three.js–雪花
前端·three.js
onebyte8bits1 小时前
前端国际化(i18n)体系设计与工程化落地
前端·国际化·i18n·工程化
晚霞的不甘1 小时前
CANN 编译器深度解析:UB、L1 与 Global Memory 的协同调度机制
java·后端·spring·架构·音视频