Hoy hablaremos sobre la recuperación de contraseñas de routers y switches, la actualización, reinstalación y restauración del IOS, así como del sistema de licencias de Cisco para el sistema operativo IOSv15. Estos son temas muy importantes relacionados con la gestión de dispositivos de red.

¿Cómo se puede recuperar una contraseña? Puede que se pregunte por qué es necesario. Supongamos que ha configurado un dispositivo y ha establecido todas las contraseñas necesarias: en VTY, en la consola, en el modo privilegiado, para conexiones Telnet y SSH, y luego olvida esas contraseñas. Es posible que un empleado de la empresa que las configuró se haya ido y no le haya pasado las anotaciones, o que haya comprado un router en eBay y no conozca las contraseñas que estableció el antiguo dueño, por lo que no puede acceder al dispositivo.
En tales situaciones, se deben aplicar técnicas 'hackers'. Usted hackea el dispositivo Cisco y reinstala las contraseñas, pero esto no es realmente hacking si el dispositivo le pertenece. Para ello, necesita tres cosas: una secuencia de interrupción (Break Sequence), el registro de configuración y reiniciar el sistema.
Usted utiliza un interruptor, apaga la alimentación del router y lo vuelve a encender de inmediato para que el router comience a reiniciarse, los 'cisquistas' llaman a esto 'bouncing'. En el momento de descomprimir la imagen del IOS, debe aplicar una interrupción de carga, es decir, conectarse al dispositivo a través del puerto de consola y ejecutar la Break Sequence. La combinación de teclas que activa la Break Sequence depende del programa de emulación de terminal que esté utilizando, es decir, para Hyperterminal la interrupción de carga se realiza con una combinación, para SequreSRT – con otra. Debajo de este video, proporciono un enlace , donde se puede consultar todas las combinaciones de teclas para diferentes emuladores de terminal, diferentes compatibilidades y diferentes sistemas operativos.
Al utilizar la interrupción de carga, el router se iniciará en modo ROMmon. ROMmon es similar al BIOS de un ordenador, es un sistema operativo básico elemental que permite ejecutar comandos de servicio básicos. En este modo, se puede utilizar el registro de configuración. Como es bien sabido, durante el proceso de arranque, el sistema verifica la existencia de configuraciones de arranque, y si no las hay, se inicia con la configuración predeterminada.
Normalmente, el valor del registro de configuración del router es 0x2102, lo que significa que se inicia la configuración de arranque. Si se cambia este valor a 0x2142, durante la Secuencia de Interrupción se ignorará la configuración de arranque, ya que el sistema no tendrá en cuenta el contenido de la memoria no volátil NVRAM, y se cargará la configuración predeterminada que corresponde a la configuración del router 'de fábrica'.
Por lo tanto, para iniciar con la configuración predeterminada, es necesario cambiar el valor del registro de configuración a 0x2142, lo que literalmente le dice al dispositivo: '¡por favor, ignora la configuración de arranque en cualquier inicio!'. Dado que esta configuración contiene todas las contraseñas, al arrancar con la configuración predeterminada, obtienes acceso sin restricciones al modo privilegiado. En este modo, puedes reinstalar contraseñas, guardar los cambios realizados, reiniciar el sistema y obtener el control total del dispositivo.
Ahora voy a abrir Packet Tracer y mostraré lo que acabo de explicar. Puedes ver la topología de la red, que consiste en un router en el que necesitamos reinstalar contraseñas, un switch y un portátil. En todos los tutoriales en video, hice clic en el ícono del dispositivo en Packet Tracer, accedí a la pestaña de la consola CLI y configuré el dispositivo. Ahora quiero hacerlo de manera diferente y mostrar cómo se hace en un dispositivo real.
Voy a conectar el puerto serie del portátil RS-232 con un cable de consola al puerto de consola del router, en el programa este cable es de color azul. No necesito configurar ninguna dirección IP, ya que no son necesarias para comunicarse con el puerto de consola del router.

En el portátil, accedo a la pestaña Terminal y verifico los parámetros: velocidad de transmisión 9600 b/s, bits de datos - 8, sin paridad, bits de parada - 1, control de flujo - ninguno, y luego presiono el botón OK, lo que me da acceso a la consola del router. Si comparo la información en ambas ventanas - la CLI del router R0 y la pantalla del portátil Laptop0, será absolutamente idéntica.

