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日 |
#201 在 HTTP服务器
每月237次下载
41KB
940 行
Firewall —

《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