# Reglas por IP y por país

> Permite o bloquea en el borde direcciones sueltas, rangos CIDR y países, para toda una zona o solo para algunos de sus nombres.

Las reglas por IP y por país son reglas de borde de tipo `ip` y `geo`. Se aplican en cualquier [modo del WAF](https://developers.openwaf.dev/es/waf/modes-and-levels/#modes), antes de los límites de peticiones y del WAF.

## Reglas por IP

| Campo | Valor |
|---|---|
| `ip` | Una dirección IPv4 o IPv6 (`203.0.113.7`, `2001:db8::1`) o un rango CIDR (`203.0.113.0/24`, `2001:db8::/32`). Se guarda en forma canónica. |
| `action` | `block`: responder 403. `allow`: saltarse las [listas de amenazas](https://developers.openwaf.dev/es/waf/threat-feeds/) y las reglas por país para esta dirección. |

Una regla `allow` **no** se salta los límites de peticiones, el WAF, los escudos ni el control de rastreadores IA. Evita reglas solapadas con acciones distintas para la misma dirección.

## Reglas por país

| Campo | Valor |
|---|---|
| `country_code` | Código ISO 3166-1 alfa-2, p. ej. `RU`. Se guarda en mayúsculas. |
| `action` | `block`: responder 403 a los visitantes de ese país. `allow`: no bloquear nunca ese país con una regla por país. |

Una regla por país solo actúa sobre el país que nombra: una regla `allow` no bloquea al resto de países. Para limitar un sitio a unos pocos países, añade reglas `block` para los que no quieras. Los visitantes cuyo país no se puede determinar nunca se bloquean con una regla por país.

## Añadir una regla

**Panel**

Dominio → **Seguridad → Firewall → Reglas**: **Reglas por IP → Añadir regla por IP** o **Países → Añadir regla por país**. Elige la **Acción** y, si quieres, los nombres en **Se aplica a** y una **Nota**.
**CLI**

```sh
openwaf-cloud ctl rules add example.com kind=ip ip=203.0.113.0/24 action=block note="Escáner" --reason "Bloquear la red del escáner"
openwaf-cloud ctl rules add example.com kind=geo country_code=KP action=block --reason "Sin clientes allí"
openwaf-cloud ctl rules add example.com kind=ip ip=198.51.100.10 action=allow hosts:='["admin.example.com"]' --reason "IP de la oficina"
openwaf-cloud ctl rules list example.com
openwaf-cloud ctl rules rm example.com 42 --reason "El escáner ya no está"
```
**API**

```sh
curl -sS -X POST "https://dash.openwaf.dev/v1/orgs/$ORG/zones/example.com/rules" \
  -H "Authorization: Bearer $OPENWAF_TOKEN" \
  -H "X-Change-Reason: Bloquear la red del escáner" \
  -H "Content-Type: application/json" \
  -d '{"kind": "ip", "ip": "203.0.113.0/24", "action": "block", "note": "Escáner"}'
```
Borra una regla con `DELETE /v1/orgs/{org}/zones/{zone}/rules/{rule}` y la misma cabecera `X-Change-Reason`.
**MCP**

`add_rule` con `{"zone": "example.com", "kind": "ip", "ip": "203.0.113.0/24", "action": "block", "reason": "…"}`; `list_rules` enseña los identificadores y `remove_rule` borra una. Las dos simulan primero.


Las peticiones bloqueadas aparecen en los [eventos de seguridad](https://developers.openwaf.dev/es/analytics/security-events/) como `IP Rule` o `Geo Block`.