Packet Tracer permite hacer cosas así, pero en la práctica no utilizaremos la ventana de la consola CLI del router, sino que trabajaremos solo a través del terminal de la computadora.
Así que tenemos un enrutador del que necesitamos restablecer la contraseña. Accedes a la terminal de tu computadora portátil, revisas los parámetros, accedes al panel de configuración del enrutador y ves que el acceso está bloqueado por una contraseña. ¿Cómo se puede acceder a él?
Voy al enrutador, a la pestaña donde se muestra como un dispositivo físico, hago clic en el botón de encendido y lo enciendo de nuevo inmediatamente. Ves que en la ventana de la terminal aparece un mensaje de auto-descompresión de la imagen del sistema operativo. En este momento debes usar la combinación de teclas Ctrl+C, que se utiliza para entrar en modo rommon en el programa Packet Tracer. Si has accedido a través de Hyperterminal, debes pulsar Ctrl+Break.
Ves que en la pantalla aparece una línea con el encabezado rommon 1, y si ingresas el signo de interrogación, el sistema te dará una serie de sugerencias sobre qué comandos se pueden usar en este modo.

El parámetro boot inicia el proceso interno de carga, confreg ejecuta la utilidad de configuración del registro, y estamos interesados precisamente en este comando. Escribo en la línea de la terminal confreg 0x2142. Esto significa que al reiniciar, se ignorará la información almacenada en la memoria flash NVRAM y el enrutador arrancará con la configuración predeterminada, como un dispositivo completamente nuevo. Si hubiera escrito el comando confreg 0x2102, el enrutador habría usado los últimos parámetros de inicio guardados.
Luego, con el comando reset, reinicio el sistema. Como puedes ver, después de su arranque, en lugar de solicitar la entrada de la contraseña, como la última vez, el sistema simplemente pregunta si deseo continuar con el diálogo de configuración. Ahora tenemos un enrutador con la configuración predeterminada, sin ninguna configuración de usuario.

Escribo no, luego presiono enter y paso del modo usuario al modo privilegiado. Como quiero revisar la configuración de arranque, uso el comando show startup-config. Ves el nombre del host NwKing router, el banner de bienvenida y la contraseña para la consola «console». Ahora conozco esta contraseña y puedo copiarla para no olvidarla, o puedo cambiarla por otra.
Lo primero que necesito hacer es cargar la configuración de inicio en la configuración actual del enrutador. Para esto, utilizo el comando copy startup-config running-config. Ahora, nuestra configuración actual es la anterior del enrutador. Puede ver que después de esto, el nombre del enrutador en la línea de comandos cambió de Router a NwKingRouter. Con el comando show run, puede ver la configuración actual del dispositivo, donde se puede observar que la contraseña de la consola es la palabra «console», no hemos utilizado enable password, lo cual es correcto. Debe recordar que la recuperación "mata" el modo privilegiado y nuevamente se encuentra en el modo de usuario de la línea de comandos.
Todavía podemos realizar cambios en el registro, y si la contraseña fuera secreta, es decir, se hubiera utilizado la función enable secret, obviamente no podría desencriptarla, por lo que podría regresar al modo de configuración global con el comando config t y establecer una nueva contraseña. Para esto, escribo el comando enable secret enable o puedo usar cualquier otra palabra como contraseña. Al escribir show run, verá que la función enable secret está activada, la contraseña ahora no aparece como la palabra «enable», sino como una cadena de caracteres encriptados y no tiene que preocuparse por la seguridad, porque acaba de establecer y encriptar la nueva contraseña.

