# Configuración de ACL

(Pagina 28 del manual)

Una **ACL (Access Control List)** es un conjunto ordenado de reglas que el router evalúa una a una para decidir si **permite o deniega** el paso de un paquete. Actúa como un guardia de seguridad en la entrada o salida de una interfaz, filtrando el tráfico según los criterios que definas.

Las ACL funcionan a través de un router que lee todas las reglas **en orden secuencial** y aplica la **primera que coincide**, ignorando el resto. Al final de toda ACL existe un `deny any` implícito que **nunca aparece en pantalla pero siempre está activo** — si ninguna regla coincide, el paquete se descarta.

```
Paquete llega → ¿Coincide regla 1? → No → ¿Coincide regla 2? → No → ... → DENY implícito (descartado)
                                     ↓ Sí                          ↓ Sí
                                permit/deny                    permit/deny
```

> ⚠️ **Error más común:** crear solo reglas `deny` y olvidar el `permit any` final. Resultado: todo el tráfico bloqueado.

<details>

<summary>¿Qué relación tienen las ACL con las reglas de iptables?</summary>

Te puede sonar que las ACL de Cisco e iptables de Linux comparten el **mismo propósito y filosofía** — filtrar tráfico con reglas ordenadas — pero difieren significativamente en arquitectura, capacidades y sintaxis.

Ambas tiene en común que comparten tres principios fundamentales:

* Las reglas se evalúan **en orden secuencial**, aplicando la primera que coincide
* Existe un **deny/DROP implícito** al final si ninguna regla coincide
* Filtran por IP origen, IP destino, protocolo y puerto

Sin embargo, tienen algunas diferencias clave:

<table><thead><tr><th width="185.333251953125">Aspecto</th><th>ACL Cisco</th><th>iptables Linux</th></tr></thead><tbody><tr><td><strong>Dónde vive</strong></td><td>Router/Switch Cisco (hardware dedicado)</td><td>Kernel Linux en cualquier máquina </td></tr><tr><td><strong>Stateful / Stateless</strong></td><td><strong>Stateless</strong> — evalúa cada paquete independientemente </td><td><strong>Stateful</strong> — puede rastrear el estado de la conexión (<code>ESTABLISHED</code>, <code>NEW</code>, <code>RELATED</code>) </td></tr><tr><td><strong>Organización</strong></td><td>ACLs numeradas o nombradas aplicadas a interfaces</td><td>Tablas (<code>filter</code>, <code>nat</code>, <code>mangle</code>) con cadenas (<code>INPUT</code>, <code>OUTPUT</code>, <code>FORWARD</code>) </td></tr><tr><td><strong>NAT integrado</strong></td><td>NAT es un comando separado (<code>ip nat</code>)</td><td>iptables gestiona NAT directamente con la tabla <code>nat</code> </td></tr><tr><td><strong>Aplicación</strong></td><td><code>in</code> / <code>out</code> en una interfaz específica</td><td>Cadenas <code>INPUT</code> (paquetes al propio equipo), <code>OUTPUT</code> (paquetes generados), <code>FORWARD</code> (paquetes enrutados) </td></tr><tr><td><strong>Acción al denegar</strong></td><td><code>deny</code> (descarta silenciosamente)</td><td><code>DROP</code> (descarta) o <code>REJECT</code> (descarta y notifica al origen)</td></tr></tbody></table>

### La gran ventaja de iptables: stateful inspection <a href="#la-gran-ventaja-de-iptables-stateful-inspection" id="la-gran-ventaja-de-iptables-stateful-inspection"></a>

Esta es la diferencia más importante a nivel técnico. En Cisco ACL, para permitir el tráfico de vuelta de una conexión TCP debes escribir reglas explícitas en ambas direcciones, o usar la keyword `established`.&#x20;

En iptables basta con una sola regla usando el módulo de estado:

```bash
# iptables — permite conexiones ya establecidas sin reglas adicionales
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -j DROP
```

En Cisco ACL equivalente necesitarías:

```
! Cisco — hay que permitir explícitamente el tráfico de retorno
access-list 100 permit tcp any host 10.1.1.10 eq 80
access-list 100 permit tcp host 10.1.1.10 eq 80 any established
```

### Entonces, ¿Cuándo usar cada uno? <a href="#cundo-usar-cada-uno" id="cundo-usar-cada-uno"></a>

* **ACL Cisco** → cuando gestionas routers/switches Cisco en entornos corporativos; filtrado rápido a nivel de interfaz de red
* **iptables** → cuando el "router" es un servidor Linux (muy común en entornos cloud, VMs, Docker, firewalls software como pfSense o iptables puro).
* En redes empresariales modernas ambos coexisten: el router Cisco hace el filtrado perimetral con ACL y los servidores Linux internos se protegen individualmente con iptables

</details>

