Saltar a contenido

Publicaciones

Mastering Bash - Redireccionamientos y tuberías

Un redireccionamiento, como su propio nombre indica lo que hace es una redirección a un determinado sitio. En nuestro caso, utilizaremos los redireccionamientos para gestionar tanto las salidas, como entradas así como los niveles de error que de un comando o una aplicación para utilizarlos en nuestro beneficio.

Podemos decirle a un comando, que si tiene un error X, no lo muestre en pantalla y lo rediriga a un archivo de texto para que haga de log. También podemos añadir una frase, sentencias... a un archivo ya existente o en caso de que no exista que lo cree; comentar el número de palabras que tiene un texto... y un sin fin de cosas más.

Operadores de redireccionamiento

Estos son los operadores que utilizaremos en la elaboración de scripts sobre todo, capítulo que introduciremos estos días con las siguientes entregas.

Operador Descripción
> Redirecciona una salida hacia un archivo o comando. Si el archivo no existe, lo crea, y si existe, lo sobreescribe
>> Igual que el anterior, pero si el archivo existe no lo destruye, añade la salida después de la última línea
< Redirecciona una entrada hacia un comando para que este emita una salida (si lo hace), puede ser la salida de un comando hacia otro, un fichero...
<< Redirecciona el contenido de un fichero hasta que se encuentre la palabra especificada en la redirección para finalizarla

Canales

Nuestra terminal tiene una serie de canales por los que se toman la entrada, salida y errores.

| Canal | Descripción | Ubicación | |-------|-------------|-----|------| | 0 | Es el canal por defecto de la entrada estándar | /dev/stdin | | 1 | Especifica la salida de un comando. Por ejemplo ls 2> file.txt | /dev/stdout | | 2 | Muestra la presencia de errores. Por ejemplo ls -lklk 3> error.txt | /dev/stderr | categories: ["Administración de sistemas"]


Estamos de vuelta

Bienvenidos a esta nueva entrega de Mastering en Bash, los que ya nos siguen de las anteriores espero que disfrutéis con este post, si acabas de acceder y no tienes ni idea de que va esto, puedes ver nuestro viejo post Primeros Pasos. En el siguiente post veremos que son los redireccionamientos y las tuberías antes de comenzar con scripting.

¿Qué es un redireccionamiento?

Un redireccionamiento, como su propio nombre indica lo que hace es una redirección a un determinado sitio. En nuestro caso, utilizaremos los redireccionamientos para gestionar tanto las salidas, como entradas así como los niveles de error que de un comando o una aplicación para utilizarlos en nuestro beneficio.

Podemos decirle a un comando, que si tiene un error X, no lo muestre en pantalla y lo rediriga a un archivo de texto para que haga de log. También podemos añadir una frase, sentencias... a un archivo ya existente o en caso de que no exista que lo cree; comentar el número de palabras que tiene un texto... y un sin fin de cosas más.

Operadores de redireccionamiento

Estos son los operadores que utilizaremos en la elaboración de scripts sobre todo, capítulo que introduciremos estos días con las siguientes entregas.

Operador Descripción
> Redirecciona una salida hacia un archivo o comando. Si el archivo no existe, lo crea, y si existe, lo sobreescribe
>> Igual que el anterior, pero si el archivo existe no lo destruye, añade la salida después de la última línea
< Redirecciona una entrada hacia un comando para que este emita una salida (si lo hace), puede ser la salida de un comando hacia otro, un fichero...
<< Redirecciona el contenido de un fichero hasta que se encuentre la palabra especificada en la redirección para finalizarla

Canales

Nuestra terminal tiene una serie de canales por los que se toman la entrada, salida y errores.

| Canal | Descripción | Ubicación | |-------|-------------|-----|------| | 0 | Es el canal por defecto de la entrada estándar | /dev/stdin | | 1 | Especifica la salida de un comando. Por ejemplo ls 2> file.txt | /dev/stdout | | 2 | Muestra la presencia de errores. Por ejemplo ls -lklk 3> error.txt | /dev/stderr |

Ejemplos

Almacenar la salida del comando ls -al en un fichero lista.txt:

ls -al > lista.txt

Veremos como no se muestra nada en pantalla, pero se ha creado el archivo lista.txt

Mostrar el contenido de lista.txt

cat lista.txt
total 568
drwxrwxr-x.  2 sincorchetes sincorchetes  4096 May  2 01:43 .
drwx------. 55 sincorchetes sincorchetes  4096 May  2 17:10 ..
-rw-rw-r--.  1 sincorchetes sincorchetes 25277 May  1 12:55 20E2MC8SVX-9423.png
-rw-rw-r--.  1 sincorchetes sincorchetes 25277 May  1 12:55 36712GXM3C-865.png
-rw-rw-r--.  1 sincorchetes sincorchetes 25277 May  1 12:55 4SASA426RU.png
-rw-rw-r--.  1 sincorchetes sincorchetes 25277 May  2 01:43 5ODFPGZXOI-25637.png
-rw-rw-r--.  1 sincorchetes sincorchetes 25277 May  2 01:43 5PYBWDCZWK.png
-rw-rw-r--.  1 sincorchetes sincorchetes 25277 May  1 12:55 6A21WJKHWL.png

NOTA: Recordemos que el operador > sobreescribe todo lo que haya, si queremos añadir información nueva al archivo debemos utilizar el operador >>

ls -al >> lista.txt
cat lista.txt
total 568
drwxrwxr-x.  2 sincorchetes sincorchetes  4096 May  2 01:43 .
drwx------. 55 sincorchetes sincorchetes  4096 May  2 17:10 ..
-rw-rw-r--.  1 sincorchetes sincorchetes 25277 May  1 12:55 20E2MC8SVX-9423.png
-rw-rw-r--.  1 sincorchetes sincorchetes 25277 May  1 12:55 36712GXM3C-865.png
-rw-rw-r--.  1 sincorchetes sincorchetes 25277 May  1 12:55 4SASA426RU.png
-rw-rw-r--.  1 sincorchetes sincorchetes 25277 May  2 01:43 5ODFPGZXOI-25637.png
-rw-rw-r--.  1 sincorchetes sincorchetes 25277 May  2 01:43 5PYBWDCZWK.png
-rw-rw-r--.  1 sincorchetes sincorchetes 25277 May  1 12:55 6A21WJKHWL.png
-rw-rw-r--.  1 sincorchetes sincorchetes 25277 May  2 01:43 6FG92BUEDM-12977.png
-rw-rw-r--.  1 sincorchetes sincorchetes 25277 May  2 01:43 A6XZFBO1TK-18309.png
-rw-rw-r--.  1 sincorchetes sincorchetes 25277 May  2 01:43 FBEBPAR2O9-16637.png
-rw-rw-r--.  1 sincorchetes sincorchetes 25277 May  2 01:43 FP9EZ05Y3E-16753.png
-rw-rw-r--.  1 sincorchetes sincorchetes 25277 May  1 12:55 FZRD6D42BI-875.png

Guardar todos los errores que surjan en la ejecución del programa

cat ks 2> error.txt

No se mostrará nada en pantalla, pero nos daremos cuenta el error que nos da cat(1) en el fichero que se ha creado llamado error.txt

cat error.txt
cat: jk: No such file or directory

Mostrar en pantalla tanto la salida estándar como los errores

ls -al 2>&1 info.txt

Guardar en un fichero tanto la salida como los errores

ls -al 2>&1 info.txt > file.txt

Calcular las líneas que tiene un fichero de texto

wc -l < file.text

Añadir información a un fichero e interrumpirlo utilizando una palabra clave declarada por el usuario

cat add << EOF

Crear un fichero de texto utilizando la canal de entrada y utilizando una palabra clave para finalizar la adicción

cat > create_text.txt << EOF

Adherir la salida estándar de múltiples textos y redireccionándolos a un archivo

cat lista.txt error.txt info.txt create_text.txt > salida_multiple

Tuberías

Una tubería es una secuencia de uno o más comandos separados por operadores de control como | o &. Suelen utilizarse mucho junto con el comando grep(1), egrep(1) y fgrep(1) para filtrar resultados, o el comando cut(1) para recortar la salida estándar, generalmente producida por comandos. Estos comandos que hemos mencionado les dedicaremos un post especial debido a la importancia de los mismos. Sobre todo cuando demos scripting más adelante.

Este es el formato de una tubería común:

comando [+parámetros] | ó & [comando1]

Ejemplos

Ejemplos basándonos en esta estructura de directorios:

.
├── fichero-0
├── fichero-1
├── fichero-10
├── fichero-11
├── fichero-12
├── fichero-13
├── fichero-14
├── fichero-15
├── fichero-16
├── fichero-17
├── fichero-18
├── fichero-19
├── fichero-2
├── fichero-3
├── fichero-4
├── fichero-5
├── fichero-6
├── fichero-7
├── fichero-8
└── fichero-9

Mostrar un valor relacionado con dmesg(1)

dmesg |grep Bluetooth

[   23.265232] Bluetooth: Core ver 2.22
[   23.265247] Bluetooth: HCI device and connection manager initialized
[   23.265250] Bluetooth: HCI socket layer initialized
[   23.265251] Bluetooth: L2CAP socket layer initialized
[   23.265256] Bluetooth: SCO socket layer initialized
[   24.078796] Bluetooth: hci0: read Intel version: 370810225019140f18
[   24.078797] Bluetooth: hci0: Intel device is already patched. patch num: 18
[   35.047963] Bluetooth: BNEP (Ethernet Emulation) ver 1.3
[   35.047967] Bluetooth: BNEP filters: protocol multicast
[   35.047974] Bluetooth: BNEP socket layer initialized
[   85.419671] Bluetooth: RFCOMM TTY layer initialized
[   85.419675] Bluetooth: RFCOMM socket layer initialized
[   85.419722] Bluetooth: RFCOMM ver 1.11
[60146.891379] Bluetooth: hci0: read Intel version: 370810225019140f00
[60147.826024] Bluetooth: hci0: Intel Bluetooth firmware file: intel/ibt-hw-37.8.10-fw-22.50.19.14.f.bseq
[60148.097374] Bluetooth: hci0: Intel firmware patch completed and activated
[60151.506132] Bluetooth: hci0: command 0x0c56 tx timeout

Mostrar un valor relacionado con la salida del comando lspci(8)

lspci |grep VGA
00:02.0 VGA compatible controller: Intel Corporation Device 591b (rev 04)

Referencias

Mastering en Bash - Trabajando con textos

En esta entrega vamos a ver como trabajar con textos en Bash, tenemos una serie de comandos para trabajar con ellos que nos ayudarán cuando estemos avanzando en nuestra senda por este querido mundo que es el Software Libre.

Comando less(1)

Este comando se utiliza mucho para visualizar textos desde el principio. Nos podemos olvidar de hacer un cat(1) y empezar a subir la parrafada bien con un scroll en una terminal gráfica o bien haciendo uso de Shift + Page Up/Page Down.

Su funcionamiento es sencillo, simplemente con las teclas de dirección podemos orientarnos en el texto. No obstante, veremos el funcionamiento de algunos atajos del teclado:

Métodos abreviados Descripción
j ó Desplaza una línea hacia delante o una cantidad "N"
k ó Desplaza una línea o una cantidad N hacia atrás
SPACE Desplaza un conjunto de muchas líneas o varios conjuntos hacia delante
b Igual que el anterior, pero desplazándolas hacia detrás
Desplaza la mitad del ancho de una pantalla o N posiciones
Desplaza la mitad del ancho de una pantalla o N posiciones (solo valido si se utiliza
F Actuando como tail -f
/ Permite buscar coincidencias

Aquí podemos ver el funcionamiento de less(1) en acción:

Comando more(1)

Este comando es parecido a less(1), lo que pasa es que se diferencia sobre todo en su apariencia como el cuadro de ayuda que es distinto pero la finalidad llega a ser la misma, mostrar texto. Comentamos los atajos de teclado más utilizados:

Métodos abreviados Descripción
+ Espacio Desplaza una línea hacia delante o una cantidad "N"
+ z Desplaza una línea o una cantidad N hacia atrás
SPACE Desplaza un conjunto de muchas líneas o varios conjuntos hacia delante
= Muestra la línea actual
/cadena Encuentra coincidencias
n Salta a la siguiente coincidencia
! Permite ejecutar un comando en una subshell
/ Inicia el editor vi(1) en la línea actual
:f Muestra el nombre del fichero y número de línea actual

Por aquí tenemos a more(1) un poco en acción:

Comando tail(1)

Este comando suele utizarse para mostrar salidas vivas en la terminal, es decir, si tenemos un archivo que constantemente se actualiza como pueden ser los logs, este nos permite ver a tiempo real los cambios producidos entre otras muchas más cosas.

En principio, si se ejecuta sin ningún parámetro o modificador, este devolverá un determinado número de líneas, unas 10 por defecto.

Veremos los modificadores más comunes:

Parámetros Descripción
-n N Modifica el límite de líneas a mostrar
-v Muestra el título del fichero como una cabecera
--version Muestra el número de versión

Comando tail en acción:

Comando head(1)

head(1) nos permite visualizar las 10 primeras líneas de la parte superior de los archivos, lo contrario a tail(1) y su funcionamiento es parecido, tanto que se pueden utilizar los parámetros de tail(1) para su uso.

Visualizando a head(1):

Comando wc(1)

Este es muy utilizado para contar líneas, decimales o bytes, suele combinarse con tuberías para obtener resultados y utilizarlos en condicionales por ejemplo. Veamos como funciona.

Parámetros Descripción
-c Imprime los recuentos de bytes de una salida o fichero
-m Recuentos de caracteres
-l Muestra el número de líneas calculado de un archivo o salida
-L Imprime el número de la línea más larga
-w Recuento de palabras

Veamos como funciona:

Comando tr(1)

Este comando nos permitirá intercambiar caracteres por otros o eliminarlos desde una salida. Por ejemplo, vamos a modificar la salida de una línea: head -n 3 /proc/kallsyms | tr 0 K

Nos dará un resultado como este:

KKKKKKKKKKKKKKKK A irq_stack_union
KKKKKKKKKKKKKKKK A __per_cpu_start
KKKKKKKKKKKKKKKK A cpu_debug_store

Si no queremos reemplazar el caracter y simplemente eliminarlo:

head -n 3 /proc/kallsyms | tr -d 0

Obtendremos una salida como esta:

 A irq_stack_union
 A __per_cpu_start
 A cpu_debug_store

Si queremos trabajar con caracteres especiales, podemos hacerlo.

Tenemos mucha info en el man 1 tr que nos puede ayudar.

Comando cut(1)

Este comando es uno de los más potentes, con el se hacen auténticos scripts, ya que nos permite eliminar secciones de ficheros o salidas.

Por ejemplo, si queremos obtener las variables declaradas en el archivo /etc/os-release

cut -f 1 -d "=" /etc/os-release

O si queremos que nos devuelvan los datos:

cut -f 2 -d "=" /etc/os-release

Podemos hacer combinaciones entre dos comandos para que nos devuelva exclusivamente los valores de las variables sin entrecomillado de este archivo.

cut -f 2 -d "=" /etc/os-release | tr -d '\"'

Básicamente cuando se utiliza el parámetro -f + NUM, es porque queremos escoger los resultados que se encuentren dentro de la columna número X y se utiliza con el modificador -d CARÁCTER para poder partir el resultado, si no no sirve de nada.

Fuentes

  • manpages

Mastering CSS - Primeros pasos

CSS proviene del inglés Cascade Style Sheet traducido al español como hoja de estilos en cascada que como su nombre propio indica, le atribuye estilo como colores, formas, bordes, dimensiones a determinados elementos o un conjunto de elementos de una página elaborada con lenguaje de etiquetado HTML.

¿Por qué CSS y no CSS3?

CSS ha tenido varias versiones a lo largo de los años, CSS2 según el portal de documentación Mozilla Developer, necesitó de 9 años para su estandarización desde agosto del 2002 hasta junio del 2011. Con lo que hace lento su normalización. Sin embargo, adaptaremos el contenido para la última pre-versión.

Reglas

En el CSS tenemos lo que se llaman reglas con las que estilizar los elementos del documento Web. Estas reglas están formadas por un selector que es un elemento Web como puede ser un anclaje (<a>); un párrafo (<p>), una tabla (<table>)... una propiedad que puede ser común para muchos elementos como color para un texto, anclaje... y un valor que suele determinarse según lo que tengamos que declarar en la propiedad, ya sean píxels, porcentajes, números y texto...etc Tanto la propiedad como el valor, van incluídos dentro de llaves {}

| Selector |
  --------           Valor
     |           | -------- |
     body {            |
        font-family: Sans;
        -----------
             |
         Propiedad

     }

NOTA: Se pueden añadir tantas propiedades como uno quiera, o el selector lo permita.

Prioridad

Cuando nosotros declaramos una regla a un elemento padre que engloba a muchos hijos tipo body. Todos los elementos heredarán las propiedades junto con el valor y se representarán como tal (siempre que el elemento lo permita). Sin embargo, cuando hacemos reglas específicas, siempre prevalecerán las específicas sobre las general. Por ejemplo, si tenemos un body con un color de fondo en negro, y párrafos con un fondo rojo. Los párrafos utilizarán de fondo el color rojo que se interpreta aquí como un subrayado.

Maneras de introducir CSS

Existen 3 formas de enmaquetación Web con las hojas de estilo que pueden alternarse entre sí, pero es preferible escoger 1, y a ser posible la última de todas estas. Más que nada por legibilidad del código y la propia separación de los demás lenguajes de marcas como es HTML del de programación Web como Javascript entre otros. 1. Etiqueta <style> 2. Atributo style="" 3. Fichero separado .css

Etiqueta <style>

Esta etiqueta se añade al elemento <head></head> la etiqueta <style></style> en la cuál, declararemos nuestro código CSS.

Ejemplo:

<head>
    <style>
        body {
            background-color: black;
            color: green;
            font-family: Sans;
        }
    </style>
</head>

Atributo style=""

Se le puede designar a un elemento un estilo más específico como un atributo.

Por ejemplo:

<body>
    <h1>Cuando éramos jóvenes</h1>
    <p style="color:brown"> Correteábamos en la playa con un cubito que llenábamos de agua del mar para hacer nuestros castillos más fuertes, mientras que otros en otras zonas de la península....</p>
</body>

Fichero separado .css

Sin duda alguna, esta es la mejor forma de enmaquetar una paǵina Web. Tener un directorio en nuestro proyecto llamado css/ al que añadir todas nuestras hojas de estilo personalizadas sin tener que buscar dentro de 1000 líneas de css.

Para incluirna en nuestra Web, bastará con añadir la siguiente etiqueta en <head></head>

<link rel="stylesheet" href="css/example.css">

Pongámos un ejemplo:

/var/www/html/mi_pagina
|
|-- doc.html
|-- css/
     |
     |-- example.css

doc.html

<!DOCTYPE html>
<html>
    <head>
        <title>Mi primera página Web</title>
        <meta author="Álvaro Castillo">
        <meta keywords="web, html5, css">
        <link rel="stylesheet" href="css/example.css">
    </head>
    <body>
        <h1>Cuando éramos jóvenes</h1>
        <p> Correteábamos en la playa con un cubito que llenábamos de agua del mar para hacer nuestros castillos más fuertes, mientras que otros en otras zonas de la península....</p>
    </body>

example.css

body {
    background-color: yellow;
    font-size: 20px;
}
p {
    font-family: Sans;
    color: cyan;
}

El resultado: * Fondo en todo el body de color amarillo. * Tamaño fuente general para todos los elementos de la página a tamaño 20 * Tipo de familia de la tipografía que utilizarán los párrafos es Sans. * Color de las letras de todos los párrafos utilizará el color Azul Cian.

Enmaquetación básica

A continuación veremos algunas propiedades con las que podremos jugar con diferentes elementos.

Fuentes

Las fuentes son muy importantes para el diseño de nuestro proyecto. No solo porque le otorgamos un cierto caracter y estilo, sino porque también ayudaremos al lector a poder comprenderlo y sobre todo qué sencación de seguridad podemos darle. Recordemos que las fuentes influyen en el punto de vista del lector que pueden determinar insconcientemente algunos sentimientos como bien se recoge en algunos artículos de la psicología de la tipografía.

Tamaño de letra

Cuando queremos modificar el tamaño de las fuentes de nuestro documento, nos encontramos con una propiedad clave como font-size. Esta nos permite asignar un valor que se puede declarar como %, unidades de longitud, una cadena como valor y/o em.

  • Los porcentajes tienden muchas veces a fallarnos y a no comportarse como uno quiere ya que los navegadores no los interpretan igual, mencionar que está disponible para utilizarse pero que no son recomendados.
  • Por otro lado, tenemos diferentes medidas de longitud como los píxeles (px), centímetros (cm)...
    • Una medida interesante es el em, es un tamaño relativo de fuente. Si utilizamos 2 ems quiere decir que equivale 2 veces el tamaño de la fuente actual. Suele utilizarse mucho en diseños "responsive"
  • medium, xx-small, small, large, x-large, xx-large, initial, inherit...: Son valores no numéricos que predefinen el tamaño de una fuente.
Colores

Los colores pueden mostrase de diversas formas y diferentes esquemas del color: * Palabras clave * Esquema RGB * Esquema HSL * Canales alfa

Palabras clave

Éstas contienen un código hexadecimal que ya interpreta el navegador directamente a pesar de ser un código hexadecimal encubierto no requiere más que utilizar la palabra clave para su uso. * cyan: Azul Cian * pink: Rosa * yellow: Amarillo * brown: Marrón * blue: Azul

Y así un sin fin más, podemos ver una lista completa a través de la página de la w3.

RGB

Red Green Blue es un modelo de color que trabaja con los colores primarios, y que a su vez, la mezcla de estos generan diferentes colores aplicando una intensidad de color diferente en cada uno de estos 3 colores. Este modo de color pueden llegar a crear 16.7 millones de colores solo haciendo uso de estos 3 colores. Para poder darle un valor, se utiliza numeración decimal que va desde el 255 (saturación máxima de colores) hasta el 0 (ausencia total de color), o bien, mediante representación hexadecimal completa o abreviada.

Color Valor decimal Valor hexadecimal Hexadecimal abreviado
Rojo 255 0 0 ##FF0000 #FF0
Verde 0 255 0 ##00FF00 #0F0
Azul 0 0 255 ##0000FF #00F

NOTA: En el artículo anterior, explicamos como pasar de decimal a hexadecimal o viceversa. La representación abreviada del hexadecimal, solo puede hacerse si coinciden las 3 primeras cifras de cada color. F= Rojo, F=Verde, F=Azul

HSL

HSL o Hue, Saturation, Lightness es un modo de color basado en matriz, saturación y luminosidad. La matriz comprende un valor entre 0 y/o 360 refiriéndose a los grados en los que rotará en el espectro de colores. Mientras que la saturación y el brillo tiene una relación en porcentajes comprendidos entre 0 y 100.

Canales alfa

El canal alfa se añadió en CSS3 como una mejora para añadir cierto efecto a las fuentes añdiendo un grado de transparencia tanto para el modo de color RGB como para el HSL, eso sí, no podemos declararlo en valores hexadecimales.

Propiedades

Aquí dejamos una lista con algunas propiedades y sus valores para trabajar con el texto:

  • font-size: px|%|small,large...: Permite establecer el tamaño de la fuente mediante:
    • Unidad de longitud (px, cm, em...)
    • Porcentaje
    • Palabras clave como medium, small, large...
  • font-family; a,b,c,d...: Permite definir que tipografía utilizar, y sobre todo, en caso de que no la tenga el sistema o no se descargue bien de un CDN, mostrar la siguiente fuente especificada.
  • font-style; normal|italic|oblique: Muestra como se verá la fuente:
    • normal: Formato limpio
    • italic: Tipo itálica, en HTML sería lo equivalente a -> <em></em>
    • oblique: Parecido a itálica, pero con otro estilo
  • font-weight: normal|bold: Permite añadir negrita o no
  • color: valor:: Establece un valor para la fuente:
    • RGB => Hexadecimal: #000000
    • RGB => Hexadecimal abreviado: #000
    • RGB => Decimal: rgb(rrr,ggg,bbb)
    • RGB => Decimal con canal alfa: rgba(rrr,ggg,bbb,A)
    • HSL => hsl(grados,%,%)
    • HSL => Con canal alfa: hsla(grados,%,%,A)
  • background-color:: Establece un subrayado en la fuente parecido al que utilizamos para recalcar lo importante en los libros, se pueden declarar los mimos valores de la propiedad color.

Finalizando

En las siguientes entregas hablaremos sobre la teoría de las cajas, modificar vistas en relación a la resolución de pantalla, jugar con los selectores y frameworks más utilizados.

¡Un saludo!

Fuentes

Wikipedia W3 Mozilla Developer Portal LenguajeCSS CSS3 banner

Mastering HTML5

HTML proviene de las siglas en inglés HyperText Markup Language, traducido al español "Lenguaje de etiquetas de Hipertexto". Es un lenguaje (no de programación) interpretado que principalmente se caracteriza por el uso de unas "etiquetas". Estas permiten generar y organizador una serie de elementos que se representarán dentro de una página Web.

Funcionamiento

El código que se escribe será interpretado por un navegador Web como es el caso de Google Chrome, Mozilla Firefox, Opera, Microsoft Edge. Estos exploradores leerán lo que se ha escrito, lo interpretará y lo representará dentro de nuestro documento Web en cuestión de milisegundos.

Sintaxis

El 95% de las etiquetas empiezan siempre empiezan y acaban con elemento que queramos representar en el documento Web.

<h1>Ejemplo de encabezado</h1>, esto representará un encabezado con un tamaño de fuente superior al resto de encabezados y con un sombreado añadido.

Sin embargo, existen etiquetas que contienen el nombre del elemento junto con una serie de atributos pero sin mencionar el nombre del elemento en el cierre. <input type="button">, esta etiqueta por ejemplo generará un tipo de elemento de información de entrada en modo botón.

   Atributo     Contenido
   ________     _________
     |              |
<p attr="valor">Texto ej</p>
---      -----           ---
 |                        |
 |      Etiquetas         |
 __________________________

Además, veremos cómo las etiquetas configuran un árbol de familias padre-hijo ya que pueden anidarse indefinidamente.

Tipos de atributo

Existen una serie de atributos globales estandarizados para los elementos de nuestro documento que nos permiten definir eventos como cuando pulsemos un clic que haga una determinada acción (esto es en relación con JavaScript que veremos más adelante), identificación de un elemento como único como es el caso del atributo id... podemos encontrar una lista de estos atributos aquí

Por otro lado, también existen tributos sin valor como podemos destacar placeholder, controls... de los cuáles hablaremos de ellos más tarde.

Etiquetas

<!DOCTYPE html> Nos permite definir que lenguaje de etiquetas debe interpretar el navegador. En este caso comunicamos al explorador que debe interpetar la versión 5 de HTML.

<html></html> Constituye el comienzo y final del documento, si el contenido junto con los elementos se encuentran fuera de estas etiquetas, nos arriesgamos a que los navegadores no logren interpretarlo.

Nota: El atributo lang="" permite definir el idioma del documento, si es español deberá llevar como valor "es", si es Francés, "fr" y viceversa. Más información en la página de la w3

<head></head> Permite definir una cabecera en nuestro documento en el cual, le otorgamos cierta información descriptiva al mismo con el uso de las siguientes etiquetas: <title></title>: Define el título del documento, este lo veremos representado en el título de la pestaña y de la ventana del explorador Web.

Las etiquetas <meta> Estas permiten definir la información tanto del autor como palabras clave, descripción, codificación...

<meta author="Nombre del autor"> <meta keywords="Palabras, clave``<meta description="Descripción del documento"> <meta charset="utf-8">

Etiquetas opcionales <link>: Es una etiqueta muy utilizada cuando se quiere vincular una hoja de estilos elaborada con CSS3. Las hojas de estilos permiten añadir determinados diseños personalizados para cada elemento de nuestro documento Web. Tienen una sintaxis propia que explicaremos más adelante.

<body> La etiqueta <body></body> permite definir el cuerpo de nuestro documento Web. Aquí añdiremos todos los elementos con los que el usuario interactuará como es el caso de los párrafos, imágenes, videos, enlaces...etc

<footer></footer> Este elemento es el último dentro del documento Web que estemos redactando, permite añadir un pie de página al documento con la información que nosotr@s estimemos oportuna.

Comentarios

Los comentarios nos permiten puntualizar determinadas partes del código para explicar que sirve, anotar cómo hemos llegado hasta ahí o simplemente salvarnos de una metedura de pata. Muchas personas no hacen uso de los comentarios arriesgandose sobre todo en un proyecto en el que hay más personas involucradas frene productivamente su desarrollo.

Para comentar simplemente tendremos que utilizar estos caracteres <!-- para la apertura y --> para el cierre.

<!-- -->

Estilizando

Todos los elementos poseen una serie de atributos por defecto sobre su estilo que pueden modificarse aplicando una serie palabras clave que se basan en un lenguaje de estilos llamado CSS que veremos en los siguientes posts.

Con él, podemos definir un fondo de pantalla mucho más vistoso, modificar el tamaño y familia de la tipografía que queremos utilizar, modificar la posición de los elementos...

Para poder modificar los estilos se pueden hacer de 3 maneras. * Etiqueta * Añadiendo la etiqueta <style></style> dentro del elemento <head></head> * Atributo de un elemento * <div style="background-color:black"></div> * Hoja referenciada * Adjuntando en <head></head> un enlace a una hoja de estilos de la siguiente manera: <link rel="stylesheet" href="ruta_absoluta_o_relativa_de_la_hoja_de_estilos.css">

La norma de un buen desarrollador es, nunca mezclarás. Con esto queremos decir, que debemos escoger siempre la 3 opción ya que es más legible para los demás y para uno mismo, ya que si no funciona determinado estilo y tenemos todos ellos desperdigados por los elementos, nos volveríamos loc@s para encontrarlos.

Encabezados

Los encabezados nos permiten pre-formatear un texto con un sombreado y un tamaño específico. Nos permiten describir el contenido que vamos a comentar. Un ejemplo sencillo son los titulares de un periódico.

Otorgando estilo al texto

Existen hasta 6 tipos de encabezados:

Encabezado

<h1>Encabezado 1</h1>

Encabezado 2

<h2>Encabezado 2</h2>

Encabezado 3

<h3>Encabezado 3</h3>

Encabezado 4

<h4>Encabezado 4</h4>

Encabezado 5

<h5>Encabezado 5</h5>

Encabezado 6

<h6>Encabezado 6</h6>

Párrafo

Nos permiten representar el contenido en forma de párrafos. Esto genera un salto de línea cada vez que lo definimos. <p></p>

Énfasis dentro de un párrafo

Si queremos destacar un determinado contenido dentro de un párrafo, utilizaremos la etiqueta <span></span>.

Separadores de contenido

Cuando queremos representar un contenido debidamente estructurado y organizado no lo podemos representar solamente con etiquetas que den formato al contenido. Necesitaremos unas etiquetas que nos permitan representar el contenido como queramos.

Para esto se inventaron los div's. La palabra proviene del inglés "division" o lo que es lo mismo, un contenedor que divide la página en secciones. Estas secciones son muy útiles para agrupar elementos en un documento HTML.

Con la llegada de HTML5 los divs cobran un significado semántico y ahora tenemos las siguientes etiquetas: * <header></header>: Dónde especificamos qué añadir en la cabecera de la página, el equivalente en el viejo estándar es <div class="header"></div> Divs en HTML5{.right} * <nav></nav>: Utilizado para generar una barra de navegación, en el viejo estándar sería <div class="menu"></div>

  • <section></section>: Representa una sección general dentro de un documento. Antes se hacía uso de <div class="content"></div>

  • <article></article>: Se utiliza para representar un artículo, que si se anidan, quiere decir que todos los artículos estarán relacionados con el artículo padre. Antes se utilizaba, <div class="article"></div>

  • <aside></aside>: Se considera un elemento independiente del contenido ya que se suele utilizar para elaborar barras laterales, elementos publicitarios...

  • <footer></footer>: Añadimos un pie de págin al documento. <div id="footer"></div>

Matizando el contenido

Se puede añadir ciertos matices al contenido mediante las siguientes etiquetas: * <em>: Permite mostrar el texto en cursiva * <strong>: Añade un énfasis en negrita * <u></u>: Subrayado de texto * <strike></strike>: Tacha el texto * <sup></sup>: Crear un texto con formato de exponente * <sub></sub>: Crea un texto con formato de texto más bajo y más pequeño.

Salto de línea

Si queremos añadir un espacio entre elementos, se puede llevar a cabo haciendo uso de <br>. También podemos añadirlo dentro de un párrafo y dividirlo sin afectar la posición completa del mismo con respecto al resto de elementos.

<p>Esto es un ejemplo de un párrafo que dividiremos en dos. <br> Se visualizará un salto de línea dentro de este párrafo</p>

Listas

En HTML tenemos a disposición 2 tipos de listas, una lista ordenada con la que tendremos ítems organizados por números y por otro lado, una lista sin ordenar con otros tipos de símbolos para representar a los ítems de la lista.

Lista sin orden

Para elaborarla utilizamos <ul> "unordered list" </ul> junto con los ítems <li></li> "list items".

Por ejemplo, categoría de Frutas con algunas de ellas:

<ul>
    <li>Pomelo</li>
    <li>Fresa</li>
    <li>Melocotón</li>
</ul>
  • Pomelo
  • Fresa
  • Melocotón

Lista ordenada

Para construirla utilizamos la etiqueta <ol></ol> además de <li></li> para definir los ítems.

ToDo, tareas que hacer

<ol>
    <li>Hacer la comida</li>
    <li>Desfragentar Windows</li>
    <li>Instalar Antivirus Windows</li>
</ol>
  1. Hacer la comida
  2. Desfragentar Windows
  3. Instalar Antivirus Windows

Vínculos

Los vínculos permiten conectar una página con otra, pueden utilizarse rutas relativas o absolutas siempre y cuando el fichero exista. <a href="https://www.echemosunbitstazo.es">Echemos un bitstazo</a>

<a> proviene del inglés "anchor" que en español quiere decir "ancla".

Hay un atributo que es bastante útil y muy utilizado para definir el comportamiento del enlace. Este atributo recibe el nombre de target. Es muy útil sobre todo para los visitantes que quieran consultar una información enlazada en el documento sin tener que perderlo de vista. Para abrir el enlace en una nueva ventana, se hace uso del atributo target="_blank". Tambien tenemos los valores: * _self: Acción por defecto, se abre la página en la misma página * _parent: Se abre el documento a cuerpo completo en una ventana * framename: Se abre el documento en un frame

Creando un anclaje

Podemos enlazar varios contenidos en el mismo documento. Una de las utilidades es la construcción de un índice a partir de los encabezados de título.

Especificamos en un encabezado el id, y mediante una lista, generamos un enlace que apunte hacia ese id seguido de almohadilla.

<body>
    <ol>
        <li><a href="#intro">Introducción</a></li>
        <li><a href="#howto">¿Cómo hacerlo?</a></li>
        <li><a href="#resources">Fuentes</a></li>
    </ol>
    <h1 id="intro">Introducción</h1>
    <p>Lorem Ipsum</p>
    <h1 id="howto">¿Cómo hacerlo?</h1>
    <p> Ipsum Lorem</p>
    <h1 id="resources">Fuentes</h1>
    <p>LoIpSum</p>
</body>

Botón

Se puede añadir un botón. <button>Texto a mostrar</button>

Nos puede servir cuando desarrollemos en JavaScript que cada vez que pulsemos el botón ocurra algo como en el siguiente ejemplo:

Imágenes

Para añadir imágenes tipo .jpeg, .png, .jpg, .gif... tenemos que utilizar la etiqueta <img src="ubicación.img" />. El valor que recibirá el atributo SRC es la URL de la imagen que puede añadirse desde una rula relativa o absoluta.

Hay un atributo específico que se utiliza para aquellas personas que tengan dificultades en la visión o no puedan ver directamente, existen "lectores de pantalla" que leen el texto generando un audio para que puedan escuchar cuál es el contenido del documento.

¿Pero cómo lee una imagen un "lector de pantalla"?

No la lee, básicamente toma el valor del atributo, que en este caso suele ser una descripción y se lo comunica a la persona que accedió al documento.

<img src="ubicación.img" alt="Paseo de Gracia"/> Problema con la imagen

En caso de que falle la carga de la imagen, también podemos leer la descripción, o si situamos el cursor encima de ella.

Por otro lado permite mejorar el SEO (Search Engine Optimization) ya que los motores de búsqueda como Google no pueden indexar las imágenes, no las lee directamente y utilizan este atributo para tener una descripción y así posicionar mejor tu sitio.

Añadiendo un video

Antaño, para añadir un video al sitio Web, necesitamos tener un reproductor que estaba elaborado en Adobe Flash Player y rezar porque funcionase. Sin embargo, con el tiempo, esto se ha solucionado implementando la etiqueta <video></video>

Esta etiqueta requiere del atributo src que apunte a la fuente del video. Se puede forzar la resolución del video utilizando los atributos: * width: Para el ancho en píxeles * height: Para la altura también en píxeles

Para especificar el MIME-type del video, se utiliza el atributo type="x/y". type="video/mp4". Un MIME-type es básicamente informar al documento del tipo de contenido que se quiere mostrar. Aquí tienes una lista con multitud de tipos

Por último el atributo controls que no posee un valor alguno, permite mostrar los controles del reproductor.

Está muy bien añadir como contenido dentro de la etiqueta video (que como hemos visto queda vacía) un texto que comente "Video no soportado", para que aquella persona que espere a ver el video comprenda que su navegador no lo soporta.

Añadiendo un audio

Exactamente se añade igual como el video solo que cambia la etiqueta <video> por <audio> y que por obligación, hay que especificar el atributo controls, si no, no funcionará a pesar de haberlo encontrado en su ruta.

Tablas

Si queremos organizar la información en tablas, simplemente tendremos que utilizar las siguientes etiquetas:

  • <table></table>: Construye una tabla.
  • <thead></thead>: Define el encabezado de la tabla.
  • <th></th>: Se incluye dentro de la etiqueta <thead></thead> para definir el nombre de las columnas
  • <tbody></tbody>: Define el contenido que irá en la tabla
  • <tfoot></tfoot>: Pie de la tabla
  • <tr></tr>: Define una nueva fila, requerido para thead,tbody, tfoot
  • <td></td>: Se utiliza para definir el contenido de las celdas que van dentro de <tbody> y <tfoot>

Un ejemplo más sencillo:

Cabecera tabla C1 Cabecera tabla C2 Cabecera tabla C3
Celda F1:C1 Celda F1:C2/td> Celda F1:C3
Celda F2:C1 Celda F2:C2/td> Celda F2:C3
Pie de tabla C1 Pie de tabla C2 Pie de tabla C3

Y representada en forma de código:

<table>
    <thead>
        <tr>
            <th>Cabecera tabla #1</th>
            <th>Cabecera tabla #2</th>
            <th>Cabecera tabla #3</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>Celda F1:C1</td>
            <td>Celda F1:C2</td>
            <td>Celda F1:C3</td>
        </tr>
        <tr>
            <td>Celda F2:C1</td>
            <td>Celda F2:C2</td>
            <td>Celda F2:C3</td>
        </tr>
    </tbody>
    <tfoot>
        <tr>
            <td>Pie de tabla</td>
            <td>Pie de tabla</td>
            <td>Pie de tabla</td>
        </tr>
    </tfoot>
</table>

Añadiendo espacio

Se puede añadir un espacio en las columnas cuando no hay contenido que representar mediante el atributo colspan="x" en un <td> ó <th>, donde X es un número entero.

No obstante, también podemos hacerlo en las filas con el atributo rowspan="y", dónde y es un valor entero.

Formularios

En HTML se nos permite generar formularios para recoger datos.

NOTA: No mostraremos en esta misma página los inputs, porque dan lugar conflictos con estilo y JS, sin embargo, hemos añadido el mismo código con la descripción en el servicio "JSFiddle" que puedes acceder desde aquí. Solo hay que pulsar en RUN y en la parte inferior derecha aparecerá una pequeña ventana con el código resultante.

<form></form>: Creamos los formularios y los cerramos de la siguiente forma. Esta etiqueta posee una serie de atributos muy especiales como es method="" y action="". * method="": Especificamos el encabezado HTTP que queramos utilizar, existen 5, pero comentaremos los 3 más utilizados: * GET: Los datos que se envían se pueden ver a través del campo URL del explorador. Se suele utilizar para obtener información de un servidor de un recurso específico. * POST: Los datos se envían como si fuera un modelo de caja negra, no se ven. Este método se suele utilizar para enviar información al servidor y que este sea recepcionado por un lenguaje o sistema de fondo. * PUT: Muy común para subir archivos.

  • action="": Define a qué ruta enviar la información, si hay un fichero que lo trata del lado del servidor elaborado con PHP, Ruby on Rails.. o que sea procesado con JS mediante un AJAX... mil posibilidades.

Etiqueta

Esta etiqueta se utiliza para asociar un control de un formulario y se vincula con un input, este provee de una breve descripción. Este hace uso de un atributo llamado for cuyo valor es el id del input.

Por ejemplo:

Elementos del formulario

Un formulario no es un formulario solo por tener una etiqueta que lo defina, si no tenemos una serie de elementos que nos permitan interactuar con la persona que se encuentra detrás de la pantalla, poco podemos hacer con él.

Información tipeada

Los siguientes elementos nos permiten recoger información escrita por el usuario.

  • Permite recoger texto en una sola línea. <input type="text">
  • Recuadro ajustable de texto en el que se puede visualizar lo escrito en múltiples líneas. <textarea></textarea>
  • Campo tipo input que tiene una validación que no permite al usuario enviar la información si no inserta una dirección mail válida. <input type="email">
  • Elemento del formulario que permite verificar si la URL introducida es correcta, sin embargo, en aquellos navegadores que no soporten este campo se tornará en un input tipo texto. <input type="url">
  • Campo tipo text con opciones adicionales como un icono con el que se puede eliminar lo previamente escrito además de soportar (según el navegador) un pequeño historial de búsqueda realizada. <input type="search">
  • Elemento del formulario en un navegador de escritorio no se aprecia la diferencia, pero si utilizamos un smartphone o un dispositivo móvil. A la hora de escribir, el teclado se alternará mostrando únicamente el "dial pad". <input type="tel">

Fecha y hora

Si queremos recoger campos de fecha y de hora, utilizaremos:

  • Permite establecer una fecha. <input type="date">
  • Permite escoger un mes del año y muestra el año del mes seleccionado. <input type="month">
  • Muestra la semana seleccionada y muestra el año de la semana seleccionada. <input type="week">
  • Permite seleccionado una fecha (MM/DD/YYYY) y además, hora (HH:MM:SS)<input type="datetime-local">
  • Muestra la hora en formato 12H y la hora asignada. <input type="time">

Opciones y/o elecciones

Los siguientes elementos a nuestra disposición para seguir recolectando datos de usuario:

  • Representa una casilla para marcar múltiples opciones, muy útil para representar las famosas casillas de "Acepto..." o múltiples subscripciones. <input type="checkbox">
  • Opción única dentro de un conjunto de opciones múltiples. <input type="radio">
  • Permite seleccionar un valor representado en una barra y que devuelve un número entero. <input type="range">

Select

Los select son inputs que agrupan opciones que se muestran a través de una lista desplegable cuando se quiere escoger una opción.

Su sintaxis es:

<select>
    <option></option>
</select>

Una de las diferencias importantes del select es que el atributo value no se asigna en <select></select>, si no que se asigna en cada una de las opciones.

También se puede definir una opción por defecto utilizando un atributo sin valor llamado default.

<select name="select">
    <option value="1">Opción #1</option>
    <option value="2">Opción #2</option>
    <option value="3" selected>Opción #3</option>
</select>

Otros input

Estos inputs son especiales ya que el usuario no marca casillas, elige opciones, o escribe en recuadros de texto.

  • Envía un fichero para su posterior procesamiento. <input type="file">
  • Permite seleccionar una imagen. <input type="image">
  • Lo que se conoce como "Color picker" o selector de color, permite seleccionar un color y obtener un código hexadecimal (RGB). <input type="color">
  • Añade un input con un valor X oculto en el formulario: <input type="hidden">
  • Suprime toda información contenida en los campos del formulario: <input type="reset">

Enviando datos

Para poder enviar los datos del formulario necesitaremos un input que actúe de botón y los pueda enviar. También se pueden utilizar otros elementos y hacer el envío mediante JS, pero eso se verá en otros posts.

  • <input type="submit"> Enviando datos:

Se puede modificar el mensaje de "Submit" utilizando el atributo value: <input type="submit" value="Enviar">

Atributos adicionales

Podemos añadir ciertos atributos que nos pueden ser útiles a la hora de verificar que el usuario realmente va a enviar información y no la envía vacia, también podemos añadir una pequeña descripción dentro del input para que el usuario se percate que tipear. Algunos de estos atributos son característicos porque no es necesario que se le asigne un valor.

  • Evitar que el usuario envíe información vacía required.
  • Añadir una descripción placeholder="Descripción"
  • Deshabilitar la edición del input readonly
  • Deshabilitar un input disabled
  • Especificar tamañado del input size=X
  • Definir el límite de caracteres permitido maxlength=X
  • Establecer el primer input al que introducir información autofocus
  • Establecer valores máximos y mínimos max=X y min=Y

Hay muchos más atributos aquí

Fuentes:

Mastering Squid - Instalación

¡Bievenido al Mastering en Squid! Este es un curso extendido sobre cómo utilizar Squid dividido en varios posts para facilitar la lectura y ser más organizados. Advertimos que va a ser un curso bastante largo, y que puedana provecharlo al máximo. Disfruten del primer post, la instalación.

Squid logo

¿Qué es un proxy?

Es un software que permite facilitar la comunicación entre un cliente y un servidor sin modificar peticiones o respuestas. Cuando nosotros iniciamos una petición hacia una fuente para obtener algo, el proxy lo que hace es "secuestrar" esa conexión y representarse así mismo como un cliente de cara al servidor. Una vez devuelta la respuesta, esta llega al proxy y depende de sus políticas, esos datos quedan guardadados o se borran, y posteriormente se envía al cliente que solicitó los datos desde el principio.

Por lo tanto, actúa también como un potente filtro de peticiones basado en una serie de reglas que validen o no las peticiones que se vayan a realizar. Si por ejemplo, intentamos entrar a chachacha.com, y resulta que en la configuración del proxy se nos deniega el acceso, evidentemente, el proxy nos betará la conexión a dicha página con lo que se mejora la seguridad de la red mediante esta serie de políticas. También incrementa la defensa contra virus o malware ya que al analizar el tráfico puede ver si los sitios son o no de confianza.

Y no sólo por filtra el tráfico evitando que usuarios X accedan a sitios que no deben, o porque el proxy tiene una IP y la usaremos en vez de relevar la nuestra (en caso de ser remoto), también es útil, porque la información que solicitamos se almacena haciendo un "caching" permitiéndonos no tener que volver a descargar todo el contenido de una página Web, con lo que hace el acceso más rápido y reduciendo el consumo ancho de banda. Además, esto permite visualizar el tráfico que se está enviando y recibiendo, y si el consumo de ancho de banda es elevado, podemos darle un toque a los usuarios de que se están pasando de la ralla.

Y por último, si tenemos un servidor Web al que accede constantemente a CDNs para obtener documentos, imágenes, frameworks basados en JS, CSS3, HTML...etc, puede mantener todo almacenado y evitar incrementar el ancho de banda por petición, con lo que mejora el propio rendimiento del servidor web.

¿Qué es un proxy inverso?

Es una técnica que permite almacenar los archivos que se obtienen de CDN o de otros sitios remotos para almacenarlos en el servidor web local, con lo que, como hemos dicho anteriormente, aprovechar el ancho de banda para otros servicios de la red, gestionar bien el espacio de almacenamiento y evitar problemas de sobrecarga en el servidor.

Esta técnica es muy útil principalmente por el ahorro de ancho de banda, y como consecuencia, los clientes que se conecten al servidor web evitaran tener que enviar muchas peticiones a multitud de sitios (CDN mayormente) para obtener librerías JS, estilos CSS3...etc, ya que está almacenado en el proxy permitiendo reducir su gasto en datos móviles.

Instalando Squid

En este apartado, encontraremos los pasos para poder instalar Squid en nuestra distribución, sistema. También incluimos los pasos de cómo compilar Squid en caso de que las características que busquemos no formen parte de los binarios pre-compilados.

Fedora

Para instalar Squid en Fedora, tan solo tenemos que ejecutar:

$ su -c "dnf install squid"

Archlinux

En esta fantástica distro:

$ sudo pacman -S squid

Que se encuentra en los repositorios "Community"

Ubuntu/Debian

Corremos en una terminal:

$ sudo apt-get install squid

openSUSE

Tan sencillo cómo:

$ sudo zypper in squid

CentOS / RHEL

$ sudo yum install squid

NOTA: Si ya tienes instalado Squid, es mejor que te saltes el siguiente punto.

Compilando

En otras distribuciones que no mencionamos, siempre es mejor utilizar las fuentes oficiales, en caso de que no sea posible o que queramos tener ciertas caracterísiticas habilitadas, tendremos que compilar.

  1. Descargar el archivo fuente
  2. Instalar dependencias necesarias para compilar el paquete
  3. Configurar las opciones de compilación
  4. Compilar e instalar
  5. Probar

Descargamos el tarball desde el siguiente enlace, lo descomprimimos y nos situamos en el directorio mediante una terminal.

Configurando las opciones de compilación

Aquí tenemos un listado enorme explicando un poco las opciones que podemos configurar en Squid:

--prefix=DIR

Como no, definimos el directorio dónde lo queremos instalar.

--enable-gnuregex

Esta característica permite habilitar las expresiones regulares cuando se construyen listas de control de acceso en Squid. En principio no hace falta habilitarlo, solo en aquellos sistemas que no soporten expresiones regulares.

--disable-inline

Cuando compilamos Squid por defecto, lo hace todo en línea y esto conlleva compilar todo el código. Sin embargo, si queremos que el proceso sea veloz pero para usarlo en un entorno de pruebas, podemos utilizar esta opción.

--disable-optimizations

Squid se compila por defecto con optimizaciones para generar un binario con mayor rendimiento. Esta opción al igual que la anterior es mejor dejarla solo para casos en desarrollo o pruebas.

--enable-storeio

Cuánto más rápido Squid pueda leer/escribir archivo desde caché, menos tardará en satisfacer una solicitud dando menos retrasos. Existen diferentes técnicas que permiten obtener un rendimiento más optimizado según el tipo de tráfico y el uso. Podemos construir Squid con varios tipos de módulos de almacenamiento de entrada/salida.

Podemos echarle un bitstazo a los módulos soportados ubicados en el directorio src/fs del código fuente de Squid.

--enable-removal-policies

Squid al estar almacenando páginas o documentos que se descargan cuando navegamos, es lógico que cada cierto tiempo tenga problemas con el espacio que hemos especificado y por lo tanto, necesitará más espacio. Squid decide que hacer con los archivos viejos si deberían eliminarse o limpiarlos para obtener más espacio y almacenar nuevos archivos. Hay diferentes políticas para limpiar los documentos almacenados en caché para obtener un mejor rendimiento.

Las políticas están basadas en heap (basadas en montículos, estructura de árbol de datos) y/o en listas de datos estructurados. Las listas de datos estructurados están habilitadas por defecto. Podemos comprobar en el código fuente src/repl/ las políticas disponibles.

--enable-icmp

La habilitamos sÓlo si utilizamos otras soluciones que almacenen datos en caché, ya que permiten determinar latencia entre ellas.

--enable-delay-pools

Permite limitar el ancho de banda de la red para que no se congestione. Es útil cuando tenemos un grupo de usuarios que efectúan multitud de operaciones sobre cuando descargan archivos que suelen saturar completamente el tráfico. Squid hace uso de unos "espacios de retardo", filtra el tráfico y reduce la velocidad para que no se utilice todo el ancho de banda disponible.

--enable-esi

Permite a Squid utilizar Edge Side, un tipo de lenguaje de marrcas para definir los componentes de una página web para construirlos de forma dinámica y hacerlos llegar a las aplicaciones web en el borde de Internet. Si se habilita, Squid ignorará el control de almacenamiento por cabecera desde los clientes. Esta opción solo interesa si está en modo acelerador.

--enable-useragent-log

Permite registrar qué tipo de navegador está utilizando

--enable-referer-log

Squid podrá escribir un campo de encabezado de referencia en solicitudes HTTP

--disable-wccp

Esta opción deshabilita la compatibilidad con el protocolo (WCCP) de comunicaciones de servidores de almacenamiento en caché Web de Cisco. Permite la comunicación entre cachés y a su vez, ayuda a localizar el tráfico. Por defecto, está habilitada.

--disable-wccpv2

Deshabilita la versión 2 del protocolo anterior. Este es una versión mejorada que permite balanceo de carga, escalamiento, tolerancia a fallos, y un servicio con mecanismos de garantías. Por defecto está habilitado.

--disable-snmp

Simple Network Management Protocol (SNMP) está habilitado por defecto y lo suelen utilizar los administradores de sistemas para monitorizar servidores o dispositivos de red como switches o routers.

--enable-cachemgr-hostname

El gestor de Caché (cachemgr.cgi) es una utilidad elaborada en CGI para gestionar la caché de Squid, también permite ver las estadísticas a través de un portal web. Por defecto podemos acceder al portal web mediante localhost o la IP de nuestro Squid.

--enable-arp-acl

Squid soporta la construcción de Listas de Control de Acceso por dirección MAC o Ethernet. Esta característica está deshabilitada por defecto. Si queremos controlar el acceso a los clientes basándonos en direcciones Ethernet, tenemos que habilitar esta características.

--disable-htcp

El protocolo HTCP (Hypertext Caching Protocol) puede utilizarlo Squid para enviar y recibir actualizaciones periódicas de software que almacene en caché. Esta opción deshabilita.

--enable-ssl

Squid pueden terminar con las conexiones SSL. Cuando se configura Squid en modo inverso, puede terminar con las conexiones SSL que hayan iniciado los clientes y manejarlas en nombre del servidor web en el back-end. Eso quiere decir, que el servidor Web en el backend como Apache con PHP, NGINX... no tiene que hacer trabajos de SSL, por lo que la conexión entre servidor web-Squid será en HTTP limpio, mientras que los clientes verán que acceden en modo seguro. Solo es útil si está configurado en modo inverso o en modo acelerador.

--enable-cache-digests

Los resúmenes periódicos es la manera que tiene Squid para compartir información con otros servidores Squid acerca de los documentos web, en un formato comprimido.

--enable-default-err-language

Cuando no se puede acceder a una determinada página ya sea porque ha obtenido un error 404, o 503... Squid utiliza páginas predeterminadas para mostrar dichos errores en el idioma X. Por defecto son inglesas.

--enable-err-languages

Por defecto, Squid se compila con soporte a múltiples idiomas. Si solo queremos utilizar algunos, o uno en cuestión, podemos definirlo aquí.

--disable-http-violations

Deshabilitar las violaciones del protocolo HTTP, no permitir X los paquetes con la cabecera modificada se acepten por Squid.

--enable-linux-netfilter

Netfilter es un framework de filtrado de paquetes que apareció en los kernels 2.4.x y 2.6.x. Esta opción solo es útil si utilizamos un proxy transparente en sistemas Linux.

--enable-follow-x-forwarder-for

Cuando Squid envía una solicitud HTTP, Squid rellena con su IP el encabezado, sin embargo, añade información sobre el cliente para que se pueda encontrar si se usan más servidores proxy.

--disable-ident-lookups

Evita que Squid busque las identidades de los clientes, sin embargo, esto puede causar un DoS (Denial Of Service) si un cliente hace muchas peticiones largas de conexiones.

--disable-internal-dns

Deshabilitamos su propio sistema de Dirección de Resolución de Nombres, y utilizar DNS externos.

--enable-default-hostfile

Seleccionamos la ruta por defecto del fichero /etc/hosts(5)

--enable-auth

Provee de mecanismos de autenticación.

Sintaxis vieja

Habilitar sistemas de autenticación:

./configure --enable-auth=basic,digest,ntlm

Nueva sintaxis La sintaxis que vamos a ver ahora es para seleccionar el esquema de autenticación que queremos utilizar. En este apartado hay programas de autenticación externos que nos pueden ayudar durante el proceso.

--enable-auth-basic

Habilita la compatibilidad con un esquema de autenticación básica y construye listas de software específicos necesarios en la compilación. Si la lista de software no se provee, habilitará por defecto todos los software. Hay una lista que contiene todos ellos en helpers/basic_auth Para deshabilitar esta opción: --disable-auth-basic

Si no queremos habilitar esta opción, pero no queremos compilar ningún ayudante, utilizamos "none".

--enable-auth-ntlm

Squid soporta el esquema de autenticación llamado NTLM. Los ayudantes para este esquema específico reside en el directorio helpers/ntlm_auth Para deshabilitarlo: --disable-auth-ntlm

--enable-auth-negotiate

Esta opción permite utilizar un esquema de negociación.

--enable-auth-digest

Permite utilizar el esquema de autenticación de resumen.

--enable-ntlm-fail-open

Permite a un ayudante fallar en el proceso de autenticación de un usuario. Es mejor que no utilicemos esta opción según la documentación.

--enable-external-acl-helpers

Permite utilizar listas de control de acceso externas. Las podemos encontrar aquí helpers/external_acl

--disable-translation

Deshabilita que se muestren páginas de error en el idioma local.

--disable-auto-locale

Se basa en la cabecera de peticiones en un cliente. Squid intenta de forma automática proveer de una página de error con el idioma local. Esto lo deshabilita.

--disable-unlinkd

Deshabilita el soporte unlinkd No es buena idea si se queda bloqueado el software.

--with-default-user

Squid corre por defecto como usuario nobody . Podemos seleccionar con que usuario correrlo.

--with-logdir

Squid almacena los logs en /var/log/squid, aquí podemos modificar la ruta de almacenado.

--with-pidfile

Modifica la ruta en la que se almacenará el .pid

--with-aufs-threads

Definimos el número de hilos que queremos que utilice el sistema de almacenamiento en caché llamado aufs. No se suele utilizar esta opción, Squid ya lo calcula.

--without-pthreads

Las versiones más viejas se compilan sin el soporte paralelo de POSIX. Por defecto las nuevas versiones se compilan con pthreads por defecto.

--with-openssl

Si queremos construir Squid con soporte OpenSSL, podemos utilizar esta opción:

--with-large-files

Squid registra todo y los ficheros de /var/log/ especialmente los de acceso, crecen muy deprisa. Esto permite soportar los archivos pesados.

--with-filedescriptors

Los sistemas operativos utilizan descriptores de ficheros (números enteros) para seguirle la pista a los ficheros y sockets que estén abiertos. Por defecto, el límite en las conexiones normalmente es 2014. Una vez que Squid tiene conexiones aceptadas que tienen consumido todos los ficheros descriptores disponibles para el usuario Squid, no puede aceptar más conexiones si no cuando se liberen más ficheros descriptores.

Para saber qué límite tenemos:

ulimit -n

Para añadir más, hay que añadir las siguientes líneas: /etc/security/limits.conf(5)

username hard nofile 8192
username soft nofile 8192

Aplicando opciones de configuración

Una vez que tengamos nuestra lista de características, procedemos a aplicarlas en la fase de pre-compilado.

./configure --prefix=/usr --disable-wccp --disable-wccpv2 --disable-snmp --enable-arp-acl --disable-htcp --enable-ssl --enable-cache-digests --enable-default-err-language=Spanish --enable-linux-netfliter --disable-ident-lookups --disable-internal-dns --enable-default-hostsfile --with-default-user=squid --with-openssl --with-large-files

Compilamos e instalamos

Básicamente efectuaremos la compilación de squid(8)

NOTA: Podemos hacer uso de los hilos para que la compilación vaya más rápida make -jN dónde N, va el número total de núcleos + hilos, ejemplo 2 núclos, 4 hilos = make -j6

$ make && sudo make install clean

Y ya lo tendremos instalado en nuestro sistema.

Crear el servicio

Creamos un nuevo archivo en /etc/systemd/system/squid.service con el siguiente contenido:

[Unit]
Description=Squid
After=network.target

[Service]
ExecStartPre=/usr/libexec/squid/cache_swap.sh
ExecStart=/usr/sbin/squid -f /etc/squid/squid.conf
ExecReload=/usr/sbin/squid -k reconfigure -f /etc/squid/squid.conf
ExecStop=/usr/sbin/squid -k shutdown -f /etc/squid/squid.conf

NOTA: Sustituimos los directorios /usr... por aquel dónde se instaló.

Gestionando el servicio

Iniciar el servicio temporalmente:

$ sudo systemctl start squid.service

Parar el servicio momentáneamente:

$ sudo systemctl start squid.service

Reiniciar Squid:

$ sudo systemctl restart squid.service

Habilitar Squid al inicio:

$ sudo systemctl enable squid.service

Deshabilitar el servicio:

$ sudo systemctl disable squid.service

Gestionando el firewall con FW

Para permitir las conexiones al proxy de forma temporal en firewalld(1) bastará con ejecutar:

$ sudo firewall-cmd --add-port 3128/tcp --zone=public

Permitir conexiones de forma permanente:

$ sudo firewall-cmd --add-port 3128/tcp --zone=public --permanent

Para eliminar la apertura del puerto de forma temporal

$ sudo firewall-cmd --remove-port 3128/tcp --zone=public

Eliminarlo de forma permanente

$ sudo firewall-cmd --remove-port 3128/tcp --zone=public --permanent

Eso es todo

Windows

Existe una versión portada para Windows elaborada por un tercero, una empresa llamada Diladele BV, ubicada en Amsterdam. Se puede obtener desde aquí. NOTA: Si encontramos algún fallo en el instalador, podemos reportarlo a través de este git

Instalando

Una vez descargado, lo instalamos y seguimos los pasos a continuación.

[owl-carousel items=1 margin=10 loop=true autoplay=true autoplayHoverPause=true nav=true] [/owl-carousel]

Configuración, puertos y más

Podemos ver en el escritorio cómo se nos han creado 2 iconos de escritorio relacionados con Squid. "Squid Console" y "Squid Server Tray", el primero nos permite interactuar con el servidor a través de una cmd.exe y el segundo, nos permite arrancar el servidor en modo silencioso, es decir, minimizado en el área de notificación o bandeja del sistema.

Si hacemos clic derecho en el icono de Squid en la bandeja del sistema, tendremos una serie de opciones como: * Editar el fichero de configuración * Ver la carpeta de Squid * Iniciar el servicio * Parar el servicio * Acerca de * Salir

[owl-carousel items=1 margin=10 loop=true autoplay=true autoplayHoverPause=true nav=true] Iconos creados por el instalador de Squid Directorio de instalación Archivo de configuración [/owl-carousel]

Tenemos que revisar que Squid arranca como servicio en Windows, para ello hay que ejecutar el programa services.msc y mirar las propiedades de "Squid" tal y como se muestra en la siguiente imagen:

Squid services.msc

Por defecto Squid utiliza el puerto 3128, por ende, tenemos que habilitarlo en el firewall de Windows "Inicio-> En el buscador escribimos-> Firewall Windows". FW Básico de Windows

Si queremos modificar el puerto por defecto, tendremos que editar el fichero de configuración de Squid que se encuentra en C:\Squid\etc\squid.conf, en la directiva

Port 3128

Cambiarla por el puerto que queramos, y posteriormente, tenemos que dirigirnos a "Inicio -> Buscar Configuración avanzada del FW Windows -> Reglas de entrada -> Modificar Squid Cache Server" y poner el puerto que queramos, tal y como se ve en la imagen.

Configurando el puerto

Posteriormente, reiniciamos el servidor Squid desde la bandeja del sistema y ya tendremos Squid funcionando con el nuevo puerto que le hemos asignado.

Referencias

Mastering Squid - ACL

Bienvenid@s a la segunda parte de este "Mastering in Squid", en esta parte del curso, os explicaremos qué son las listas de control de acceso una parte de las directivas de Squid, para qué se utilizan y cómo utilizarlas, no nos lo podemos perder.

¿Qué son las ACL?

Las ACL (Access Control List) o en español Listas de Control de Acceso es un concepto de seguridad informática que utiliza para fomentar la separación de privilegios, en nuestro caso, ayudará a separar url, ips o nombres de máquinas para posteriormente hacer algo con ellas, como por ejemplo, en un instituo, permitir el acceso a redes sociales a los profesores, pero no a los ordenadores de los alumnos...

¿Cómo definimos las ACL?

Existen dos tipos de sintaxis, en línea o apuntando a un archivo. * En línea: Es más cómodo cuando apuntamos 2,3 datos, más se puede volver ilegible y engorroso.

acl nombre_de_lista tipo_acl dato1 dato2 dato3
  • Apuntando a un archivo: Se utiliza cuando apuntamos más de 3 datos, se permiten comentarios.

    acl nomnre_de_lista tipo_acl "/DIRECTORIO/ARCHIVO"

¿Qué tipos de ACL tenemos?

Tenemos multitud de ellos como:

  • arp [DIRECCION_MAC]: Crea una ACL con una o varias dirección(es) MAC.
  • _Notas:
    • No funciona con todos los sistemas operativos, según la documentación trabaja correctamente con Linux, Solaris, Windows, FreeBSD y otras variantes de BSD.
    • Squid solo puede determinar la dirección MAC/EUI para clientes IPv4 que se encuentren en la misma subred, si están en otras subredes Squid no puede reconocer qué equipo es.
    • El protocolo IPv6 no contiene ARP, se utiliza ND (Neighbor Discovery) que es parecido, con lo que esta directiva no funciona para IPv6._
  • clientside mark[/mask] -Esta aplicación hay que investigarla
  • srcdomain .google.es: Permite definir un dominio o dirección IP/direcciones origen
  • dstdomain dirección_destino: Puede ser una url, ip o conjunto de direcciones ips.
  • srcdom_regex \.google\.*: Igual que srdomain pero con la opción de usar expresiones regulares.
  • dstdom_regex \.google\.*: Especifica dirección destino haciendo uso de expresiones regulares.
    • src_as number
    • dst_as number
  • time [DIA DE LA SEMANA] [HORA1]-[HORA2]: Establece un periodo de conexión:
    • Se define la semana como:
      • M -> Lunes
      • T -> Martes
      • W -> Miércoles
      • H -> Jueves
      • F -> Viernes
      • A -> Sábado
    • Se define la HORA1 y HORA2 como: hh:mm
  • url_regex ^http://: Permite bloquear urls haciendo uso de expresiones regulares.
  • urllogin [^a-zA-Z0-9]: Busca una expresión regular que coincida con un campo login
  • urlpath_regex \.exe(\?.*)?$: Encuentra un directorio y permite filtrar contenido
  • port 80 70 120: Permite definir un puerto o varios, se permiten rangos destino TCP
  • localport 3128: Puerto de cliente TCP conectado a
  • myportname 3128: Refleja si los detalles de conexión TCP equivalen al puerto declarado en el fichero de configuración de Squid.
  • proto HTTP FTP...: Se pueden bloquear protocolos como FTP para que no se pueda acceder.
  • method GET PUT POST: Especifica si se puede utilizar o no los métodos de solicitud del protocolo HTTP.
  • http_status 404 200: Especifica el código de respuesta del servidor
  • browser Mozilla: Especifica el navegador al que bloquear o no, se identifica mediante el UserAgent.
  • referer_regex regexp: Permite encontrar un patrón relacionado con la expresión regular que definimos, es muy difícil de aplicar, por lo que hay que tener cuidado.
  • ident cadena: Busca una cadena
  • ident_regex patrón: Busca una cadena relacionada con lo declarado.
  • acl aclname proxy_auth [-i] username: ... acl aclname proxy_auth_regex [-i] pattern ... # perform http authentication challenge to the client and match against # supplied credentials [slow] # # takes a list of allowed usernames. # use REQUIRED to accept any valid username. # # Will use proxy authentication in forward-proxy scenarios, and plain # http authenticaiton in reverse-proxy scenarios # # NOTE: when a Proxy-Authentication header is sent but it is not # needed during ACL checking the username is NOT logged # in access.log. # # NOTE: proxy_auth requires a EXTERNAL authentication program # to check username/password combinations (see # auth_param directive). # # NOTE: proxy_auth can't be used in a transparent/intercepting proxy # as the browser needs to be configured for using a proxy in order # to respond to proxy authentication.

    acl aclname snmp_community string ... # A community string to limit access to your SNMP Agent [fast] # Example: # # acl snmppublic snmp_community public

    acl aclname maxconn number # This will be matched when the client's IP address has # more than TCP connections established. [fast] # NOTE: This only measures direct TCP links so X-Forwarded-For # indirect clients are not counted.

    acl aclname max_user_ip [-s] number # This will be matched when the user attempts to log in from more # than different ip addresses. The authenticate_ip_ttl # parameter controls the timeout on the ip entries. [fast] # If -s is specified the limit is strict, denying browsing # from any further IP addresses until the ttl has expired. Without # -s Squid will just annoy the user by "randomly" denying requests. # (the counter is reset each time the limit is reached and a # request is denied) # NOTE: in acceleration mode or where there is mesh of child proxies, # clients may appear to come from multiple addresses if they are # going through proxy farms, so a limit of 1 may cause user problems.

    acl aclname random probability # Pseudo-randomly match requests. Based on the probability given. # Probability may be written as a decimal (0.333), fraction (1/3) # or ratio of matches:non-matches (3:5).

    acl aclname req_mime_type [-i] mime-type ... # regex match against the mime type of the request generated # by the client. Can be used to detect file upload or some # types HTTP tunneling requests [fast] # NOTE: This does NOT match the reply. You cannot use this # to match the returned file type.

    acl aclname req_header header-name [-i] any.regex.here # regex match against any of the known request headers. May be # thought of as a superset of "browser", "referer" and "mime-type" # ACL [fast]

    acl aclname rep_mime_type [-i] mime-type ... # regex match against the mime type of the reply received by # squid. Can be used to detect file download or some # types HTTP tunneling requests. [fast] # NOTE: This has no effect in http_access rules. It only has # effect in rules that affect the reply data stream such as # http_reply_access.

    acl aclname rep_header header-name [-i] any.regex.here # regex match against any of the known reply headers. May be # thought of as a superset of "browser", "referer" and "mime-type" # ACLs [fast]

    acl aclname external class_name [arguments...] # external ACL lookup via a helper class defined by the # external_acl_type directive [slow]

    acl aclname user_cert attribute values... # match against attributes in a user SSL certificate # attribute is one of DN/C/O/CN/L/ST or a numerical OID [fast]

    acl aclname ca_cert attribute values... # match against attributes a users issuing CA SSL certificate # attribute is one of DN/C/O/CN/L/ST or a numerical OID [fast]

    acl aclname ext_user username ... acl aclname ext_user_regex [-i] pattern ... # string match on username returned by external acl helper [slow] # use REQUIRED to accept any non-null user name.

    acl aclname tag tagvalue ... # string match on tag returned by external acl helper [fast] # DEPRECATED. Only the first tag will match with this ACL. # Use the 'note' ACL instead for handling multiple tag values.

    acl aclname hier_code codename ... # string match against squid hierarchy code(s); [fast] # e.g., DIRECT, PARENT_HIT, NONE, etc. # # NOTE: This has no effect in http_access rules. It only has # effect in rules that affect the reply data stream such as # http_reply_access.

    acl aclname note [-m[=delimiters]] name [value ...] # match transaction annotation [fast] # Without values, matches any annotation with a given name. # With value(s), matches any annotation with a given name that # also has one of the given values. # If the -m flag is used, then the value of the named # annotation is interpreted as a list of tokens, and the ACL # matches individual name=token pairs rather than whole # name=value pairs. See "ACL Options" above for more info. # Annotation sources include note and adaptation_meta directives # as well as helper and eCAP responses.

    acl aclname adaptation_service service ... # Matches the name of any icap_service, ecap_service, # adaptation_service_set, or adaptation_service_chain that Squid # has used (or attempted to use) for the master transaction. # This ACL must be defined after the corresponding adaptation # service is named in squid.conf. This ACL is usable with # adaptation_meta because it starts matching immediately after # the service has been selected for adaptation.

    acl aclname transaction_initiator initiator ... # Matches transaction's initiator [fast] # # Supported initiators are: # esi: matches transactions fetching ESI resources # certificate-fetching: matches transactions fetching # a missing intermediate TLS certificate # cache-digest: matches transactions fetching Cache Digests # from a cache_peer # htcp: matches HTCP requests from peers # icp: matches ICP requests to peers # icmp: matches ICMP RTT database (NetDB) requests to peers # asn: matches asns db requests # internal: matches any of the above # client: matches transactions containing an HTTP or FTP # client request received at a Squid *_port # all: matches any transaction, including internal transactions # without a configurable initiator and hopefully rare # transactions without a known-to-Squid initiator # # Multiple initiators are ORed.

    acl aclname has component # matches a transaction "component" [fast] # # Supported transaction components are: # request: transaction has a request header (at least) # response: transaction has a response header (at least) # ALE: transaction has an internally-generated Access Log Entry # structure; bugs notwithstanding, all transaction have it # # For example, the following configuration helps when dealing with HTTP # clients that close connections without sending a request header: # # acl hasRequest has request # acl logMe note important_transaction # # avoid "logMe ACL is used in context without an HTTP request" warnings # access_log ... logformat=detailed hasRequest logMe # # log request-less transactions, instead of ignoring them # access_log ... logformat=brief !hasRequest # # Multiple components are not supported for one "acl" rule, but # can be specified (and are ORed) using multiple same-name rules: # # # OK, this strange logging daemon needs request or response, # # but can work without either a request or a response: # acl hasWhatMyLoggingDaemonNeeds has request # acl hasWhatMyLoggingDaemonNeeds has response

IF USE_OPENSSL acl aclname ssl_error errorname # match against SSL certificate validation error [fast] # # For valid error names see in /usr/local/squid/share/errors/templates/error-details.txt # template file. # # The following can be used as shortcuts for certificate properties: # [ssl::]certHasExpired: the "not after" field is in the past # [ssl::]certNotYetValid: the "not before" field is in the future # [ssl::]certUntrusted: The certificate issuer is not to be trusted. # [ssl::]certSelfSigned: The certificate is self signed. # [ssl::]certDomainMismatch: The certificate CN domain does not # match the name the name of the host we are connecting to. # # The ssl::certHasExpired, ssl::certNotYetValid, ssl::certDomainMismatch, # ssl::certUntrusted, and ssl::certSelfSigned can also be used as # predefined ACLs, just like the 'all' ACL. # # NOTE: The ssl_error ACL is only supported with sslproxy_cert_error, # sslproxy_cert_sign, and sslproxy_cert_adapt options.

acl aclname server_cert_fingerprint [-sha1] fingerprint
  # match against server SSL certificate fingerprint [fast]
  #
  # The fingerprint is the digest of the DER encoded version 
  # of the whole certificate. The user should use the form: XX:XX:...
  # Optional argument specifies the digest algorithm to use.
  # The SHA1 digest algorithm is the default and is currently
  # the only algorithm supported (-sha1).

acl aclname at_step step
  # match against the current step during ssl_bump evaluation [fast]
  # Never matches and should not be used outside the ssl_bump context.
  #
  # At each SslBump step, Squid evaluates ssl_bump directives to find
  # the next bumping action (e.g., peek or splice). Valid SslBump step
  # values and the corresponding ssl_bump evaluation moments are:
  #   SslBump1: After getting TCP-level and HTTP CONNECT info.
  #   SslBump2: After getting SSL Client Hello info.
  #   SslBump3: After getting SSL Server Hello info.

acl aclname ssl::server_name [option] .foo.com ...
  # matches server name obtained from various sources [fast]
  #
  # The ACL computes server name(s) using such information sources as
  # CONNECT request URI, TLS client SNI, and TLS server certificate 
  # subject (CN and SubjectAltName). The computed server name(s) usually
  # change with each SslBump step, as more info becomes available:
  # * SNI is used as the server name instead of the request URI,
  # * subject name(s) from the server certificate (CN and
  #   SubjectAltName) are used as the server names instead of SNI.
  #
  # When the ACL computes multiple server names, matching any single
  # computed name is sufficient for the ACL to match.
  #
  # The "none" name can be used to match transactions where the ACL
  # could not compute the server name using any information source
  # that was both available and allowed to be used by the ACL options at
  # the ACL evaluation time.
  #
  # Unlike dstdomain, this ACL does not perform DNS lookups.
  #
  # An ACL option below may be used to restrict what information 
  # sources are used to extract the server names from:
  #
  # --client-requested
  #   The server name is SNI regardless of what the server says.
  # --server-provided
  #   The server name(s) are the certificate subject name(s), regardless
  #   of what the client has requested. If the server certificate is
  #   unavailable, then the name is "none".
  # --consensus
  #   The server name is either SNI (if SNI matches at least one of the
  #   certificate subject names) or "none" (otherwise). When the server
  #   certificate is unavailable, the consensus server name is SNI.
  #
  # Combining multiple options in one ACL is a fatal configuration
  # error.
  #
  # For all options: If no SNI is available, then the CONNECT request
  # target (a.k.a. URI) is used instead of SNI (for an intercepted
  # connection, this target is the destination IP address).

acl aclname ssl::server_name_regex [-i] \.foo\.com ...
  # regex matches server name obtained from various sources [fast]

acl aclname connections_encrypted
  # matches transactions with all HTTP messages received over TLS
  # transport connections. [fast]
  #
  # The master transaction deals with HTTP messages received from
  # various sources. All sources used by the master transaction in the
  # past are considered by the ACL. The following rules define whether
  # a given message source taints the entire master transaction,
  # resulting in ACL mismatches:
  #
  #  * The HTTP client transport connection is not TLS.
  #  * An adaptation service connection-encryption flag is off.
  #  * The peer or origin server transport connection is not TLS.
  #
  # Caching currently does not affect these rules. This cache ignorance
  # implies that only the current HTTP client transport and REQMOD
  # services status determine whether this ACL matches a from-cache
  # transaction. The source of the cached response does not have any
  # effect on future transaction that use the cached response without
  # revalidation. This may change.
  #
  # DNS, ICP, and HTCP exchanges during the master transaction do not
  # affect these rules.

ENDIF acl aclname any-of acl1 acl2 ... # match any one of the acls [fast or slow] # The first matching ACL stops further ACL evaluation. # # ACLs from multiple any-of lines with the same name are ORed. # For example, A = (a1 or a2) or (a3 or a4) can be written as # acl A any-of a1 a2 # acl A any-of a3 a4 # # This group ACL is fast if all evaluated ACLs in the group are fast # and slow otherwise.

acl aclname all-of acl1 acl2 ... 
  # match all of the acls [fast or slow]
  # The first mismatching ACL stops further ACL evaluation.
  #
  # ACLs from multiple all-of lines with the same name are ORed.
  # For example, B = (b1 and b2) or (b3 and b4) can be written as
  #   acl B all-of b1 b2
  #   acl B all-of b3 b4
  #
  # This group ACL is fast if all evaluated ACLs in the group are fast
  # and slow otherwise.

Monta tu LAMP+ en menos de dos minutos

Seguro que much@s de nosotr@s cuando hemos tenido que desarrollar alguna página Web en un entorno Windows montado alguna vez la suite de software XAMPP de Apache Friends para salir del paso y tener un entorno mínimo comenzar a programar, en vez de instalar un servicio uno por uno porque además de que en Windows es uno de los sistemas en los que este trabajo resulta algo más laborioso.

Sin embargo, Linux o los sistemas UNIX-like son mucho más amigables en cuánto entornos de desarrollo tanto de software como de aplicaciones Web. El uso de los gestores de paquetes junto con el amplio soporte de software oficial incluido en los repositorios, el uso de librerías compartidas del sistema, la documentación extensa y sobre todo las mil y una funcionalidades en materia de seguridad, optimización, escalabilidad... que se pueden añadir para potenciar el sistema operativo, hacen que los UNIX-like sean clave para este tipo de tareas.

Como ejemplo disparatado, la lista de servidores top500, en los que el 100% de los supercomputadores más potentes del mundo hacen uso de Linux para todo tipo de operaciones y cálculos. Para que veamos, que aquell@s que tengamos un "tuxito" instalado en nuestro PC, no tenemos un SO de "juguete".

¿Qué es Lampy?

Lampy es un script que permite instalar en poco menos de 1 paso un entorno de desarrollo Web. Un servidor Web que puede ser Apache o Nginx; un servidor FTP (vsftpd); un sistema gestor de base de datos que en este caso es MariaDB y por último el lenguaje de desarrollo web PHP.

Actualmente, solo se puede utilizar para Archlinux, Debian, Fedora, openSUSE y Ubuntu, pero que en un futuro iremos añadiendo más características y soporte para otras distribuciones como Gentoo y CentOS.

El script se puede obtener desde el repositorio de Gitlab

git clone https://gitlab.com/sincorchetes/lampy.git

¡Un saludo y a disfrutarlo!

No podemos montar My Passport WD en Linux

Nos dejaron un disco duro My Passport WD para pasarle unos archivos con la grata sorpresa de toparnos con un fallo de montaje porque no reconoce el dispositivo, y cómo lo hemos solucionado, vamos a publicar cómo arreglarlo para salir del paso.

¿Por qué no nos reconoce el sistema de archivos?

Parece que los Western Digital My Passport, vienen con un formato llamado exFAT, que es un formato desarrollado por Microsoft que mejora el rendimiento de unidades flash (estándar para memorias SDXC)o cuando NTFS no es factible por la sobrecarga de entradas de registro de archivos. También nace como alternativa al viejo FAT(32). Al parecer hay distribuciones como Fedora que no incorporan por defecto el driver para poder leer este tipo de sistema de ficheros.

¿Cómo podemos solucionarlo?

Tan solo bastaría con instalar el paquete exfat-tools y fuse-exfat para poderlo montar.

Fedora

En Fedora solo tenemos que ejecutar:

$ su -c "dnf install fuse-exfat exfat-tools"

Y listo, enchufamos el dispositivo y tendremos acceso a los datos.

Debian, Ubuntu...

Para Ubuntu, Debian y derivadas, bastará con instalar:

$ sudo apt-get install exfat-fuse exfat-utils

CentOS, RHEL

En CentOS y RHEL es un poco más compleja su instalación ya que no se encuentran los paquetes de forma oficial y hay que, o bien compilar el código fuente, o bien hacer uso de un repositorio yum(8) a terceros. Nosotros os dejaremos la instalación con el repo de YUM, pero también al final, mencionaremos la compilación del código fuente.

CentOS

La diferencia entre CentOS y RHEL, es que RHEL al ser corporativo no añade todos los paquetes comunitarios como tiene CentOS, además de obtener más rápidamente actualizaciones de seguridad siempre que dispongamos de licencia.

# yum -y install epel-release && rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm
# rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro

Añadimos includepkgs=exfat-utils fuse-exfat en el archivo /etc/yum.repos.d/nux-desktop.repo justo debajo de protect=0 en el apartado [nux-desktop] tal que así:

[nux-dextop]
name=Nux.Ro RPMs for general desktop use
baseurl=http://li.nux.ro/download/nux/dextop/el7/$basearch/ http://mirror.li.nux.ro/li.nux.ro/nux/dextop/el7/$basearch/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-nux.ro
protect=0
includepkgs=exfat-utils fuse-exfat

Instalamos los paquetes mediante yum(8):

$ su -c "yum install exfat-utils fuse-utils"

Bastará con que conectemos el disco duro para que monte.

RHEL

La diferencia con los pasos anteriores, es que el paquete epel-relese que contiene la información del repositorio EPEL de Fedora no está incluido en sus repositorios, por lo tanto hay que instalarlo:

# rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

El resto de pasos es el mismo.

Archlinux

En Archlinux, al parecer compilaron el git y generaron solo un paquete.

$ sudo pacman -S exfat-utils

openSUSE Leap y Tumbleweed

Parecido a Fedora

$ sudo zypper in exfat-utils fuse-exfat

Gentoo

# emerge -av exfat-utils fuse-exfat

Código fuente

  1. Obtenemos el código fuente desde aquí
  2. Extramos el código
  3. Configuramos e instalamos (Se nos pedirá autoreconf como dependencia para compilar, que se encuentra en tarball autoconf, automake y el paquete de desarrollo de FUSE)
$ autoreconf --install
$ ./configure --prefix=/usr
$ make install clean

NOTA: Si compilamos en otro directorio que no se encuentre añadido a la variable PATH de /etc/profile.d/ o .bash_profile. Tendremos que añadirlo.

  1. Vemos la versión
$ mount.exfat-fuse
FUSE exfat 1.2.8
Usage: ./mount.exfat-fuse [-d] [-o options] [-V] <device> <dir>

Montando desde CLI

Si queremos utilizar la terminal bastará con ejecutar:

$ sudo mount.exfat-fuse /dev/sdX /directorio_a_montar

Referencias

No-IP - ¿Cómo obtener un acceso fijo a un servidor?

Seguramente alguna que otra vez nos ha interesado montar un servidor casero ya sea para alojar contenido Web, enviar e-mails... o tener un gestor de descargas al que conectarnos a nuestra casa, dejar descargando cosa X y que al llegar esté listo para alojarlo en una unidad USB para un uso Y.

Sin embargo, si nos damos cuenta, cada vez que reiniciamos el router, obtener otra IP diferente y se nos va todo al garete. Tenemos que volver a obtener la dirección de nuestra IP pública a través de un servicio como What's my IP?,ipify... esto es debido a que el ISP (Proveedores de Servicio de Internet) como Movistar otorga nuevas direcciones IP cuando detectan que se conecta un dispositivo a su pool de direcciones, machacando la vieja IP y obteniendo una nueva. Sin embargo, hay ISP como ONO (ahora Vodafone) que otorgan una IP fija y evita hacer uso de este post.

NOTA: Se puede solicitar una IP estática pública, pero los precios para ello son muy elevados y muchas veces no compensa dependiendo de la actividad que vayamos a realizar.

¿Cómo acabar con el problema?

Existen muchos servicios en Internet que pueden darnos una IP fija como Dyn (antes DynDNS), no obstante, vamos a utilizar los servicios de No-IP.org. Este servicio te proporciona un subdominio a elección, y un dominio ya existente, con lo que, realmente accederás al dominio y no a una IP X con lo que será mucho más fácil acordarnos.

Una vez que nos registremos y tengamos instalado el servicio, este preguntará cada cierto tiempo la IP pública, y si es nueva la irá renovando junto con los servidores de No-IP para qué cada vez que queramos acceder esté operativo aunque haya cambiado más de 100 veces de IP.

Registro

Primero accedemos a la página mediante el siguiente enlace, y nos registramos escogiendo un subdominio y un dominio ya existente.

[owl-carousel items=1 margin=10 loop=true autoplay=true autoplayHoverPause=true nav=true] [/owl-carousel]

Nos enviarán un correo de confirmación, por lo que sería conveniente que revisemos las bandejas de Spam o "correo no deseado" en caso de que no nos aparezca en la bandeja de entrada normalmente suele tardar milésimas de segundos.

Instalando el servicio

Nos descargamos el servicio de No-IP desde aquí para el sistema operativo que tengamos, vale FreeBSD, Linux, Windows, OS X...

Linux

En este apartado veremos como se instala, configura y ejecuta el servicio:

Fedora

Para instalarlo en Fedora, solo hay que ejecutar:

$ su -c "dnf install noip"

Y se instalará, este servicio se encuentra en los repositorios oficiales por lo que no necesitaremos añadir ningún repositorio adicional y cuenta con el respaldo de la comunidad directamente.

Código fuente

Parece que Fedora es la única distribución dentro de las más populares que mantiene noip de forma comunitaria y oficial. En este apartado explicaremos como instalarlo mediante código fuente para el resto de distribuciones.

$ wget http://www.no-ip.com/client/linux/noip-duc-linux.tar.gz
$ tar xfv noip-duc-linux.tar.gz
$ cd noip-2.1.9-1

Por defecto, si lo compilamos y lo instalamos se instalará en el directorio /usr/local, para configurar un directorio diferente, hay que redefinir el PREFIX= que se incluye dentro del fichero Makefile. Por ejemplo:

TGT=noip2
CC=gcc
PKG=noip-2.1.tgz

PREFIX=/opt/noip
CONFDIR=${PREFIX}/etc
BINDIR=${PREFIX}/bin

# these defines are for Linux
LIBS=
ARCH=linux

[Texto cortado]

Se instalará en el directorio /opt/noip, recordemos que si configuramos un directorio ajeno a /usr; /usr/local hay que añadir a la variable PATH de nuestro .bash_profile o /etc/profile.d/noip.sh

/etc/profile.d/noip.sh

#!/bin/bash
PATH=$PATH:/opt/noip/bin
export PATH

Ejecutamos:

$ sudo make install

Se instará en el directorio /opt/noip siguiendo el ejemplo de arriba, y nos saltará una salida interactiva como esta:

if [ ! -d /opt/noip/bin ]; then mkdir -p /opt/noip/bin;fi
if [ ! -d /opt/noip/etc ]; then mkdir -p /opt/noip/etc;fi
cp noip2 /opt/noip/bin/noip2
/opt/noip/bin/noip2 -C -c /tmp/no-ip2.conf

Auto configuration for Linux client of no-ip.com.

Multiple network devices have been detected.

Please select the Internet interface from this list.

By typing the number associated with it.
0   wlo1
1   vboxnet0

Nos está pidiendo qué interfaz es la que se encuentra conectada a Interner y cuál utilizaremos (en caso de tener más de una NIC), seleccionamos wlo1 (en mi caso.).

Please enter the login/email string for no-ip.com  [INSERTA AQUÍ EL E-MAIL CON EL QUE TE REGISTRASTE]
Please enter the password for user [TU_EMAIL] [INSERTA LA CONTRASEÑA]

Only one host [echemosunbitstazo.sytes.net] is registered to this account.
It will be used.
Please enter an update interval:[30]  [EN MINUTOS]
Do you wish to run something at successful update?[N] (y/N)  [PODEMOS DECIR QUE SÍ PARA QUE EJECUTE UN SCRIPT CADA VEZ QUE LA OPERACIÓN SALGA BIEN]
Please enter the script/program name  [SI HAS ESCOGIDO QUE SI EN LA PREGUNTA ANTERIOR, INTRODUCE LA RUTA, SI NO IGNORA EL MENSAJE]
New configuration file '/tmp/no-ip2.conf' created.

mv /tmp/no-ip2.conf /opt/noip/etc/no-ip2.conf

Perfecto, ya lo tenemos configurado.

Trabajando con No-IP en Linux

Para ejecutar el servicio siguiendo el ejemplo anterior basta con:

/opt/noip/bin/noip2

Y ya estrá trabajando:

$ ps aux |grep noip2
nobody   10219  0.0  0.0  23220  2008 ?        Ss   16:32   0:00 /opt/noip/bin/noip2

Mostrando la configuración actual:

/opt/noip/bin/noip2 -S

Obtendremos una salida como esta:

1 noip2 process active.

Process 10219, started as noip2, (version 2.1.9)
Using configuration from /opt/noip/etc/no-ip2.conf
Last IP Address set [TU_IP_PÚBLICA]
Account [TU@EMAIL.COM]
configured for:
    host  echemosunbitstazo.sytes.net [TU_DIRECCIÓN_REGISTRADA]
Executing /opt/noip/success.sh upon successful update. [SCRIPT_QUE_CONFIGURASTE_SI_NO_LO_HICISTE_OBVIALO]
Updating every 30 minutes via /dev/wlo1 with NAT enabled. [NOTIFICA QUE HAY NAT EN TU CONEXIÓN, Y USA LA NIC QUE CONFIGURASTE]

Prueba rápida de conexión si no tenemos el bloqueo de respuestas ICMP en nuestro firewall habilitado:

PING echemosunbitstazo.sytes.net (TU_IP_PUBLICA) 56(84) bytes of data.
64 bytes from A.red-B.dynamicip.rima-tde.net (TU_IP_PUBLICA): icmp_seq=1 ttl=64 time=4.73 ms
64 bytes from A.red-B.dynamicip.rima-tde.net (TU_IP_PUBLICA): icmp_seq=2 ttl=64 time=5.04 ms
64 bytes from A.red-B.dynamicip.rima-tde.net (TU_IP_PUBLICA): icmp_seq=3 ttl=64 time=4.89 ms
--- echemosunbitstazo.sytes.net ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3002ms
rtt min/avg/max/mdev = 4.733/5.069/5.609/0.333 ms

Si tenemos un servidor SSH, nos conectamos:

ssh USUARIO@TU_URL_REGISTRADA.XXX

NOTA: Puede que este proceso lleve pasos adicionales en el router, como redireccionamiento de puertos o la apertura de los mismos. Como recomendación, si tenemos un router con acceso SSH y web, lo mejor es modificar el puerto de los servicios o bien hacer un redireccionamiento de los puertos en el router.

Creando entrada en el gestor de servicios

En este apartado, te explicaremos cómo añadir No-IP al gestor de servicios systemd(1)

Creamos un archivo en /etc/systemd/system/noip2.service y añadimos las siguientes líneas siguiendo el ejemplo anterior. Si lo hemos instalado con el PREFIX por defecto lo adaptamos.

[Unit]
Description=No-IP2 service
Requires=network.target

[Service]
ExecStart=/opt/noip/bin/noip2 -c /opt/noip/etc/no-ip2.conf

[Install]
WantedBy=network.target

Para ejecutarlo:

$ sudo systemctl start noip2.service

Para pararlo:

$ sudo systemctl stop noip2.service

Para habilitarlo cuando inicie el sistema

$ sudo systemctl enable noip2.service

Para deshabilitarlo cuando arranque el sistema:

$ sudo systemctl disable noip2.service

Windows

En Windows deberás descargarte el cliente desde el siguiente enlace y proceder a su instalación.

Una vez instalado, se nos abrirá el cliente pidiéndonos el login, una vez pasada esta ventana, simplemente añadimos la máquina y ya tenemos el servicio corriendo.

[owl-carousel items=1 margin=10 loop=true autoplay=true autoplayHoverPause=true nav=true] [/owl-carousel]

Recursos

No-IP.org ~ Página documentada noip.tar.gz ~ LEEME, instrucciones de instalación

Configuración Router BHS-RTA, Home Station

Hemos rescatado este artículo de nuestro viejo blog publicado el 19 de marzo del 2014, debido al alto tráfico que recibía. En este artículo vamos a ver cómo acceder a la interfaz Web original del router que vamos a comentar y saltarnos la interfaz que nos impone Movistar en este modelo de router.

Como podemos ver en la imagen, podemos ver cómo es el portal Web impuesto por Movistar, y en la segunda, ver la interfaz original del router.

[owl-carousel items=1 margin=10 loop=true autoplay=true autoplayHoverPause=true nav=true] [/owl-carousel]

Para llegar hasta ahí, hemos tenido que ir mirando cómo encontrar el portal Web, ya que tiene una redirección del puerto 80 hacia Movistar, entonces, ¿Cómo accedemos a la interfaz Web del router? Pues mediante otro puerto. Hemos descubierto, que corre bajo el puerto 8000 después de conectarnos via Telnet como os explicaremos más abajo. Pero antes de acceder, tendremos que averiguar ¿Qué IP tiene nuestro router?

¿Cómo identificar la IP de nuestro router?

Bastará con identificar la puerta de enlace a través de un intérprete de comandos como bash(1), sh(1), cmd.exe...

Para los que no lo sepan, la puerta de enlace es el dispositivo que tenemos en una red que intercomunica con redes distintas. Es decir, cuando un dispositivo está dentro de un segmento de red y quiere enviar información, lo que hace es enviar un paquete ARP (Address Resolution Protocol o protocolo de resolución de direcciones) que permite determinar las IPs y MAC de los equipos que hay dentro del segmento de red. Cuando nosotros enviamos un paquete a un dispositivo que no se encuentra dentro de la red, se envía a la puerta de enlace y este dispositivo, que es generalmente un router (ya que hay switches que trabajan en L3), se encarga de gestionarlo para que el otro dispositivo de la red X pueda recibirlo de la forma más rápida o estable posible, esto recibe el nombre de enrutar.

Una explicación sencilla, estamos en la sala de espera de un hospital (segmento de red) y hay un(a) informador(a). El trabajo de esta persona, es coger la información de los médicos que se encuentran en sus consultas (varios segmentos de red), para, posteriormente, notificar lo que tiene x paciente a sus familiares, pareja, amig@s... que están en la sala de espera.

Para poder identificar el "gateway" basta con abrir una consola y ejecutar una serie de comandos.

Linux

En cualquier distribución, abrimos un intérprete de comandos y ejecutamos:

$ ip route

Este comando permite visualizar las rutas que hay configuradas, sean dinámicas o estáticas.

Nota: Las rutas son caminos por dónde pasarán los paquetes y pueden ser estáticos o dinámicos. Los explicaremos en otros posts, cuando estén elaborados los enlazaremos directamente.

Salida similar:

default via 192.168.1.1 dev wlo1 proto static metric 600 
192.168.1.0/24 dev wlo1 proto kernel scope link src 192.168.1.51 metric 600 
  • Nos dice que la puerta de enlace es la: 192.168.1.1, es decir, que todos los paquetes ajenos a la red 192.168.1.0/24 pasarán por la interfaz wlo1 con dicha IP.
  • 192.168.1.51 es nuestra IP en este segmento de red.

Windows

Hay múltiples formas de acceder al cmd.exe

  • XP: Inicio -> Ejecutar...
  • 7: _Inicio -> Cuadro de texto "Buscar programas y archivos" -> Escribimos cmd.exe
  • 8: Tecla Inicio -> cmd.exe
  • 10: Cuadro de búsqueda del escritorio -> Escribimos cmd.exe

Ejecutamos:

> ipconfig

Salida como esta:

Microsoft Windows [Versión 6.1.7601]

Copyright (c) 2009 Microsoft Corporation. Reservados todos los derechos.

C:\Users\sincorchetes>ipconfig

Configuración IP de Windows

Adaptador de Ethernet Conexión de área local:

   Dirección IPv4. . . . . . . . . . . . . . : 192.168.1.21

   Máscara de subred . . . . . . . . . . . . : 255.255.255.0

   Puerta de enlace predeterminada . . . . . : 192.168.1.1

Ya tenemos identificada la puerta de enlace.

¿Cómo conectarnos al router?

Básicamente, se accede mediante via telnet(1), si, resulta muy conmovedor que se utilice uno de los protocolos más inseguros para conexiones remotas en los routers de Movistar y no OpenSSH (Open Secure SHell) que es el protocolo utilizado hoy en día para esto. Tenemos que tener telnet(1) en nuestro sistema, si no lo tenemos, podemos echarle un bitstazo al post anterior "[Instalando Telnet en nuestro sistema]"(https://echemosunbitstazo.es/blog/instalar-telnet?target=_blank).

Por ejemplo, utilizando el ejemplo anterior: $ telnet 192.168.1.1

Y ya estaríamos dentro del router, para saber qué versión del sistema está utilizando, basta con ejecutar:

$ cat /proc/version

Os saldrá algo tal que así:

Para ver los puertos que tenemos abiertos en él, basta con hacer:

$ cat /var/webport 

Para ver los puertos que hay abiertos en el router, a nosotros nos salio una salida como esta:

ipv6:80
ipv6:8000
ipv6:443
ipv6:7547

Ambos puertos pueden accederse utilizando la dirección IPv4 que tiene el router, es curioso que no lo liste por ipv4 o tenga ipv4, ipv6.

  • 80 --> Es un puerto que entra dentro de los puertos bien conocidos reservados para servicios y aplicaciones (van del 0-1023) y su uso queda reservado para el protocolo de intercambio de HyperTexto (HTTP), es decir, servidores Web.
  • 8000 --> Se encuentra dentro de los llamados puertos registrados con un rango que van desde el puerto número 1024-49151, estos puertos se asignan a procesos o aplicaciones de usuarios. Éste en concreto según la lista de puertos registrados se hace uso para iRDMI, pero se ve que aquí lo utilizan de forma errónea para utilizarlo como un 80, si fuese un puerto alternativo, debería ser 8080 que es como debe ser usado.
  • 443 --> Es un puerto como el8 80, entra dentro de los puertos bien conocidos y su uso es para conexiones cifradas mediante certificado SSL a través del protocolo HTTP
  • 7547 --> Es un estándar aplicado por la DSL Forum en un documento llamado TR-069, se utiliza para gestionar de forma remota la configuración y administración del router. Por lo general, los técnicos Helpdesk que te ayudan a solucionar los problemas de averías, hacen uso de este puerto para acceder a tu dispositivo.

Referencias