# MikroTik PPPoE + DHCPv6-PD: Dual-Stack para DIGI España

> Una entrada de jmrp.io, publicada como documento propio. Índice: https://jmrp.io/llms-full.txt

Canonical: https://jmrp.io/es/blog/008-mikrotik-pppoe-dualstack-digi/
Language: es
Alternate: https://jmrp.io/blog/008-mikrotik-pppoe-dualstack-digi/index.md
License: https://creativecommons.org/licenses/by/4.0/
Type: TechArticle
Published: 2026-02-15
Updated: 2026-09-02
Instructions re-tested: 2026-08-01 · RouterOS 7.23.2 · RB5009UG+S+
Author: José Manuel Requena Plens
Summary: Configura PPPoE con DHCPv6 Prefix Delegation en MikroTik RouterOS para DIGI España. VLAN tagging, SLAAC, gestión de cambios de prefijo y firewall.
Tags: MikroTik, IPv6, Networking
Topics: Point-to-Point Protocol over Ethernet (Q866392), MikroTik (Q913580), IPv6 (Q2551624), DHCPv6 (Q11170), IEEE 802.1Q (Q1535269), Stateless Address Autoconfiguration (Q117198154)
Build-Date: 2026-09-06

Preguntas que responde:

**¿Qué VLAN usa DIGI España para PPPoE?**

DIGI España requiere VLAN tagging 802.1Q en la VLAN 20 para el tráfico PPPoE de internet. Si conectas directamente sin VLAN tagging, la autenticación PPPoE fallará.

**¿Qué prefijo IPv6 delega DIGI vía DHCPv6-PD?**

DIGI delega un prefijo dinámico /56 mediante DHCPv6 Prefix Delegation, lo que te da 256 subredes /64 para usar en tu LAN principal, IoT, red de invitados y más. El prefijo puede cambiar en cada reconexión.

**¿Cómo gestiono el cambio de prefijo IPv6 de DIGI en cada reconexión?**

Añade un script al cliente DHCPv6 que espere 5 segundos a que se rellene el pool, elimine la dirección anunciada antigua del bridge y añada una nueva desde el pool6 actualizado. Como la dirección usa advertise=yes, RouterOS crea automáticamente el ND prefix para SLAAC.

**¿Por qué el MTU de PPPoE es 1480 si configuro max-mtu en 1500?**

El parámetro max-mtu es solo el límite superior que el cliente acepta, no el MTU real de la conexión. El servidor PPPoE determina el MTU real durante la negociación LCP, y DIGI lo negocia hasta 1480 independientemente del valor de max-mtu.

**¿Por qué no se autentica mi conexión PPPoE con DIGI?**

Comprueba que el VLAN ID sea 20, que el usuario use el formato identificador@digi, que el ONT esté en modo bridge y que el cable físico esté conectado. El cliente DHCPv6 también debe estar en la interfaz PPPoE, no en la VLAN.

**¿Funciona esta configuración de MikroTik con otros ISP además de DIGI?**

Sí. Funciona con cualquier ISP basado en PPPoE que proporcione IPv6 vía DHCPv6-PD. Las diferencias entre ISPs suelen ser el ID de VLAN (o ausencia de VLAN), el MTU negociado (normalmente 1480–1492), el formato de usuario y el tamaño del prefijo delegado (/48, /56 o /64).


Pasos (Configurar dual-stack PPPoE + DHCPv6-PD en MikroTik para DIGI España):
1. Configurar la interfaz física
2. Crear la interfaz VLAN
3. Configurar el cliente PPPoE
4. Añadir las interfaces a la lista WAN
5. Configurar el cliente DHCPv6 para prefix delegation
6. Configurar Neighbor Discovery para SLAAC
7. Configurar el NAT IPv4 (masquerade)
8. Verificar la conexión

---

