9个版本

新增 0.3.6 2024年8月9日
0.3.5 2024年7月14日
0.3.4 2024年6月2日
0.3.2 2024年5月4日
0.1.0 2023年12月24日

#201HTTP服务器

Download history 155/week @ 2024-04-29 17/week @ 2024-05-06 7/week @ 2024-05-20 192/week @ 2024-05-27 97/week @ 2024-06-03 15/week @ 2024-06-10 118/week @ 2024-07-08 21/week @ 2024-07-15 5/week @ 2024-07-29 93/week @ 2024-08-05

每月237次下载

MIT许可证

41KB
940

Firewall — LICENSE crates.io版本 文档

《Firewall》特质旨在供服务器使用,以抽象阻止传入请求的逻辑。

accept方法提供了一个IP地址(v4或v6),如果连接是TLS,则从SNI扩展获取服务器名称,以及从ALPN扩展获取客户端支持的协议。

使用ClientHello特质来使Firewall特质对TLS实现不可知。


对于只需要/想要这两个特质的服务器,应禁用默认功能。

Cargo.toml

[dependencies.firewall]
version = "0.1"
default-features = false

rustls功能为rustls提供了ClientHello特质的实现。

openssl功能为openssl提供了ClientHello特质的实现。


builder功能提供了Firewall特质的实现。

let firewall = Firewall::default()
    .require_sni()
    .allow_server_name("example.com")
    .allow_ip_range("1.2.3.4/30");

您可以有一个允许的IP范围列表和一个拒绝的IP范围列表(都包括ipv4和ipv6)。

您还可以根据TLS客户端Hello内容添加一个异常。

此功能的良好用例是您想使用 TLS-ALPN-01 挑战来续订 Let's Encrypt 证书。Let's Encrypt 不提供他们用来验证挑战的 IP 列表。如果 acme-tls/1 协议列在 TLS 的 ALPN 扩展 中,您可以添加一个例外来绕过允许列表。

struct AcmeTlsSni01Exception {}

impl TlsAccept for AcmeTlsSni01Exception {
    fn accept(&self, client_hello: impl ClientHello) -> AcceptDenyOverride {
        if client_hello.has_alpn(b"acme-tls/1") {
            AcceptDenyOverride::AcceptAndBypassAllowList
        } else if client_hello.has_alpn(b"http/1.1") {
            AcceptDenyOverride::Accept
        } else {
            AcceptDenyOverride::Deny
        }
    }
}

let firewall = firewall
    .with_exception(AcmeTlsSni01Exception {});

Cloudflare 功能向 Firewall 添加了一个方法,以应用 Cloudflare 服务器的官方允许列表。

let firewall = Firewall::default()
    .try_allow_cloudflare_ips()
    .await
    .unwrap();

如果您的服务器位于 Cloudflare CDN 后面,并且您不希望任何其他服务器直接联系您的源服务器,这将非常有用。

如果您想确保列表是最新的,则有一个公开的 fetch_cloudflare_ip_ranges() 函数可用。


github_webhook 功能向 Firewall 添加了一个方法,以应用 Github webhook 服务器的官方允许列表。

let firewall = Firewall::default()
    .try_allow_github_webhook_ips()
    .await
    .unwrap();

如果您想确保列表是最新的,则有一个公开的 fetch_github_webhook_ip_ranges() 函数可用。

依赖关系

~0–10MB
~109K SLoC