mirror of
https://github.com/netbirdio/docs.git
synced 2026-10-08 14:49:04 +02:00
Improve CrowdSec hardening and reverse proxy troubleshooting (#917)
* Improve CrowdSec setup, recovery, monitoring, and access-log documentation * Refine CrowdSec dashboard recovery and access-log field documentation * Image and API ref update * Api ref fix * Probe both api/.env
This commit is contained in:
@@ -9,10 +9,10 @@ NetBird logs every request and connection that passes through your reverse proxy
|
||||
|
||||
## Viewing access logs
|
||||
|
||||
Access logs are available in the NetBird dashboard under **Activity** > **Proxy Events**. This view displays a table of all HTTP requests and L4 connections that have passed through your reverse proxy services, with filters to narrow down results by time range, status, or other fields.
|
||||
Access logs are available in the NetBird dashboard under **Reverse Proxy** > **Access Logs**. This view displays a table of all HTTP requests and L4 connections that have passed through your reverse proxy services, with filters to narrow down results by time range, status, or other fields.
|
||||
|
||||
<p>
|
||||
<img src="/docs-static/img/manage/reverse-proxy/access-logs/access-logs-table.png" alt="Proxy Events table showing reverse proxy access log entries" className="imagewrapper"/>
|
||||
<img src="/docs-static/img/manage/reverse-proxy/access-logs/proxy-events-table.png" alt="Proxy Events table showing reverse proxy access log entries" className="imagewrapper"/>
|
||||
</p>
|
||||
|
||||
You can also retrieve access logs programmatically using the API:
|
||||
@@ -37,9 +37,9 @@ Every log entry (HTTP and L4) shares a common set of fields. Some fields are onl
|
||||
| **Bytes Downloaded** | Bytes sent from backend to client | Yes | Yes |
|
||||
| **Source IP** | The client's IP address | Yes | Yes |
|
||||
| **Location** | Country, city, and subdivision based on source IP geolocation | Yes | Yes |
|
||||
| **Auth Method** | Authentication method used (SSO, password, PIN, header, or none) | Yes | N/A |
|
||||
| **User** | The authenticated user's ID (if SSO was used) | Yes | N/A |
|
||||
| **Reason** | Reason for denial, if applicable | Yes | Yes |
|
||||
| **Auth Method** | Raw `auth_method_used` value: `oidc` (shown as SSO in the dashboard), `password`, `pin`, or `header`. For denied requests, carries the restriction code instead (e.g. `ip_restricted`, `crowdsec_ban`). Omitted from the API response when empty | Yes | Restriction code on denials |
|
||||
| **User** | The authenticated user's ID, set when `oidc` authentication was used. Omitted from the API response when empty | Yes | N/A |
|
||||
| **Reason** | Exactly one of two values: `Authentication failed` when authentication or an access restriction rejected the request, or `Request failed` when an authenticated request returned `4xx`/`5xx`. Set for HTTP entries only and omitted from the API response when empty. Never a specific denial code: see the note under [Deny reasons](#deny-reasons) | Yes | Omitted |
|
||||
|
||||
## Understanding log entries
|
||||
|
||||
@@ -48,18 +48,18 @@ Every log entry (HTTP and L4) shares a common set of fields. Some fields are onl
|
||||
HTTP log entries fall into three categories based on the status code:
|
||||
|
||||
- **Allowed requests**: successful requests show a `2xx` status code along with the authentication method used to access the service.
|
||||
- **Denied requests**: failed authentication or access restriction blocks show `401` or `403` status codes with a reason explaining why the request was denied (e.g., invalid password, missing SSO session, IP restricted, country restricted).
|
||||
- **Denied requests**: failed authentication or access restriction blocks show `401` or `403` status codes with `reason` set to `Authentication failed`. The specific cause (invalid password, missing SSO session, IP restricted, country restricted, CrowdSec verdict) is carried in `auth_method_used`, not in `reason`.
|
||||
- **Errors**: backend errors or proxy issues show `5xx` status codes. These typically indicate that the target service is unreachable or returned an error.
|
||||
|
||||
### L4 log entries
|
||||
|
||||
L4 entries are logged when the connection closes and record the total bytes transferred in each direction and the connection duration. L4 entries do not have HTTP status codes.
|
||||
|
||||
Denied L4 connections (blocked by access restrictions) are logged immediately with a deny reason. Since L4 services do not support authentication, denials come from access restrictions only.
|
||||
Denied L4 connections (blocked by access restrictions) are logged immediately. L4 entries carry no `reason` value, so the restriction code identifies the denial. Since L4 services do not support authentication, denials come from access restrictions only.
|
||||
|
||||
### Deny reasons
|
||||
|
||||
The following deny reasons can appear for both HTTP and L4 services:
|
||||
The following deny reasons identify why a connection was rejected. Note that for HTTP services these values are not carried in the entry's `reason` field: see the note below the table.
|
||||
|
||||
| Reason | Description |
|
||||
|--------|-------------|
|
||||
@@ -73,7 +73,28 @@ The following deny reasons can appear for both HTTP and L4 services:
|
||||
|
||||
All CrowdSec decision types (ban, captcha, throttle) result in a connection denial in enforce mode. The proxy does not serve captcha challenges or apply rate limiting: the decision type is recorded for informational purposes only.
|
||||
|
||||
When CrowdSec is in **observe** mode, the verdict appears in the log metadata but the deny reason field is empty (the connection is allowed). In the dashboard, these entries render with an observe-mode badge on the reason cell and show the underlying decision type (ban, captcha, throttle, unavailable) on hover. This lets you audit what CrowdSec would block without affecting traffic. For a self-test workflow, see [Testing the integration](/selfhosted/maintenance/crowdsec#testing-the-integration).
|
||||
<Note>
|
||||
For HTTP services, the deny code from the table above is recorded in the `auth_method_used` field, and the entry's `reason` field carries a synthesized generic value rather than the specific code. This applies to every access restriction, not only CrowdSec:
|
||||
|
||||
```json
|
||||
{ "status_code": 403, "reason": "Authentication failed", "auth_method_used": "ip_restricted" }
|
||||
```
|
||||
|
||||
```json
|
||||
{
|
||||
"status_code": 403,
|
||||
"reason": "Authentication failed",
|
||||
"auth_method_used": "crowdsec_ban",
|
||||
"metadata": { "crowdsec_verdict": "crowdsec_ban" }
|
||||
}
|
||||
```
|
||||
|
||||
When reading entries through `GET /api/events/proxy`, match on `auth_method_used` (and `metadata.crowdsec_verdict` for CrowdSec specifically) rather than `reason`.
|
||||
|
||||
Observe-mode entries carry the normal status code and record both `crowdsec_mode` and `crowdsec_verdict` in `metadata`. Because the connection is allowed, CrowdSec itself contributes no `reason`, but the field can still be populated by a later stage of the request such as an authentication or backend failure. Treat `metadata.crowdsec_mode` as the signal that an entry is an observe-mode verdict, not the absence of `reason`.
|
||||
</Note>
|
||||
|
||||
When CrowdSec is in **observe** mode, the verdict appears in the log metadata and CrowdSec adds no deny reason of its own (the connection is allowed). In the dashboard, these entries render with an observe-mode badge on the reason cell and show the underlying decision type (ban, captcha, throttle, unavailable) on hover. This lets you audit what CrowdSec would block without affecting traffic. For a self-test workflow, see [Testing the integration](/selfhosted/maintenance/crowdsec#testing-the-integration).
|
||||
|
||||
## Use cases
|
||||
|
||||
|
||||
Reference in New Issue
Block a user