diff options
| author | DanConwayDev <DanConwayDev@protonmail.com> | 2026-01-14 13:40:33 +0000 |
|---|---|---|
| committer | DanConwayDev <DanConwayDev@protonmail.com> | 2026-01-14 13:43:40 +0000 |
| commit | 5897e4bccd41f1a9ebb01a11280cea929c93d2c0 (patch) | |
| tree | cbe4d2447312b7bc7653bef874b6fb23d60a0ede /docs/reference | |
| parent | 4c8f1813fada9ce2bfd371095b0721bff68173e3 (diff) | |
| parent | 2821578202d1313c23c30a5dbae39548822e3c55 (diff) | |
Add defensive relay features with rate limiting and connection limits
Implement defensive measures to protect against DoS attacks:
- Add explicit rate limits (500 subscriptions, 60 events/min per connection)
- Add total connection limit (default: 500, configurable via NGIT_MAX_CONNECTIONS)
- Update configuration across all 4 locations (src, nix, docs, .env.example)
Per-IP rate limiting deferred until abuse is detected in production or
implemented in rust-nostr relay-builder to benefit the entire Nostr ecosystem.
Documentation added explaining the defensive features and rationale.
Detailed analysis of other relay implementations preserved in commit history.
Diffstat (limited to 'docs/reference')
| -rw-r--r-- | docs/reference/configuration.md | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/docs/reference/configuration.md b/docs/reference/configuration.md index 8b49297..c3001d3 100644 --- a/docs/reference/configuration.md +++ b/docs/reference/configuration.md | |||
| @@ -925,6 +925,46 @@ Event blacklist does **not** affect NIP-11 metadata: | |||
| 925 | 925 | ||
| 926 | --- | 926 | --- |
| 927 | 927 | ||
| 928 | ### Rate Limiting & DoS Protection | ||
| 929 | |||
| 930 | #### `NGIT_MAX_CONNECTIONS` | ||
| 931 | |||
| 932 | **Description:** Maximum total connections to the relay. Prevents connection exhaustion DoS attacks. | ||
| 933 | **Type:** Integer | ||
| 934 | **Default:** `500` | ||
| 935 | **Required:** No | ||
| 936 | |||
| 937 | **Examples:** | ||
| 938 | |||
| 939 | ```bash | ||
| 940 | # Default: 500 connections | ||
| 941 | NGIT_MAX_CONNECTIONS=500 | ||
| 942 | |||
| 943 | # Higher limit for large public relay | ||
| 944 | NGIT_MAX_CONNECTIONS=1000 | ||
| 945 | |||
| 946 | # Lower limit for private relay | ||
| 947 | NGIT_MAX_CONNECTIONS=100 | ||
| 948 | ``` | ||
| 949 | |||
| 950 | **Notes:** | ||
| 951 | |||
| 952 | - Limits total concurrent WebSocket connections to the relay | ||
| 953 | - Prevents connection exhaustion attacks | ||
| 954 | - Works in conjunction with per-connection limits (500 subscriptions, 60 events/min) | ||
| 955 | - When limit is reached, new connections are rejected | ||
| 956 | - Existing connections continue to work normally | ||
| 957 | |||
| 958 | **Related Limits:** | ||
| 959 | |||
| 960 | Per-connection limits (built-in to relay-builder, not configurable): | ||
| 961 | - Max subscriptions per connection: 500 | ||
| 962 | - Max events per minute per connection: 60 | ||
| 963 | - Max subscription ID length: 250 characters | ||
| 964 | - Max results per filter: 500 | ||
| 965 | |||
| 966 | --- | ||
| 967 | |||
| 928 | ### Logging Configuration | 968 | ### Logging Configuration |
| 929 | 969 | ||
| 930 | #### `RUST_LOG` | 970 | #### `RUST_LOG` |