Así es como se puede realizar la recuperación de la contraseña del enrutador. Preste atención a una cosa importante: si ingresa el comando «mostrar versión» show version, verá que el valor del registro de configuración es 0x2142. Esto significa que, incluso si utilizo el comando copy running to startup y reinicio el enrutador, el sistema volverá a cargar la configuración predeterminada, es decir, el enrutador regresará a la configuración de fábrica. No queremos eso en absoluto, porque hemos restablecido la contraseña, tomado el control del dispositivo y queremos utilizarlo en modo operativo.
Por lo tanto, debemos entrar en el modo de configuración global Router(config)# e introducir el comando config-register 0x2102 y solo después usar el comando para copiar la configuración actual al inicio copy run start. También se puede copiar la configuración actual a la configuración de inicio usando el comando write. Si ahora escribimos show version, veremos que el valor del registro de configuración es ahora 0x2102, y el sistema indica que los cambios tendrán efecto en el próximo reinicio del router.
Por lo tanto, iniciamos el reinicio con el comando reload, el sistema se reinicia y ahora tenemos todos los archivos de configuración, todas las configuraciones y conocemos todas las contraseñas. Así es como se lleva a cabo la recuperación de contraseñas del router.
Vamos a ver cómo realizar el mismo procedimiento para un switch. El router tiene un interruptor que permite apagar y encender la alimentación, mientras que el switch Cisco no tiene tal interruptor. Debemos conectarnos al puerto de consola con un cable de consola, luego desconectar el cable de alimentación en la parte trasera del switch, después de 10-15 segundos volver a conectarlo y presionar y mantener el botón MODE durante 3 segundos. Esto automáticamente llevará al switch al modo ROMmon. En este modo, debes inicializar el sistema de archivos en el flash y renombrar el archivo config.text, por ejemplo, a config.text.old. Si simplemente lo eliminas, el switch

¿Qué sucede con el switch? En el momento del reinicio, hace referencia al archivo de configuración config.text. Si no encuentra este archivo en la memoria flash del dispositivo, carga el IOS con la configuración por defecto. Esta es la diferencia: en el router debes cambiar la configuración del registro, mientras que en el switch solo necesitas cambiar el nombre del archivo de inicio de configuración. Veamos cómo sucede esto en el programa Packet Tracer. Esta vez conecto una laptop con un cable de consola al puerto de consola del switch.
No utilizamos la consola CLI del switch, sino que modelamos la situación en la que se puede acceder a la configuración del switch solo mediante una laptop. Estoy usando la misma configuración de terminal de la laptop que en el caso del router, y al presionar 'Enter', me conecto al puerto de consola del switch.
En Packet Tracer no puedo apagar y encender el cable de alimentación como lo haría con un dispositivo físico. Si tuviera la contraseña de la consola, podría reiniciar el switch, así que introduzco el comando enable password enable para asignar una contraseña local de acceso al modo privilegiado de la consola.
Ahora, si entro en la configuración, veré que el sistema solicita una contraseña que no conozco. Entonces, es necesario iniciar el reinicio del sistema. Como pueden ver, el sistema no reconoce el comando reload que proviene del dispositivo del usuario en el modo usuario, por lo que debo utilizar el modo privilegiado. Como dije, en la vida real simplemente desconectaría el cable de alimentación del switch durante unos segundos para provocar el reinicio, pero dado que no puedo hacer eso en el programa, debo eliminar la contraseña y reiniciar desde aquí. ¿Entienden por qué lo hago, verdad?

Así que cambio de la pestaña CLI a la pestaña 'Dispositivo físico', y cuando el dispositivo comienza a reiniciarse, mantengo presionado el botón virtual MODE durante 3 segundos y entro en el modo ROMmon. Ven que la información en la ventana CLI del switch es la misma que en la ventana de la pantalla de la laptop. Me dirijo a la laptop, en cuya ventana se muestra el modo ROMmon del switch, e introduzco el comando flash_init. Este comando inicializa el sistema de archivos en la memoria flash, tras lo cual introduzco el comando dir_flash para ver el contenido de la memoria flash.
Aquí hay dos archivos: el archivo del sistema operativo IOS con extensión .bin y el archivo config.text, que debemos renombrar. Para ello, utilizo el comando rename flash:config.text flash:config.old. Si ahora utilizo el comando dir_flash, puedo ver que el archivo config.text ha sido renombrado a config.old.