<figure><img src="https://539580950-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiKvwltOme7zTxep3LVyW%2Fuploads%2F49BnJuvrC6SCQvJrxiUr%2Fimage.png?alt=media&#x26;token=033d80f1-933b-4fe1-9bbc-7612a218a11b" alt=""><figcaption></figcaption></figure>

{% tabs %}
{% tab title="La Wildcard Mask" %}
Antes de ver los tipos de ACL, hay que dominar la **wildcard mask**, que es la inversa de la subnet mask:

<table><thead><tr><th width="208.11114501953125">Subnet Mask</th><th width="173.888916015625">Wildcard Mask</th><th>Significado</th></tr></thead><tbody><tr><td><code>255.255.255.255</code></td><td><code>0.0.0.0</code></td><td>Solo ese host exacto → usar <code>host</code></td></tr><tr><td><code>255.255.255.0</code></td><td><code>0.0.0.255</code></td><td>Toda la red <code>/24</code></td></tr><tr><td><code>255.255.0.0</code></td><td><code>0.0.255.255</code></td><td>Toda la red <code>/16</code></td></tr><tr><td><code>0.0.0.0</code></td><td><code>255.255.255.255</code></td><td>Cualquier IP → usar <code>any</code></td></tr></tbody></table>

El bit `0` en la wildcard = **debe coincidir**.&#x20;

El bit `1` = **no importa**.
{% endtab %}
{% endtabs %}

### Tipos de ACL <a href="#tipos-de-acl" id="tipos-de-acl"></a>

#### ACL Estándar (1–99 y 1300–1999) <a href="#acl-estndar-199-y-13001999" id="acl-estndar-199-y-13001999"></a>

Filtra **únicamente por IP de origen**. Es simple pero poco flexible. Se debe colocar **cerca del destino** porque al no poder especificar destino, aplicarla cerca del origen podría bloquear tráfico legítimo hacia otras redes.

<figure><img src="https://539580950-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiKvwltOme7zTxep3LVyW%2Fuploads%2FRlR2Y5iywhcbhbqik8pN%2Fimage.png?alt=media&#x26;token=ed83fee2-dbb3-483a-8fac-76d11e9a58f0" alt=""><figcaption></figcaption></figure>

**Sintaxis:**

```
R1(config)# access-list [1-99] {permit|deny} [ip-origen] [wildcard]
R1(config)# interface GigabitEthernet0/0
R1(config-if)# ip access-group [número] {in|out}
```

**Ejemplo — Bloquear toda la red 10.2.0.0/24 y permitir el resto:**

```
R1(config)# access-list 1 deny 10.2.0.0 0.0.0.255
R1(config)# access-list 1 permit any

R1(config)# interface GigabitEthernet0/1    ! interfaz cerca del destino
R1(config-if)# ip access-group 1 out
```

#### ACL Extendida (100–199 y 2000–2699) <a href="#acl-extendida-100199-y-20002699" id="acl-extendida-100199-y-20002699"></a>

Filtra por **IP origen, IP destino, protocolo y puerto**. Mucho más precisa. Se debe colocar **cerca del origen** para evitar que el tráfico no deseado recorra innecesariamente la red.

<figure><img src="https://539580950-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiKvwltOme7zTxep3LVyW%2Fuploads%2FPi8kVNsbv4VcGOSwJGgQ%2Fimage.png?alt=media&#x26;token=c09159dc-9602-41e6-92f0-6702f49e31f1" alt=""><figcaption></figcaption></figure>

**Sintaxis:**

```
R1(config)# access-list [100-199] {permit|deny} [protocolo] [ip-origen] [wildcard] [ip-destino] [wildcard] [eq puerto]
```

**Protocolos usados:** `ip`, `tcp`, `udp`, `icmp`

**Puertos comunes:**

| Puerto   | Servicio |
| -------- | -------- |
| `eq 80`  | HTTP     |
| `eq 443` | HTTPS    |
| `eq 21`  | FTP      |
| `eq 22`  | SSH      |
| `eq 23`  | Telnet   |
| `eq 53`  | DNS      |

**Ejemplo — Solo permitir HTTP y DNS desde la red interna, bloquear todo lo demás:**

```
R1(config)# access-list 100 permit tcp 192.168.1.0 0.0.0.255 any eq 80
R1(config)# access-list 100 permit tcp 192.168.1.0 0.0.0.255 any eq 443
R1(config)# access-list 100 permit udp 192.168.1.0 0.0.0.255 any eq 53
! El deny any implícito bloquea el resto

R1(config)# interface GigabitEthernet0/0    ! cerca del origen
R1(config-if)# ip access-group 100 in
```

#### ACL Nombrada (Named ACL) <a href="#acl-nombrada-named-acl" id="acl-nombrada-named-acl"></a>

Igual que estándar o extendida pero usando **un nombre** en lugar de número. Ventaja clave: permite **eliminar líneas individuales** sin borrar toda la ACL.

