通过 Pingora 构建应用网关

上一篇文章介绍了 CloudFlare 开源的网络框架 Pingora, 此篇文章我们使用该框架从零到一实作一个应用网关. 目前大规模应用的网关主要分为三大类, 一类是以传统 C 语言开发的 Nginx 为基础并通过 Lua 进行扩展的网关, 诸如 OpenResty, Kong 等便是如此; 一类则在诞生之初便完全为云原生提供解决方案的代理, 诸如 Envoy, Linkerd2 和 Cilium (严格说来 Cilium 划分在网关代理类并不合适); 最后一类便是和应用深度绑定的应用网关, 如 Spring Cloud Gateway. 从今天的视角看 Spring Cloud 微服务的模式与云原生存在较大的竞合, 同时 微服务, 注册中心 等概念被 Kubernetes 的不同 Service 通过类 DNS 模式一一种优雅的方式解决, 这也导致了 Spring Cloud Gateway 模块在 Kubernetes 集群内尴尬的境地. 开发中经常面对一种场景是微服务部署到 Kubernetes 内本地无法调试的问题和多应用集群内应用间相互调用的问题. 我们这里通过 Pingora 构建的应用网关主要便是为解决此特定场景下请求转发与应用鉴权的工作, 同时在此基础上可做进一步扩展. 首先声明一个 Gateway 结构体作为网关的主体, 后续有需要时可通过扩展该结构体以绑定资源, 实现一些高级功能. #[derive(Debug, Default)] pub struct Gateway { } 在定义完 Gateway 后, 考虑到 TCP 连接特性我们再定义一个 Host 元组结构体以反映不同服务对应的 IP 和 Port:
更多 →

Pingora 初探

CloudFlare 在 2022 年中时曾发布过一篇博文 How we built Pingora, the proxy that connects Cloudflare to the Internet 介绍了其为了解决 Nginx 在实际应用场景下的诸多困境从头设计并使用 Rust 开发了一个名为 Pingora 的 代理, 并在文章中介绍将会开源该系统. 但后续针对 Pingora 便再无其他消息, 开源计划看起来也是遥遥无期, 个人也一直担心是否会像 Servo 一样胎死腹中. 但昨天 CloudFlare 在 Github 上开源了该系统相关代码 cloudflare/pingora, 同时也发布了一篇博文 Open sourcing Pingora: our Rust framework for building programmable network services 介绍了 Pingora 开发相关的工作. 在开发 Pingora 之初, 与所有其他公司一样 CloudFlare 也考虑过通过付费以便 Nginx 背后的公司可以为其进行定制化开发和迁移到其他诸如 Envoy 等第三方代理系统, 但经长期考虑最终还是选择自行构建一个全新的代理系统, 该系统设计目标主要是 快速, 高效 和 安全. 在不舍弃 高效 和 快速 的前提下追求尽可能 安全 的目标, CloudFlare 自然地选择了 Rust 语言开发 Pingora.
更多 →

Rust 之闭包 - Ⅰ

闭包 是在以函数作为一等公民等编程语言中实现词法绑定等一种技术, 闭包匿名函数 在一些语境下经常互为替换, 但严格来说 匿名函数 也即字面意义上等没有被赋予名称等函数, 而 闭包 实际上是函数的一个实例, 相对于常规函数, 闭包 可以捕捉环境上下文环境中的自由变量, 从一般定义来说即:

f(x) = g(x) + h(y)

这里函数 f(x) 可以表示为关于 xy 的函数, 而函数 f 中无 y 的信息(相对的是 f(x, y)), 即 y 是自由变量. 除了本文介绍的 Rust 外其他诸如 Swift, Go, Erlang, JavaScript, Python 等都有 闭包.

更多 →

DHCP 协议分析及实现 - Ⅱ

前一篇文章介绍了 DHCP 协议定义以及相关信令之间的流转, 本文主要通过 Rust 从头实现一个 DHCP 协议客户端.

环境准备

首先需要安装 Rust, 目前 Rust 官方主要提供 Rustup 这一工具管理 Rust 各版本. 如果是 Windows 可直接下载 Rustup-init.exe 运行即可, 如果是 LinuxmacOS 则可在 Shell 中运行一下命令快速安装:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

Rustup 在安装 Rust 同时也会同时安装 Cargo 这一构建和包管理工具, 相对于 C/C++ 而言极大地减轻依赖和构建管理的心智负担.

在安装完 RustCargo 后由于涉及到网络报文, 因此还建议安装 Wireshark(Linux 环境下使用 tcpdump 亦可)以便后续对报文进行分析.

IDE 可以选择 VS CodeJetBrains 新发布的 RustRover, 如果选择 VS Code 的话为了进行调试还需同时安装 CodeLLDB 插件.

更多 →

DHCP 协议分析及实现 - Ⅰ

背景

最近因工作需要接触了 H3CiNode 客户端, 参考其官网对 iNode 的描述:

iNode智能客户端是H3C公司自行设计开发的基于Windows的多业务接入客户端软件,提供802.1x、Portal、VPN等多种认证方式,可以与H3C以太网交换机、路由器、VPN网关等网络设备共同组网,实现对局域网、广域网、VPN、无线接入的用户认证,是对用户终端进行身份验证、安全状态评估以及安全策略实施的主体,可以按照企业接入安全策略的要求,实现基于角色/身份的权限和安全控制。

以此为发端, 本来主要讨论 DHCP 协议的设计与实现, 以期最后通过修改 DHCP 协议实现 私有DHCP 协议, 实现一定条件下限制网络访问的目的.

同时亦声明本文仅就技术上讨论一种私有协议实现的可能性, 只有如何实现以及是否可行并不在本文讨论范围内.

更多 →