[DIGI España](https://www.digimobil.es/) es uno de los pocos ISP en España que ofrece conectividad IPv6 nativa a clientes residenciales. Su red de fibra utiliza autenticación [PPPoE](https://datatracker.ietf.org/doc/html/rfc2516) con VLAN tagging y proporciona tanto una dirección IPv4 dinámica como un prefijo IPv6 dinámico /56 a través de [DHCPv6 Prefix Delegation (DHCPv6-PD)](https://datatracker.ietf.org/doc/html/rfc3633).

Esta guía cubre la configuración completa de un router [MikroTik](https://mikrotik.com/) para la red de DIGI, incluyendo la gestión automática de cambios de prefijo, un reto habitual cuando tu ISP asigna prefijos dinámicos que pueden cambiar en cada reconexión.

## TL;DR — dual-stack de DIGI España en RouterOS

- **DIGI entrega la sesión PPPoE en la VLAN 20.** Pon el cliente PPPoE sobre una interfaz VLAN encima del puerto WAN, no sobre el puerto directamente, o la autenticación falla sin ningún error útil: es con diferencia el motivo más habitual de que esto no levante.
- **El formato de usuario es `identificador@digi`**, y el IPv4 llega dinámicamente con la default route y el DNS del ISP desde la propia sesión.
- **El IPv6 es un `/56` delegado, no un `/64`.** Pide el prefijo con DHCPv6-PD y talla un `/64` por cada LAN; apuntar el `/56` directamente a un bridge no funciona.
- **El MTU del enlace se negocia a la baja hasta 1480 por LCP, pase lo que pase.** `max-mtu=1500` es solo el límite superior del cliente, no el MTU resultante, así que hay que fijar el MSS o media web carga y la otra media se queda colgada.
- **El prefijo delegado cambia al reconectar**, así que hace falta un script DHCPv6 que reescriba las direcciones de la LAN; sin él, el IPv6 muere en silencio tras un corte mientras el IPv4 sigue funcionando.
- **Probado en RouterOS 7.23.2 sobre un RB5009**, y aplicable a cualquier router MikroTik.

**Importante — Valores específicos de DIGI vs genéricos**

Esta guía está escrita para **DIGI España**, pero la configuración PPPoE + DHCPv6-PD es aplicable a muchos ISPs. Los valores específicos de DIGI están claramente marcados:

- **VLAN 20** — Específico de DIGI. Otros ISPs pueden usar IDs de VLAN diferentes o no usar VLAN
- **`your_number@digi`** — Formato de usuario de DIGI (un identificador numérico asignado por DIGI). Sustitúyelo por las credenciales de tu ISP
- **`max-mtu=1500`** — Límite superior que el cliente aceptará. DIGI negocia el MTU real a **1480** vía LCP
- **`ether1`** — Puerto físico conectado al ONT. Usa el puerto que prefieras

- **`pool6`** — Nombre del pool DHCPv6. Puede ser cualquier nombre que elijas

Si tu ISP no usa VLAN tagging, sáltate el Paso 2 y configura la interfaz del cliente PPPoE directamente sobre el puerto físico.

---

## Cómo lo ejecuto en mi propia infraestructura

Esto no es teórico: mi propio RB5009UG+S+ corre exactamente esta configuración de PPPoE + DHCPv6-PD contra DIGI, con la VLAN de WAN etiquetada como `vlan-id=20` (`VLAN_DIGI`) tal y como se describe más arriba. La versión de RouterOS con la que se comprobó por última vez está sellada al principio de esta página.

La gestión del cambio de prefijo del Paso 5 no es programación defensiva para un caso raro — es el caso normal. Cada vez que reinicio la interfaz PPPoE, o el router entero, DIGI me asigna un nuevo prefijo /56. No de forma ocasional: siempre. Por eso el direccionamiento LAN no puede fijar un prefijo a mano y tiene que recalcularlo en cada reconexión; cualquier cosa que asuma un prefijo estático se rompe en el primer reinicio. El coste es que las sesiones abiertas se cortan unos segundos mientras la interfaz renegocia — la misma interrupción breve que verías tras cualquier desconexión externa.

El MTU negociado de 1480 tampoco es una suposición. Lo he confirmado por tres vías independientes: la documentación oficial de DIGI, la configuración que trae de fábrica el router de DIGI, y probando directamente distintos valores de MTU en mi propia conexión. Las tres coinciden en 1480, no en el 1500 que `max-mtu` solo permite como límite superior.

---

## ¿Cómo transporta PPPoE tanto IPv4 como IPv6?

La red de DIGI requiere una configuración específica: ONT en modo bridge → VLAN 20 → autenticación PPPoE → dual-stack IPv4 + IPv6 (DHCPv6-PD) → firewall/NAT → LAN con SLAAC.

### Lo que recibes de DIGI

**Parámetros de conexión de DIGI**

| Parámetro | Valor | Notas |
| --- | --- | --- |
| Tipo de conexión | PPPoE sobre VLAN 20 | Requiere VLAN tagging |
| Dirección IPv4 | Dinámica (CGNAT o pública) | Asignada vía PPPoE |
| Prefix IPv6 | Dinámico /56 | Vía DHCPv6-PD, puede cambiar en reconexiones |
| MTU | 1480 (negociado) | PPPoE estándar, negociado vía LCP |
| MRU | 1492 (negociado) | Maximum Receive Unit, negociado vía LCP |
| Service Name | ftth | Identificador del servicio PPPoE reportado por DIGI |
| DNS | Proporcionado por el ISP o personalizado | Se puede usar el DNS del ISP o configurar uno propio |

**Información — Sobre el prefijo /56**

DIGI delega un prefijo /56, lo que te da 256 subredes /64 para trabajar. Esto es generoso en comparación con algunos ISPs que solo proporcionan un único /64. Puedes usar diferentes subredes /64 para tu LAN principal, red IoT, red de invitados, etc.

---

## Requisitos previos

**Antes de empezar**

- **Router MikroTik** con RouterOS 7.x o posterior
- **Conexión de fibra DIGI** con ONT en modo bridge (o el equivalente de tu ISP)
- **Credenciales PPPoE** de tu ISP (formato DIGI: `identificador@digi`)
- **Cable ethernet físico** entre ONT y router
- **Acceso administrativo** a tu router MikroTik (WinBox, WebFig o SSH)
- **Listas de interfaces** `WAN` y `LAN` con tu bridge ya en la lista `LAN` (configuración por defecto en la mayoría de equipos MikroTik)

**Consejo — Otros ISPs que usan PPPoE**

Esta configuración funciona con cualquier ISP basado en PPPoE que proporcione IPv6 vía DHCPv6-PD. Las diferencias clave entre ISPs suelen ser: el ID de VLAN (o ausencia de VLAN), el MTU negociado (normalmente 1480–1492, determinado por el servidor vía LCP), el formato de usuario y el tamaño del prefijo delegado (/48, /56 o /64). Ajusta los valores específicos de DIGI para tu ISP.

---

## Paso 1: configurar la interfaz física

Primero, configura el puerto ethernet conectado al ONT de DIGI:

**Configuración de la interfaz física**

```routeros
/interface ethernet set [ find default-name=ether1 ] \
    comment="DIGI ONT" \
    rx-flow-control=auto \
    tx-flow-control=auto
```

**Consejo — Qué puerto usar**

Elige cualquier puerto ethernet disponible. En este ejemplo usamos `ether1`, pero puedes usar cualquier puerto que no esté asignado al bridge de tu LAN. Usar un puerto dedicado para WAN mejora la seguridad y simplifica las reglas de firewall.

---

## Paso 2: crear la interfaz VLAN

DIGI requiere VLAN 20 tagging para el tráfico PPPoE. Crea la interfaz VLAN:

**Configuración de VLAN**

```routeros
/interface vlan add \
    name=VLAN_DIGI \
    vlan-id=20 \
    interface=ether1 \
    comment="VLAN for ISP connection"
```

### ¿Por qué VLAN 20?

DIGI utiliza [VLAN tagging 802.1Q](https://datatracker.ietf.org/doc/html/rfc3069) para separar diferentes servicios en su red. VLAN 20 es específicamente para el servicio de internet. Si conectas directamente sin VLAN tagging, la autenticación PPPoE fallará.

Si tu ISP no requiere VLAN tagging, sáltate este paso. En el Paso 3, configura la interfaz del cliente PPPoE directamente sobre el puerto físico:

```routeros
/interface pppoe-client add \
    interface=ether1 \
    ...
```

Configuraciones VLAN habituales en ISPs españoles:

- **DIGI España**: VLAN 20
- **Movistar España**: VLAN 6 (internet) + VLAN 2 (VoIP) + VLAN 3 (IPTV)
- **Orange España**: VLAN 832
- **Sin VLAN**: Muchos ISPs (especialmente operadores de cable/DOCSIS)

---

## Paso 3: configurar el cliente PPPoE

Ahora crea el cliente PPPoE que se autenticará con DIGI:

**Configuración del cliente PPPoE**

```routeros
/interface pppoe-client add \
    name=PPPoE_DIGI \
    interface=VLAN_DIGI \
    user="your_number@digi" \
    password="your_password" \
    add-default-route=yes \
    use-peer-dns=yes \
    max-mtu=1500 \
    profile=default-encryption \
    disabled=no \
    comment="PPPoE client for ISP DIGI"
```

**Advertencia — Sustituye las credenciales**

**Debes** reemplazar `your_number@digi` y `your_password` con las credenciales proporcionadas por tu ISP. En DIGI España, el usuario es un identificador numérico asignado por DIGI seguido de `@digi`.

**Parámetros de configuración PPPoE**

| Parámetro | Valor | Propósito |
| --- | --- | --- |
| `interface` | VLAN_DIGI | PPPoE se ejecuta sobre la interfaz VLAN, no sobre el puerto físico |
| `add-default-route` | yes | Añade automáticamente la default route al conectarse |
| `use-peer-dns` | yes | Usa los servidores DNS de DIGI (se puede desactivar para DNS personalizado) |
| `max-mtu` | 1500 | MTU máximo que acepta el cliente. DIGI negocia hasta 1480 vía LCP |
| `profile` | default-encryption | Perfil PPP estándar con soporte de cifrado MPPE |

El perfil `default-encryption` habilita la negociación **MPPE (Microsoft Point-to-Point Encryption)** durante la autenticación PPP. Es la opción estándar para la mayoría de ISPs.

MikroTik incluye dos perfiles predefinidos:

- **`default`** — Sin requisito de cifrado
- **`default-encryption`** — Requiere cifrado (recomendado)

La mayoría de ISPs, incluido DIGI, funcionan con ambos perfiles. Usa `default-encryption` salvo que tu ISP requiera lo contrario. Puedes consultar los perfiles disponibles con `/ppp profile print`.

**Información — Consideraciones sobre el MTU**

El parámetro `max-mtu` es el **límite superior** que el cliente está dispuesto a aceptar; no es el MTU real de la conexión. El MTU real lo determina el servidor PPPoE durante la [negociación LCP](https://datatracker.ietf.org/doc/html/rfc1661#section-6.1). El servidor de DIGI negocia el MTU a **1480** independientemente del valor de `max-mtu` configurado. Usar `max-mtu=1500` es seguro y deja margen al servidor para negociar un valor superior si algún día lo soporta.

**Importante**: Cambiar `max-mtu` en un cliente PPPoE activo hace que RouterOS **reinicie la sesión**, provocando una breve desconexión (~3–5 segundos) mientras renegocia con el servidor.

---

## Paso 4: añadir interfaces a la lista WAN

Para que las reglas de firewall funcionen correctamente, añade todas las interfaces WAN a una lista de interfaces. Esto es esencial: sin ello, las reglas de firewall que referencien la lista `WAN` no coincidirán correctamente con el tráfico.

**Listas de interfaces**

```routeros
# Create WAN interface list (skip if it already exists in your config)
/interface list add name=WAN comment="ISP Interfaces Group"

# Add WAN interfaces — all three layers of the ISP connection
/interface list member add \
    interface=ether1 \
    list=WAN \
    comment="ISP Physical port"                                    # ← CUSTOMIZE port

/interface list member add \
    interface=VLAN_DIGI \
    list=WAN \
    comment="ISP VLAN"                                             # Skip if no VLAN

/interface list member add \
    interface=PPPoE_DIGI \
    list=WAN \
    comment="ISP PPPoE Client"
```

**Información — ¿Por qué tres interfaces WAN?**

La lista WAN incluye las tres capas porque las reglas de firewall pueden necesitar coincidir con tráfico en diferentes etapas:

- **Puerto físico** (`ether1`): Tramas ethernet sin procesar
- **VLAN** (`VLAN_DIGI`): Tráfico etiquetado antes de PPPoE
- **PPPoE** (`PPPoE_DIGI`): Túnel autenticado (la mayoría de reglas de firewall coinciden aquí)

Añadir las tres garantiza que tus reglas de firewall funcionen independientemente de por qué interfaz llegue el tráfico.

---

## Paso 5: configurar el cliente DHCPv6 para prefix delegation

Aquí es donde IPv6 se pone interesante. DIGI proporciona un prefijo /56 vía [DHCPv6-PD (Prefix Delegation)](https://datatracker.ietf.org/doc/html/rfc3633). Necesitamos:

1. Solicitar el prefijo a DIGI
2. Almacenarlo en un pool local
3. Asignar direcciones a nuestra LAN desde ese pool
4. Configurar Router Advertisements para [SLAAC](https://datatracker.ietf.org/doc/html/rfc4862)

**Cliente DHCPv6 con script**

```routeros
/ipv6 dhcp-client add \
    interface=PPPoE_DIGI \
    pool-name=pool6 \
    request=prefix \
    add-default-route=yes \
    use-peer-dns=yes \
    allow-reconfigure=yes \
    rapid-commit=no \
    comment="DHCPv6 client for ISP DIGI" \
    script=":delay 5s;
/ipv6 address remove [find advertise=yes];
/ipv6 address add interface=bridge address=::1/64 from-pool=pool6 advertise=yes;"
```

El script espera 5 segundos a que el pool se rellene, elimina cualquier dirección IPv6 anunciada anteriormente en el bridge y añade una nueva desde el pool actualizado. Como la dirección usa `advertise=yes`, RouterOS **crea automáticamente un ND prefix dinámico** para SLAAC; no es necesario gestionar manualmente los ND prefix.

**Información — ¿Por qué eliminar y volver a añadir?**

Cuando el prefijo del ISP cambia (reconexión PPPoE, renovación de lease), la dirección antigua se vuelve inválida. El script garantiza que el bridge siempre tenga una dirección válida del pool actual. El flag `advertise=yes` hace que RouterOS anuncie automáticamente el prefijo `/64` correcto a los dispositivos LAN mediante Router Advertisements (SLAAC).

---

## Paso 6: asignar dirección IPv6 a la LAN

La interfaz LAN del router necesita una dirección IPv6 del pool delegado:

**Dirección IPv6 en LAN**

```routeros
/ipv6 address add \
    interface=bridge \
    address=::1/64 \
    from-pool=pool6 \
    advertise=yes
```

Esto crea una dirección como `2a0c:5a84:xxxx:xx00::1/64` donde el prefijo proviene de la delegación de DIGI.

---

## Paso 7: configurar Neighbor Discovery (SLAAC)

Para que los dispositivos LAN configuren automáticamente sus direcciones IPv6 mediante [SLAAC (Stateless Address Autoconfiguration)](https://datatracker.ietf.org/doc/html/rfc4862), configura Neighbor Discovery:

**IPv6 Neighbor Discovery**

```routeros
# Configure ND defaults
/ipv6 nd set [ find default=yes ] \
    hop-limit=64 \
    mtu=1500 \
    other-configuration=yes \
    reachable-time=30s \
    retransmit-interval=1s

# Configure ND for LAN bridge
/ipv6 nd add \
    interface=bridge \
    ra-preference=high \
    hop-limit=64 \
    mtu=1500 \
    dns=fe80::1 \
    reachable-time=30s \
    retransmit-interval=1s
```

**Parámetros de Neighbor Discovery**

| Parámetro | Valor | Propósito |
| --- | --- | --- |
| `ra-preference` | high | Los clientes prefieren este router sobre otros |
| `hop-limit` | 64 | TTL para paquetes salientes (valor estándar) |
| `dns` | fe80::1 | Dirección link-local del router como DNS (RDNSS) |
| `other-configuration` | yes | Indica a los clientes que usen DHCPv6 para otras opciones |

---

## Paso 8: configurar NAT IPv4 (masquerade)

Para la conectividad IPv4 de salida:

**Masquerade IPv4**

```routeros
/ip firewall nat add \
    chain=srcnat \
    action=masquerade \
    out-interface-list=WAN \
    ipsec-policy=out,none \
    comment="Masquerade for internet access"
```

---

## Paso 9: verificar la conexión

### Comprobar el estado de PPPoE

**Sesión de terminal — Estado del cliente PPPoE**

```routeros
/interface pppoe-client print detail
```

**Salida — PPPoE conectado**

```text
Flags: X - disabled; R - running
 0  R name="PPPoE_DIGI" max-mtu=1500 max-mru=auto mrru=disabled
      interface=VLAN_DIGI user="your_number@digi" password="****"
      profile=default-encryption keepalive-timeout=10
      service-name="" ac-name="" add-default-route=yes
      default-route-distance=1 dial-on-demand=no use-peer-dns=yes
      allow=pap,chap,mschap1,mschap2 status=connected
      uptime=3d14h22m45s encoding=""
      local-address=79.117.xxx.xxx remote-address=10.0.0.1
```

**Consejo — Qué buscar**

- **status=connected** — La sesión PPPoE está activa
- **local-address** — Tu dirección IPv4 pública asignada por el ISP
- **max-mtu** — Límite superior que acepta el cliente (1500). El MTU real se negocia por el servidor vía LCP (DIGI: 1480)
- Si `status=connecting` o `status=disconnected`, revisa las credenciales y la configuración de VLAN

### Comprobar los valores negociados de PPPoE

**Sesión de terminal — Salida del monitor PPPoE**

```routeros
/interface pppoe-client monitor PPPoE_DIGI once
```

**Salida — Valores negociados**

```text
               status: connected
         service-name: ftth
              ac-name: ftth
                  mtu: 1480
                  mru: 1492
        local-address: 79.117.xxx.xxx
       remote-address: 10.0.x.x
   local-ipv6-address: fe80::xxxx:xxxx:x:xx
  remote-ipv6-address: fe80::1
```

**Consejo — Monitor vs Print**

El comando `monitor` muestra los **valores negociados en tiempo real**: el MTU real (1480), MRU (1492), service name (`ftth`) y el nombre del access concentrator. Úsalo para verificar lo que realmente proporciona el servidor, a diferencia de `print detail` que muestra los parámetros configurados.

### Comprobar la delegación de prefijo IPv6

**Sesión de terminal — Prefix Delegation IPv6**

```routeros
/ipv6 pool print
```

**Salida — Prefix delegado**

```text
Flags: D - dynamic
 0 D name="pool6" prefix=2001:db8:abcd:ef00::/56 prefix-length=64
```

**Información — Prefix de ejemplo**

El prefijo mostrado arriba (`2001:db8:...`) es un ejemplo de documentación. Tu ISP asignará un prefijo real de su asignación.
DIGI España normalmente delega un prefijo `/56`, lo que te da 256 posibles subredes `/64`.

### Comprobar las direcciones IPv6

```routeros
/ipv6 address print where interface=bridge
```

**Salida — Dirección IPv6 en LAN**

```text
Flags: X - disabled, I - invalid, D - dynamic, G - global, L - link-local
 0  DG  address=2001:db8:abcd:ef00::1/64 from-pool=pool6
        interface=bridge advertise=yes
```

### Probar la conectividad IPv6

**Probar IPv6**

```bash
/ping 2001:4860:4860::8888 count=4
```

---

## Resumen completo de la configuración

**Fichero: `pppoe-digi-complete.rsc` — Configuración PPPoE completa para DIGI**

```routeros
# ═══════════════════════════════════════════════════════════════════════════════
# MIKROTIK PPPoE CONFIGURATION FOR DIGI SPAIN
# ═══════════════════════════════════════════════════════════════════════════════
# Dual-Stack IPv4 + IPv6 with DHCPv6 Prefix Delegation
# ═══════════════════════════════════════════════════════════════════════════════

# ───────────────────────────────────────────────────────────────────────────────
# PHYSICAL INTERFACE
# ───────────────────────────────────────────────────────────────────────────────

/interface ethernet set [ find default-name=ether1 ] \          # ← CUSTOMIZE port
    comment="DIGI ONT" \
    rx-flow-control=auto \
    tx-flow-control=auto

# ───────────────────────────────────────────────────────────────────────────────
# VLAN CONFIGURATION (skip if your ISP doesn't use VLANs)
# ───────────────────────────────────────────────────────────────────────────────

/interface vlan add \
    name=VLAN_DIGI \
    vlan-id=20 \                                                   # ← CUSTOMIZE VLAN ID
    interface=ether1 \                                              # ← CUSTOMIZE port
    comment="VLAN for ISP connection"

# ───────────────────────────────────────────────────────────────────────────────
# PPPoE CLIENT
# ───────────────────────────────────────────────────────────────────────────────

/interface pppoe-client add \
    name=PPPoE_DIGI \
    interface=VLAN_DIGI \                                           # ← Use ether port if no VLAN
    user="your_number@digi" \                                       # ← CUSTOMIZE credentials
    password="your_password" \                                      # ← CUSTOMIZE credentials
    add-default-route=yes \
    use-peer-dns=yes \
    max-mtu=1500 \                                                  # Upper limit; server negotiates actual MTU via LCP
    profile=default-encryption \
    disabled=no \
    comment="PPPoE client for ISP DIGI"

# ───────────────────────────────────────────────────────────────────────────────
# INTERFACE LISTS
# ───────────────────────────────────────────────────────────────────────────────

/interface list add name=WAN comment="ISP Interfaces Group"    # Skip if it already exists

/interface list member add interface=ether1 list=WAN comment="ISP Physical port"         # ← CUSTOMIZE port
/interface list member add interface=VLAN_DIGI list=WAN comment="ISP VLAN"                # Skip if no VLAN
/interface list member add interface=PPPoE_DIGI list=WAN comment="ISP PPPoE Client"

# ───────────────────────────────────────────────────────────────────────────────
# DHCPv6 CLIENT (PREFIX DELEGATION)
# ───────────────────────────────────────────────────────────────────────────────

/ipv6 dhcp-client add \
    interface=PPPoE_DIGI \
    pool-name=pool6 \
    request=prefix \
    add-default-route=yes \
    use-peer-dns=yes \
    allow-reconfigure=yes \
    rapid-commit=no \
    comment="DHCPv6 client for ISP DIGI" \
    script=":delay 5s;
/ipv6 address remove [find advertise=yes];
/ipv6 address add interface=bridge address=::1/64 from-pool=pool6 advertise=yes;"

# ───────────────────────────────────────────────────────────────────────────────
# IPv6 ADDRESS FOR LAN
# ───────────────────────────────────────────────────────────────────────────────

/ipv6 address add \
    interface=bridge \
    address=::1/64 \
    from-pool=pool6 \
    advertise=yes

# ───────────────────────────────────────────────────────────────────────────────
# NEIGHBOR DISCOVERY (SLAAC)
# ───────────────────────────────────────────────────────────────────────────────

/ipv6 nd set [ find default=yes ] \
    hop-limit=64 \
    mtu=1500 \
    other-configuration=yes \
    reachable-time=30s \
    retransmit-interval=1s

/ipv6 nd add \
    interface=bridge \
    ra-preference=high \
    hop-limit=64 \
    mtu=1500 \
    dns=fe80::1 \
    reachable-time=30s \
    retransmit-interval=1s

# ───────────────────────────────────────────────────────────────────────────────
# IPv4 NAT (MASQUERADE)
# ───────────────────────────────────────────────────────────────────────────────

/ip firewall nat add \
    chain=srcnat \
    action=masquerade \
    out-interface-list=WAN \
    ipsec-policy=out,none \
    comment="Masquerade for internet access"
```

---

## Mejoras opcionales

La configuración principal de PPPoE + DHCPv6-PD está completa. Las siguientes secciones cubren funcionalidades adicionales que puedes añadir según tus necesidades.

### Port forwarding IPv6 con actualización automática de NAT

**Información — ¿Cuándo necesitas esto?**

Solo es necesario si expones servicios a internet por IPv6 (por ejemplo, un servidor web). Si solo necesitas conectividad IPv6 de salida para los dispositivos LAN, sáltate esta sección.

Si usas este script, añade `/system script run update-ipv6-nat;` como última línea del script del cliente DHCPv6 del Paso 5 para que se ejecute automáticamente en cada cambio de prefijo.

#### Crear una regla de reenvío de puertos

Necesitas al menos una regla dstnat IPv6. Este ejemplo redirige tráfico HTTP y HTTPS desde la WAN a un servidor web interno:

**Port forwarding IPv6 — Servidor web**

```routeros
/ipv6 firewall nat add \
    chain=dstnat \
    action=dst-nat \
    protocol=tcp \
    dst-port=80,443 \
    in-interface=PPPoE_DIGI \
    to-address=2001:db8:abcd:ef00:1111:2222:3333:4444 \
    comment="Web Server"
```

**Consejo — Identificación de reglas por comment**

El campo `comment` es lo que el script de actualización usa para identificar qué reglas modificar. Usa un **comment descriptivo y único** para cada servicio que expongas. Si tienes servicios adicionales, añade más reglas con comments diferentes (por ejemplo, `"Mail Server"`, `"Game Server"`).

#### Crear el script de actualización

Dado que el prefijo delegado cambia en cada reconexión PPPoE, el `to-address` de tus reglas dstnat queda obsoleto. Este script reconstruye automáticamente la dirección IPv6 completa a partir del nuevo prefijo y actualiza todas las reglas coincidentes:

**Script de actualización de NAT IPv6**

```routeros
/system script add \
    name=update-ipv6-nat \
    comment="Auto-update IPv6 NAT when pool6 changes" \
    policy=read,write,policy,test \
    source={
:local serverHost "1111:2222:3333:4444";  # ← CUSTOMIZE: your server's host portion
:local poolprefix [/ipv6/pool get [find name=pool6] prefix];
:local slashPos [:find $poolprefix "/"];
:local prefix [:pick $poolprefix 0 $slashPos];
:local prefixLen [:len $prefix];
:if ([:pick $prefix ($prefixLen - 2) $prefixLen] = "::") do={
    :set prefix [:pick $prefix 0 ($prefixLen - 1)];
}
:local serverIPv6 ($prefix . $serverHost);
/ipv6/firewall/nat set [find comment="Web Server"] to-address=$serverIPv6;
:log info ("IPv6 NAT updated: " . $serverIPv6);
}
```

**Importante — Personalizar antes de usar**

Sustituye `1111:2222:3333:4444` con la parte host estática de tu servidor (ver consejo más abajo). Sustituye `"Web Server"` con el comment exacto de tu regla NAT. Si tienes varias reglas, añade una línea `set [find comment="..."]` para cada una.

#### Cómo funciona el script

**Construcción de la dirección IPv6**

```mermaid
flowchart LR
    subgraph Prefix["Prefix delegado por el ISP"]
        P1["2001:db8:abcd:ef00"]:::info
    end
    
    subgraph Host["Sufijo host estático"]
        H1["1111:2222:3333:4444"]:::highlight
    end
    
    subgraph Full["Dirección IPv6 completa"]
        F1["2001:db8:abcd:ef00:1111:2222:3333:4444"]:::success
    end
    
    P1 --> F1
    H1 --> F1
```

El script:

1. Obtiene el prefijo actual de `pool6` (por ejemplo, `2001:db8:abcd:ef00::/56`)
2. Elimina la notación de longitud (`/56`) y los `::` finales para aislar el prefijo de red
3. Añade la parte host estática para formar la dirección IPv6 completa
4. Actualiza todas las reglas dstnat coincidentes identificadas por su campo `comment`

**Consejo — Parte host estática**

Usa la [dirección EUI-64](https://datatracker.ietf.org/doc/html/rfc4291#section-2.5.1) de tu servidor (derivada de su dirección MAC) o asigna un [sufijo estático](https://datatracker.ietf.org/doc/html/rfc8064). La parte host permanece constante entre cambios de prefijo, lo que hace fiables las actualizaciones automáticas.

**Nota — Alternativa: address list**

Si gestionas múltiples servicios apuntando al mismo servidor, considera mantener una **address list en el firewall** con la IPv6 actual del servidor. El script actualiza una única entrada en `/ipv6 firewall address-list`, y las reglas de **filter** del firewall pueden referenciarla mediante `dst-address-list`, simplificando la gestión de reglas. Ten en cuenta que las reglas dstnat requieren un `to-address` explícito, por lo que estas siguen necesitando actualizaciones individuales en el script.

### Reglas básicas de firewall

Protege tu conexión con reglas de firewall esenciales para IPv4 e IPv6:

**Fichero: `firewall-basic.rsc` — Configuración básica de firewall**

```routeros
# ═══════════════════════════════════════════════════════════════════════════════
# IPv4 FIREWALL - INPUT CHAIN
# ═══════════════════════════════════════════════════════════════════════════════

/ip firewall filter

# Accept established and related connections
add chain=input action=accept \
    connection-state=established,related \
    comment="Accept established/related"

# Drop invalid connections
add chain=input action=drop \
    connection-state=invalid \
    comment="Drop invalid"

# Accept ICMP (ping)
add chain=input action=accept \
    protocol=icmp \
    comment="Accept ICMP"

# Accept from LAN
add chain=input action=accept \
    in-interface-list=LAN \
    comment="Accept from LAN"

# Drop everything else from WAN
add chain=input action=drop \
    in-interface-list=WAN \
    comment="Drop all from WAN"

# ═══════════════════════════════════════════════════════════════════════════════
# IPv4 FIREWALL - FORWARD CHAIN
# ═══════════════════════════════════════════════════════════════════════════════

# FastTrack established connections
add chain=forward action=fasttrack-connection \
    connection-state=established,related \
    hw-offload=yes \
    comment="FastTrack"

add chain=forward action=accept \
    connection-state=established,related \
    comment="Accept established/related"

# Drop invalid
add chain=forward action=drop \
    connection-state=invalid \
    comment="Drop invalid"

# Accept from LAN to WAN
add chain=forward action=accept \
    in-interface-list=LAN \
    out-interface-list=WAN \
    comment="LAN to WAN"

# Drop everything else
add chain=forward action=drop \
    comment="Drop all other forward"

# ═══════════════════════════════════════════════════════════════════════════════
# IPv6 FIREWALL - INPUT CHAIN
# ═══════════════════════════════════════════════════════════════════════════════

/ipv6 firewall filter

# Accept established and related
add chain=input action=accept \
    connection-state=established,related \
    comment="Accept established/related"

# Drop invalid
add chain=input action=drop \
    connection-state=invalid \
    comment="Drop invalid"

# Accept ICMPv6
add chain=input action=accept \
    protocol=icmpv6 \
    comment="Accept ICMPv6"

# Accept DHCPv6 client replies
add chain=input action=accept \
    protocol=udp \
    dst-port=546 \
    src-address=fe80::/10 \
    comment="Accept DHCPv6-Client prefix delegation"

# Accept from LAN
add chain=input action=accept \
    in-interface-list=LAN \
    comment="Accept from LAN"

# Drop from WAN
add chain=input action=drop \
    in-interface-list=WAN \
    comment="Drop all from WAN"

# ═══════════════════════════════════════════════════════════════════════════════
# IPv6 FIREWALL - FORWARD CHAIN
# ═══════════════════════════════════════════════════════════════════════════════

# Accept established and related
add chain=forward action=accept \
    connection-state=established,related \
    comment="Accept established/related"

# Drop invalid
add chain=forward action=drop \
    connection-state=invalid \
    comment="Drop invalid"

# Accept ICMPv6 for path MTU discovery
add chain=forward action=accept \
    protocol=icmpv6 \
    comment="Accept ICMPv6"

# Accept outbound from LAN
add chain=forward action=accept \
    in-interface-list=LAN \
    out-interface-list=WAN \
    comment="LAN to WAN"

# Drop all other forward
add chain=forward action=drop \
    comment="Drop all other forward"
```

### Logging de PPPoE

Opcionalmente, habilita el registro de eventos PPPoE para la resolución de problemas:

**Logging de PPPoE**

```routeros
/system logging add \
    topics=pppoe \
    prefix="[PPPoE]" \
    action=memory
```

---

## Resolución de problemas

### PPPoE no conecta

- Verifica que el VLAN ID sea 20
- Comprueba el formato del usuario: `identificador@digi`
- Asegúrate de que el ONT esté en modo bridge
- Revisa la conexión del cable físico

### No se recibe prefijo IPv6

- El cliente DHCPv6 debe estar en la interfaz PPPoE, no en la VLAN
- El tipo de solicitud debe ser `prefix`, no `address`
- Comprueba que el firewall permite DHCPv6 (UDP 546)

### Los dispositivos LAN no obtienen IPv6

- Verifica que ND esté configurado para la interfaz bridge
- Comprueba que la dirección IPv6 del bridge tenga `advertise=yes`
- Asegúrate de que pool6 tenga un prefijo válido

---

## Conclusión

Ahora tienes una configuración dual-stack completa para [DIGI España](https://www.digimobil.es/) con:

- **Autenticación PPPoE** sobre VLAN 20
- **IPv4 dinámico** con default route automática
- **DHCPv6 Prefix Delegation** para IPv6 nativo
- **Gestión automática** de cambios de prefijo
- **SLAAC** para configuración sencilla de dispositivos LAN

Esta configuración garantiza que tu red mantenga conectividad IPv4 e IPv6 completa incluso cuando el ISP cambie los prefijos asignados. El script DHCPv6 gestiona la complejidad de los cambios de prefijo, haciendo que la configuración sea realmente «configura y olvídate».