Ahora introduzco el comando reset, el switch se reinicia y después de iniciar el sistema vuelve a la configuración predeterminada. Esto se evidencia por el cambio del nombre del dispositivo en la línea de comandos de NwKingSwitch a simplemente Switch. En un dispositivo real existe el comando rename, pero en Packet Tracer no se puede utilizar. Por lo tanto, aplico show running conf, como pueden ver, el switch utiliza todas las configuraciones predeterminadas, y escribo el comando more flash:config.old. Aquí es donde entra el hack: solo deben copiar la configuración actual del dispositivo que aparece en pantalla, pasar al modo de configuración global y pegar la información copiada. En ideal, copiamos todas las configuraciones y pueden ver que el nombre del dispositivo ha cambiado y el switch ha vuelto al modo de operación normal.
Ahora queda copiar la configuración actual en la configuración de inicio, es decir, crear un nuevo archivo config.text. La forma más sencilla es simplemente renombrar el viejo archivo de nuevo a config.text, es decir, copiar el contenido de config.old en la configuración actual y luego guardarlo como config.text. Así es como se realiza la recuperación de la contraseña del switch.
Ahora analizaremos cómo realizar la copia de seguridad y la recuperación del sistema operativo Cisco IOS. La copia de seguridad consiste en copiar la imagen de IOS en un servidor TFTP. A continuación, les mencionaré cómo transferir el archivo de imagen del sistema de ese servidor a su dispositivo. El tercer tema es la recuperación del sistema en modo ROMmon. Esto puede ser necesario si su colega borró accidentalmente el IOS y el sistema dejó de iniciarse.

Veremos cómo obtener el archivo del sistema desde un servidor TFTP en modo ROMmon. Para ello, existen 2 métodos, uno de ellos es xmodem. Packet Tracer no soporta xmodem, así que brevemente les diré qué es, y luego mostraré con Packet Tracer cómo se utiliza el segundo método: la recuperación del sistema a través de TFTP.
En el diagrama se muestra el dispositivo Router0, al que se le ha asignado la dirección IP 10.1.1.1. Este router está conectado a un servidor con la dirección IP 10.1.1.10. He olvidado asignar una dirección al router, así que ahora lo haré rápidamente. Nuestro router no está conectado a la laptop, por lo tanto, el programa no permite usar la consola CLI, y tendré que corregir esto.
Estoy conectando mi laptop al enrutador con un cable de consola, el sistema solicita la contraseña de la consola, y utilizo la palabra console. En el modo de configuración global, asigno la dirección IP necesaria y la máscara de subred 255.255.255.0 a la interfaz f0/0 y añado el comando no shutdown.
A continuación, escribo el comando show flash y veo que hay 3 archivos en la memoria. El archivo número 3 es el más importante, es el archivo IOS del enrutador. Ahora necesito configurar el servidor TFTP, así que hago clic en el ícono del dispositivo Server0 y abro la pestaña SERVICES. Vemos que el servidor TFTP está activado y contiene archivos de muchos sistemas operativos de Cisco, incluido el IOS para nuestro enrutador c1841, que es el tercer archivo en la lista. Necesito eliminarlo del servidor porque voy a copiar otro archivo IOS de nuestro enrutador Router0. Para hacer esto, selecciono el archivo y presiono Remove file, y luego voy a la pestaña de la consola de la laptop.

Estando en la consola del enrutador, introduzco el comando copy flash tftp , y luego copio y pego el nombre del archivo del sistema operativo.

Luego, en el comando, se debe especificar la dirección o el nombre del host remoto al que se debe copiar este archivo. Al igual que al guardar la configuración de inicio del enrutador, aquí se debe ser cuidadoso. Si por error copia la configuración incorrecta en la de inicio, perderá todos los ajustes realizados después de reiniciar el dispositivo. De igual manera, en este caso no se deben confundir el origen y el destino. Así que primero especificamos el nombre del archivo que se debe copiar al servidor, y luego la dirección IP de ese servidor 10.1.1.10.

Ves que ha comenzado la transferencia del archivo, y si miras la lista de archivos TFTP, verás que en lugar del archivo remoto, ahora aparece el nuevo archivo IOS de nuestro enrutador. Así es como se realiza la copia del IOS al servidor.
Ahora volvemos a la ventana de configuración del enrutador en la pantalla de la computadora portátil e introducimos el comando copy tftp flash, especificando la dirección del host remoto 10.1.1.10 y el nombre del archivo fuente Source filename, es decir, el IOS que necesitamos copiar a la memoria flash del enrutador: c1841-ipbase-mz.123-14.T7.bin. Luego, se especifica el nombre del archivo de destino Destination filename, que en nuestro caso será exactamente el mismo que el nombre del origen. Después de esto, presiono "Enter", y el nuevo archivo IOS se copia a la memoria flash del enrutador. Ustedes ven que ahora tenemos dos archivos del sistema operativo: el nuevo con el número 3 y el anterior original con el número 4.

