混合云网络连接利器:Pipy 点对点网络连接实战

随着多集群、多云、混合云的普遍采用,不同云之间网络如何打通,云端到内网如何访问,带来很多网络管理的挑战。本文介绍采用 Pipy 如何打通多云网络,实现多集群、多云、混合云、内外网的互通,不仅可以快速实现网络联通,同时避免了网络基础设施复杂的设置;搭配使用 Pipy 内置的安全和访问控制机制,可以有效的保障数据传输的安全性和必要的访问控制。

在 2022 年北美 Kubecon,Istio 团队提出了 sidecarless 的网络方案,其核心是使用基于 HTTP 的隧道 z-tunnel。Flomesh 团队基于灵活的 PipyJS 实现了同样的能力,并且该能力具备了多集群、多云、混合云的能力,进一步拓宽了 z-tunnel 模式的使用场景。

在之前的文章 用 Pipy 做个 HTTP 隧道 中,我们曾介绍过如何使用 Pipy 构建 HTTP 隧道以在孤立的网络中实现 TCP 协议的传输,让我们简单回顾一下当时的场景。

我们有两个设备需要基于 TCP 的私有协议进行通信,但防火墙仅允许 HTTP 通信,同时服务端监听内部 IP 及 8081 端口。

我们最终利用 TCP over HTTP 的方式,在两个网络间完成了两个设备的通信。

11efdd8f1df3ad6d95e605ad89db80b4.png

在实际的场景中,我们可能会遇到更多的挑战,例如:

  1. 1. 明文通信存在安全问题,缺乏有效的防护措施。

  2. 2. 在管控严格的网络中,不允许对外提供 HTTP 通信;或者每次开通都需要经历复杂且漫长的审批过程,而随意的开放网络,也给管控带来了压力。

现在我们试图解决上述挑战,首先将场景的难度提高一些。在局域网中有一台服务器(192.168.1.160)正在运行一个仅供内部访问的 web 站点,无法从外部访问;局域网内部可以正常访问互联网。现在,一台位于公有云的主机 20.187.107.151 需要访问局域网内的服务。

5b8c7bb1befa3e1b2519a243d6d08c73.png

之前的方案显然无法实现,因为公有云无法访问局域网。但既然局域网可以正常访问互联网,那么就可以由局域网向公有云发起连接,将该连接作为隧道进行通信,同时确保数据传输的安全。

方案

e60868df39b06b968ce57c2529476a00.png

以下以请求处理为例:

  1. 1. 局域网代理与公有云代理的 8443 端口建立 TCP 连接后,等待接收隧道创建的请求;

  2. 2. 公有云客户端(假设与公有云代理位于同一主机),使用 127.0.0.1:8080 访问公有云代理;

  3. 3. 公有云代理接收到客户端的请求后,通过第一步创建的连接发起创建隧道的请求,并提供要访问的目标服务地址 192.168.1.160:8080

  4. 4. 隧道创建成功后,局域网代理与目标服务建立连接;

  5. 5. 公有云代理将客户端的请求通过隧道传输至局域网代理;

  6. 6. 局域网代理将请求转发至目标服务;

这样便完成了请求的发送,局域网的服务处理完请求后,响应内容将会按照刚才建立的连接被发回客户端。

以上只是方案的简单说明,实际上还需要考虑更多的细节:

  1. 1. 隧道的数据传输要进行加密,采用 mTLS 方式;

  2. 2. 局域网的代理要对服务的访问进行严格管控,即只有指定的服务才能通过隧道访问;

  3. 3. 保障隧道的可用性,需要对隧道进行健康检查。这种检查是双向的,首先局域网代理检查隧道断开后,要进行重连;公有云上的代理,在检查隧道断开后可以使用其他的隧道进行数据传输,也就是说要有多条隧道保证整体服务的可用;

  4. 4. 实施对隧道的保护,如限速等。

以上提到的(并不仅限于这些)所有细节,都在我们的示例中一一进行了实现。你可以在 Pipy 的示例仓库[1] 的 pipy-reverse-tunnel 目录中找到所有代码。

├── external #公有云代理
│   └── tunnel
│       └── tls
├── internal #局域网代理
│   └── tunnel
│       └── tls
└── serve #局域网服务
    ├── secret
    └── www

测试

从仓库中拉取代码之后,你需要根据运行环境对配置进行调整。

  • • 在 pipy-reverse-tunnel/internal/config.json 中将 target 修改为云主机的公网地址

  • • 在 pipy-reverse-tunnel/internal/allow-list.json 中配置局域网服务的地址

  • • 在 pipy-reverse-tunnel/external/config.json 中,将 loadBalancers.xxxx.targets 中的地址改为局域网服务的地址

1. 运行局域网服务

在局域网主机上启动服务。

./pipy ./serve/main.js

检查服务是否正常。

curl -sI localhost:8080
HTTP/1.1 200 OK
content-type: text/html
content-length: 472
connection: keep-alive

2. 运行公有云代理

在公有云主机上启动代理。

./pipy ./external/main.js

代理启动后会立即进行健康检查,由于此时局域网代理并未运行,在日志中会看到检查失败的信息。

3. 运行局域网代理

./pipy ./internal/main.js

4. 验证

在公有云主机上,使用 127.0.0.1:8080 可以成功访问。

curl 127.0.0.1:8080
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Hello, People!</title>
  </head>
  <body>
    <h1>The Quick Brown Fox Jumps Over the Lazy Dog</h1>
    <h2>The Quick Brown Fox Jumps Over the Lazy Dog</h2>
    <h3>The Quick Brown Fox Jumps Over the Lazy Dog</h3>
    <h4>The Quick Brown Fox Jumps Over the Lazy Dog</h4>
    <h5>The Quick Brown Fox Jumps Over the Lazy Dog</h5>
    <h6>The Quick Brown Fox Jumps Over the Lazy Dog</h6>
  </body>
</html>
引用链接

[1] Pipy 的示例仓库: https://github.com/flomesh-io/pipy-demos

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值