# 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`, and `HopByHop` validation 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 `moka` cache for fast lookup of validation results and `axum` for 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 `Forwarded` header alongside legacy `X-Forwarded-For` headers.

## 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`):

```rust
// Initialize trusted proxies system
rustfs_trusted_proxies::init();
```

### As a Middleware

Integrate the trusted proxy validation into your Axum application or HTTP service stack:

```rust
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.

```bash
RUSTFS_TRUSTED_PROXY_IMPLEMENTATION=simple
```

### Legacy mode

The original implementation is still available:

```rust
rustfs_trusted_proxies::legacy_init();
let layer = rustfs_trusted_proxies::LegacyTrustedProxyLayer::enabled(config, None);
```

Or switch the global default path:

```bash
RUSTFS_TRUSTED_PROXY_IMPLEMENTATION=legacy
```

### Accessing Client Info

Retrieve the verified client information in your handlers or other middleware:

```rust
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:

```bash
make pre-commit
```

### Testing

Run the test suite:

```bash
cargo test --workspace --exclude e2e_test
```

## License

Licensed under the Apache License, Version 2.0.