En la designación del IOS, la versión es importante para nosotros: en el primer archivo con el número 3 es 124, y en el segundo con el número 4 es 123, es decir, una versión más antigua. Además, advipservicesk9 indica que esta versión del sistema es más funcional que ipbase, ya que permite utilizar MPLS, entre otras cosas.
Otra posible situación es que accidentalmente haya borrado la memoria flash: escribo el comando delete flash y especifico el nombre del archivo IOS que se va a eliminar.
Pero antes de eso, quiero mencionar que ahora, por defecto, durante el arranque se utilizará el archivo del sistema con el número 3, es decir, c1841-advipservicesk9-mz.124-15.T1.bin. Supongamos que, por alguna razón, quiero que en el próximo arranque se utilice el archivo número 4 — c1841-ipbase-mz.123-14.T7.bin. Para ello, entro en el modo de configuración global y escribo el comando boot system flash: c1841-ipbase-mz.123-14.T7.bin.
Ahora, en el próximo arranque, este archivo se utilizará como el sistema operativo por defecto, incluso si tenemos dos sistemas operativos almacenados en la memoria flash.
Regresemos a la eliminación del sistema operativo y escribamos el comando delete flash: c1841-ipbase-mz.123-14.T7.bin. Después de esto, eliminaremos también el segundo sistema operativo con el comando delete flash: c1841-advipservicesk9-mz.124-15.T1.bin, así que el enrutador se quedará sin ambos sistemas operativos.
Si ahora escribo show flash, se puede ver que ahora no tenemos ningún sistema operativo. ¿Qué sucederá si doy el comando para reiniciar? Ustedes ven que, después de introducir el comando reload, el dispositivo pasa inmediatamente al modo ROMmon. Como dije, durante el arranque, el dispositivo busca el archivo del sistema operativo y, en su ausencia, pasa al sistema operativo básico rommon.
En el programa Packet Tracer no hay comandos xmodem que se pueden utilizar en un dispositivo físico real. Ahí introduces xmodem y añades las opciones necesarias para la carga del sistema operativo. Si usas el terminal SecureCRT, puedes hacer clic en el archivo, seleccionar la opción que realiza la transferencia y luego elegir xmodem. Después de seleccionar xmodem, eliges el archivo del sistema operativo. Supongamos que ese archivo está en tu portátil, entonces escribes xmodem, indicas ese archivo y lo envías. Sin embargo, xmodem es un proceso muy, muy lento, y la transferencia puede tomar de 1 a 2 horas dependiendo del tamaño del archivo.
El servidor TFTP funciona mucho más rápido. Como ya mencioné, no hay comandos xmodem en Packet Tracer, así que cargaremos el sistema con el comando tftpdnld, tras lo cual el sistema proporcionará indicaciones sobre cómo restaurar la imagen del sistema a través del servidor TFTP. Verás varios parámetros que deberás especificar para cargar el archivo del sistema operativo. ¿Para qué sirven estos parámetros? Deben usarse porque en el modo rommon, este enrutador no tiene la funcionalidad de un dispositivo con IOS completo. Así que primero debemos especificar manualmente la dirección IP de nuestro enrutador, usando el parámetro IP_ADDRESS=10.1.1.1, luego la máscara de subred IP_SUBNET_MASK=255.255.255.0, la puerta de enlace predeterminada DEFAULT_GATEWAY=10.1.1.10, el servidor TFTP_SERVER=10.1.1.10 y el archivo TFTP_FILE=c1841-advipservicesk9-mz.124-15.T1.bin.
Después de hacer esto, ejecuto el comando tftpdnld, y el sistema me pide que confirme esta acción porque todos los datos existentes en la memoria flash se perderán. Si respondo "Sí", verás que el color de los puertos de conexión entre el enrutador y el servidor ha cambiado a verde, lo que indica que está en proceso de copiar el sistema operativo desde el servidor.

Una vez que la carga del archivo se complete, uso el comando boot, después de lo cual comienza la descompresión de la imagen del sistema. Verás que después de esto el enrutador entra en un estado funcional, ya que se le ha devuelto el sistema operativo. Así es como se restaura la funcionalidad de un dispositivo que ha perdido su sistema operativo.
Ahora hablemos un poco sobre la licenciatura de Cisco IOS.