**Sintaxis:**

```
R1(config)# ip access-list {standard|extended} [NOMBRE]
R1(config-std-nacl)# permit / deny ...
R1(config-std-nacl)# exit
R1(config)# interface GigabitEthernet0/0
R1(config-if)# ip access-group [NOMBRE] {in|out}
```

**Ejemplo:**

```
R1(config)# ip access-list extended FILTRO_WEB
R1(config-ext-nacl)# remark Permite solo HTTP y HTTPS al servidor
R1(config-ext-nacl)# permit tcp any host 10.1.1.10 eq 80
R1(config-ext-nacl)# permit tcp any host 10.1.1.10 eq 443
R1(config-ext-nacl)# deny ip any any
R1(config-ext-nacl)# exit

R1(config)# interface Serial0/0/0
R1(config-if)# ip access-group FILTRO_WEB in
```

Es importante saber dónde colocar la ACL (regla de oro) según:

<table><thead><tr><th width="118.33343505859375">Tipo</th><th width="176.22222900390625">Colocar cerca de...</th><th>Por qué</th></tr></thead><tbody><tr><td><strong>Estándar</strong></td><td>El <strong>destino</strong></td><td>Solo filtra por origen; ponerla cerca del origen bloquearía rutas alternativas legítimas</td></tr><tr><td><strong>Extendida</strong></td><td>El <strong>origen</strong></td><td>Especifica origen Y destino, así el tráfico no deseado se descarta antes de cruzar la red </td></tr></tbody></table>

***

### Práctica 1 — ACL Estándar: Bloquear un departamento <a href="#prctica-1--acl-estndar-bloquear-un-departamento" id="prctica-1--acl-estndar-bloquear-un-departamento"></a>

**Escenario:** Impedir que la red del Departamento RRHH (`192.168.2.0/24`) acceda al servidor financiero (`10.1.1.20`). El resto de la red sí puede acceder.

```
text[RRHH 192.168.2.0/24]──Gi0/1──[R1]──Gi0/0──[Servidores 10.1.0.0/16]
                                             Servidor Financiero: 10.1.1.20
```

```
! ACL estándar: cerca del DESTINO (Gi0/0, hacia los servidores)
R1(config)# access-list 10 deny 192.168.2.0 0.0.0.255
R1(config)# access-list 10 permit any

R1(config)# interface GigabitEthernet0/0
R1(config-if)# ip access-group 10 out

! Verificación
R1# show access-lists
R1# show ip interface GigabitEthernet0/0
```

**Resultado esperado:** Los hosts de `192.168.2.0/24` no pueden hacer ping ni acceder al servidor `10.1.1.20`. El resto de redes sí.

***

### Práctica 2 — ACL Extendida: Filtrado granular por servicio <a href="#prctica-2--acl-extendida-filtrado-granular-por-ser" id="prctica-2--acl-extendida-filtrado-granular-por-ser"></a>

**Escenario:** La red de empleados (`192.168.3.0/24`) solo puede acceder al servidor web (`10.1.1.10`) por HTTP/HTTPS. Se bloquea Telnet a cualquier destino y todo lo demás.

```
text[Empleados 192.168.3.0/24]──Gi0/2──[R1]──Gi0/0──[Servidores 10.1.0.0/16]
```

```
text! ACL extendida: cerca del ORIGEN (Gi0/2, interfaz de empleados)
R1(config)# access-list 101 permit tcp 192.168.3.0 0.0.0.255 host 10.1.1.10 eq 80
R1(config)# access-list 101 permit tcp 192.168.3.0 0.0.0.255 host 10.1.1.10 eq 443
R1(config)# access-list 101 deny tcp 192.168.3.0 0.0.0.255 any eq 23
! El deny implícito bloquea el resto

R1(config)# interface GigabitEthernet0/2
R1(config-if)# ip access-group 101 in

! Verificación
R1# show access-lists 101
R1# show ip interface GigabitEthernet0/2
```

**Resultado esperado:** Los empleados acceden al servidor web por el puerto 80 y 443. Cualquier intento de Telnet o acceso a otro servidor es bloqueado.

***

### Comandos de Verificación y Troubleshooting <a href="#comandos-de-verificacin-y-troubleshooting" id="comandos-de-verificacin-y-troubleshooting"></a>

```
! Ver todas las ACLs configuradas con contadores de matches
R1# show access-lists

! Ver ACL específica
R1# show access-lists 101
R1# show access-lists FILTRO_WEB

! Ver qué ACLs están aplicadas en cada interfaz
R1# show ip interface GigabitEthernet0/0

! Ver la configuración en ejecución (ACLs + interfaces)
R1# show running-config | include access

! Reiniciar contadores (útil para pruebas limpias)
R1# clear ip access-list counters
```

Referencias:

* <https://www.howtonetwork.com/ccna-security/access-control-lists-cisco-acl/>
