* chore(deps): remove redundant dependency features Remove manifest feature entries that are implied by other requested features in the same dependency declaration. Verified that the resolved Cargo feature graph is unchanged after the cleanup. Co-Authored-By: heihutu <heihutu@gmail.com> * chore(deps): narrow tokio and reqwest features Co-Authored-By: heihutu <heihutu@gmail.com> --------- Co-authored-by: heihutu <heihutu@gmail.com>
RustFS Trusted Proxies
The rustfs-trusted-proxies module provides secure and efficient management of trusted proxy servers within the RustFS
ecosystem. It is designed to handle multi-layer proxy architectures, ensuring accurate client IP identification while
maintaining a zero-trust security model.
Modes
- Simple default: only trusts forwarding headers when the direct peer IP is internal.
- Legacy full mode: keeps the original proxy-chain validation, available
via
legacy_*helpers.
Features
- Multi-Layer Proxy Validation: Supports
Strict,Lenient, andHopByHopvalidation modes to accurately identify the real client IP address. - Zero-Trust Security: Verifies every hop in the proxy chain against a configurable list of trusted networks.
- Cloud Integration: Automatic discovery of trusted IP ranges for major cloud providers including AWS, Azure, and GCP.
- High Performance: Utilizes the
mokacache for fast lookup of validation results andaxumfor a high-performance web interface. - Observability: Built-in support for Prometheus metrics and structured JSON logging via
tracing. - RFC 7239 Support: Full support for the modern
Forwardedheader alongside legacyX-Forwarded-Forheaders.
Configuration
The module is configured primarily through environment variables:
| Variable | Default | Description |
|---|---|---|
RUSTFS_TRUSTED_PROXY_ENABLED |
true |
Enable the trusted proxy middleware |
RUSTFS_TRUSTED_PROXY_IMPLEMENTATION |
simple |
Select simple or legacy implementation |
RUSTFS_TRUSTED_PROXY_VALIDATION_MODE |
hop_by_hop |
Validation strategy (strict, lenient, hop_by_hop) |
RUSTFS_TRUSTED_PROXY_NETWORKS |
127.0.0.1,::1 |
Comma-separated list of trusted CIDR ranges (loopback-only by default) |
RUSTFS_TRUSTED_PROXY_MAX_HOPS |
10 |
Maximum allowed proxy hops |
RUSTFS_TRUSTED_PROXY_CACHE_CAPACITY |
10000 |
Max entries in the validation cache |
RUSTFS_TRUSTED_PROXY_METRICS_ENABLED |
true |
Enable Prometheus metrics collection |
RUSTFS_TRUSTED_PROXY_CLOUD_METADATA_ENABLED |
false |
Enable auto-discovery of cloud IP ranges |
Usage
Initialization
Initialize the global trusted proxy system at the start of your application (e.g., in main.rs):
// Initialize trusted proxies system
rustfs_trusted_proxies::init();
As a Middleware
Integrate the trusted proxy validation into your Axum application or HTTP service stack:
use rustfs_trusted_proxies;
let app = Router::new()
.route("/", get(handler))
// Add the trusted proxy layer if enabled
.option_layer(if rustfs_trusted_proxies::is_enabled() {
Some(rustfs_trusted_proxies::layer().clone())
} else {
None
});
Simple default mode
The default mode only trusts forwarding headers from internal IPs.
RUSTFS_TRUSTED_PROXY_IMPLEMENTATION=simple
Legacy mode
The original implementation is still available:
rustfs_trusted_proxies::legacy_init();
let layer = rustfs_trusted_proxies::LegacyTrustedProxyLayer::enabled(config, None);
Or switch the global default path:
RUSTFS_TRUSTED_PROXY_IMPLEMENTATION=legacy
Accessing Client Info
Retrieve the verified client information in your handlers or other middleware:
use rustfs_trusted_proxies::ClientInfo;
async fn handler(req: Request) -> impl IntoResponse {
if let Some(client_info) = req.extensions().get::<ClientInfo>() {
println!("Real Client IP: {}", client_info.real_ip);
println!("Is Trusted: {}", client_info.is_from_trusted_proxy);
}
}
Development
Pre-Commit Checklist
Before committing, ensure all checks pass:
make pre-commit
Testing
Run the test suite:
cargo test --workspace --exclude e2e_test
License
Licensed under the Apache License, Version 2.0.