Antes de la versión 15, existían versiones anteriores de las licencias, como la 12, después de la cual se lanzó directamente la versión 15; no preguntes adónde fueron los números 13 y 14. Así que, cuando comprabas un dispositivo Cisco, con la funcionalidad básica de IOS IP Base, costaba, digamos, 1000$. Este era el precio mínimo del "hardware" con el sistema operativo instalado en la configuración base.
Supongamos que tu amigo quería que su dispositivo tuviera la funcionalidad avanzada de Advance IP Services, entonces el precio era, digamos, 10 mil dólares. Estoy mencionando cifras aleatorias, solo para que entiendas el principio. Si ambos tienen el mismo hardware, la única diferencia radica en el software instalado. Nada podría evitar que le pidieras a tu amigo una copia de su software, la instalaras en tu "hardware" y así ahorraras 9 mil dólares. Incluso si no tienes un amigo así, con el desarrollo actual de Internet, se puede descargar e instalar una copia pirata del software. Es ilegal, y no te recomiendo que lo hagas, pero la gente lo hace con frecuencia. Por eso, Cisco decidió implementar un mecanismo que previene tales manipulaciones, y desarrolló la versión IOS 15, que incluye licenciamiento.
En las versiones anteriores de IOS, como la 12.4, el nombre del sistema indicaba sus capacidades funcionales, por lo que al entrar en la configuración del dispositivo, podías identificarlas por el nombre del archivo del sistema operativo. De hecho, existían varios sistemas operativos de la misma versión, al igual que existen Windows Home, Windows Professional, Windows Enterprise, etc.
En la versión 15, solo existe un sistema operativo universal: Cisco IOSv15, el cual cuenta con varios niveles de licenciamiento. La imagen del sistema contiene todas las funciones, pero están bloqueadas y divididas en paquetes.
El paquete básico IP Base está activo de forma predeterminada, tiene una duración de por vida y está disponible para cualquiera que haya adquirido un dispositivo de Cisco. Los otros tres paquetes, Data, Unified Communication y Security, solo pueden activarse mediante una licencia. Si necesita el paquete Data, puede visitar el sitio web de la empresa, pagar una cierta cantidad y Cisco le enviará el archivo de licencia a su correo electrónico. Copie este archivo en la memoria flash de su dispositivo utilizando TFTP u otro método, después de lo cual todas las funciones del paquete Data se activarán automáticamente. Si necesita funciones avanzadas de seguridad, como cifrado, IPSec, VPN, cortafuegos, etc., debe adquirir una licencia para el paquete Security.
Ahora, con Packet Tracer, voy a mostrar cómo se ve esto. Voy a la pestaña CLI de la configuración del router e ingreso el comando show version. Puede ver que estamos ejecutando un sistema operativo de la versión 15.1, que es un sistema operativo universal que incluye todas las funcionalidades. Si desplaza la ventana hacia abajo, puede ver la información sobre la licencia.

Aquí se indica que el paquete ipbase es permanente y está disponible en cada arranque del dispositivo, mientras que los paquetes security y data no están disponibles porque en este momento el sistema no tiene las licencias correspondientes.
Para ver información detallada de la licencia, se puede usar el comando show license all. Además, se puede revisar los detalles de la licencia activa utilizando el comando show license detail. Las funciones de la licencia se pueden consultar con el comando show license features. Esta es una breve información sobre el sistema de licencias de Cisco. Usted visita el sitio web de la empresa, compra la licencia que necesita y carga el archivo de licencia en el sistema. Esto se puede hacer en el modo de configuración global con el comando license install.

Gracias por seguir con nosotros. ¿Te gustan nuestros artículos? ¿Quieres ver más material interesante? Apóyanos realizando un pedido o recomendándonos a tus conocidos, 30% de descuento para los usuarios de Habr en una alternativa única a los servidores de nivel de entrada, que hemos diseñado para usted: (disponibles opciones con RAID1 y RAID10, hasta 24 núcleos y hasta 40GB DDR4).
¿Dell R730xd a la mitad de precio? Solo aquí ¡en los Países Bajos! Dell R420 — 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB — ¡desde $99! Lee sobre cómo
Fuente: habr.com
