Categories
Automatizacion dev web

Desarrollo de aplicaciones sin servidor

El desarrollo de aplicaciones sin servidor, también conocido como serverless, es un enfoque moderno en la industria del desarrollo de software que ha ganado popularidad en los últimos años. Aunque el nombre puede ser engañoso, no significa que las aplicaciones no necesiten servidores, sino que los desarrolladores pueden centrarse exclusivamente en escribir el código de la aplicación, sin tener que preocuparse por la infraestructura subyacente necesaria para su ejecución.

En el desarrollo sin servidor, en lugar de gestionar servidores y configuraciones, los desarrolladores pueden aprovechar servicios en la nube que ofrecen plataformas de ejecución de código como AWS Lambda, Azure Functions o Google Cloud Functions. Estos servicios se encargan de ejecutar el código de manera escalable y automatizada, gestionando la infraestructura de manera transparente para los desarrolladores.

Una de las principales ventajas del desarrollo sin servidor es la eliminación de la necesidad de administrar y escalar servidores, lo que reduce la carga de trabajo operativa y permite a los equipos de desarrollo enfocarse en la lógica de negocio y la funcionalidad de la aplicación. Además, el modelo de precios basado en el consumo de recursos utilizados resulta rentable, ya que los desarrolladores solo pagan por la cantidad de tiempo que su código se está ejecutando.

El desarrollo sin servidor permite la creación de aplicaciones altamente escalables y tolerantes a fallos, ya que los servicios en la nube gestionan automáticamente el escalado de acuerdo con la carga de trabajo y se encargan de la redundancia y la disponibilidad. Esto facilita el desarrollo de aplicaciones ágiles y flexibles que pueden adaptarse rápidamente a las necesidades cambiantes del negocio.

En resumen, el desarrollo de aplicaciones sin servidor es un enfoque que permite a los desarrolladores centrarse en escribir el código de la aplicación, mientras que la infraestructura subyacente es administrada por servicios en la nube. Esto proporciona ventajas como mayor productividad, escalabilidad automática y costos optimizados, lo que lo convierte en una opción atractiva para el desarrollo de software moderno.

Categories
redes web

Peticiones HTTP

Los tipos de peticiones web más comunes son los siguientes:

  • GET
    • Es la petición más común y se utiliza para solicitar recursos específicos a través de una URL. El servidor responde enviando el recurso solicitado. Esta petición es idempotente, lo que significa que no debe tener un impacto diferente en el servidor si se repite varias veces.
  • POST
    • Se utiliza para enviar datos al servidor, generalmente como parte de un formulario HTML. Los datos enviados con una petición POST son incluidos en el cuerpo de la petición, en lugar de estar presentes en la URL. Esta petición no es idempotente, lo que significa que puede tener un impacto diferente en el servidor cada vez que se realiza.
  • PUT
    • Se utiliza para enviar datos al servidor y reemplazar completamente el recurso existente en la ubicación especificada. Si el recurso no existe, se crea uno nuevo. Es idempotente, lo que significa que el resultado es el mismo independientemente de cuántas veces se repita la petición.
  • DELETE
    • Se utiliza para solicitar al servidor que elimine el recurso especificado en la URL. Al igual que PUT, es idempotente.
  • PATCH
    • Se utiliza para enviar datos al servidor para realizar modificaciones parciales en el recurso identificado. A diferencia de PUT, PATCH no reemplaza completamente el recurso, sino que realiza actualizaciones específicas en él.

Estos son algunos de los tipos de peticiones web más comunes. Además de estos, también existen otros métodos menos utilizados, como OPTIONS, HEAD, TRACE, etc. Cada tipo de petición tiene un propósito específico y se utiliza según las necesidades de la aplicación web y el manejo de los recursos del servidor.

Categories
redes web

Partes de una URL

Una URL (Uniform Resource Locator, por sus siglas en inglés) es una dirección web que se utiliza para identificar de manera única la ubicación de un recurso en Internet. Las partes principales que conforman una URL son las siguientes:

  • Esquema (Scheme): El esquema especifica el protocolo de comunicación que se utilizará para acceder al recurso. Algunos ejemplos comunes de esquemas son “http://” para páginas web normales, “https://” para páginas web seguras con cifrado SSL/TLS, “ftp://” para transferencia de archivos, “mailto://” para direcciones de correo electrónico, etc.
  • Nombre de dominio (Domain Name): El nombre de dominio identifica la ubicación específica del recurso en Internet. Por ejemplo, en “https://www.ejemplo.com“, el nombre de dominio es “www.ejemplo.com“. El nombre de dominio se compone de dos partes principales: el subdominio (opcional) y el dominio de nivel superior (TLD, por sus siglas en inglés). En este caso, “www” es el subdominio y “ejemplo.com” es el dominio de nivel superior.
  • Ruta (Path): La ruta es la ubicación específica del recurso dentro del servidor. Indica la estructura de directorios y archivos en el servidor web que llevan al recurso deseado. Por ejemplo, en “https://www.ejemplo.com/carpeta/recurso.html“, la ruta es “/carpeta/recurso.html”.
  • Consulta (Query): La consulta es una cadena de caracteres opcional que se utiliza para pasar información adicional al servidor. Es comúnmente utilizado en aplicaciones web para enviar parámetros o datos específicos. La consulta se inicia con el símbolo “?” y puede contener múltiples pares clave-valor separados por el símbolo “&”. Por ejemplo, en “https://www.ejemplo.com/recurso.php?parametro1=valor1&parametro2=valor2“, la consulta es “?parametro1=valor1&parametro2=valor2”.
  • Fragmento (Fragment): El fragmento identifica una sección específica dentro del recurso enlazado, generalmente utilizado en páginas web que contienen anclajes internos. El fragmento se inicia con el símbolo “#”. Por ejemplo, en “https://www.ejemplo.com/pagina.html#seccion“, el fragmento es “#seccion”.

Estas son las partes básicas que componen una URL web. Cada una de ellas puede estar presente o ser opcional, dependiendo del tipo de recurso y cómo se accede a él.

Categories
Linux sysadmin

Configurar servidor proxy en Ubuntu Linux

En esta ocasión instalaremos squid para permitir que servidores dentro de una red interna tengan comunicación a internet. Squid permite una gran cantidad de opciones y configuraciones según las politicas y necesidad de nuestra organización. En este tutorial lo configuraremos en su modo mas sencillo

Instalar squid

Squid se encuentra disponible en la lista de paquetes de Ubuntu, por lo que se puede instalar con apt

sudo apt-get update && sudo apt-get install -y squid

Configuración básica

Una vez instalado squid editaremos su archivo de configuración para permitir que los equipos en la red interna puedan utilizarlo.

Primero crearemos una copia de seguridad de este archivo para restablecer la configuración inicial por si cometemos algún error con nuestra configuración

sudo cp /etc/squid/squid.conf /etc/squid/squid.conf.original
sudo chmod a-w /etc/squid/squid.conf.original

Dirección IP y puerto de proxy

Por defecto squid funciona en el puerto 3128, si deseamos utilizar un puerto diferente tenemos que buscar en el archivo de configuración la entrada http_port y modificar el valor original por el puerto deseado. En el siguiente ejemplo utilizaremos el puerto 9998

http_port 9998

Si el servidor que funcionará como proxy cuenta con diferentes direcciones IP y se desea que el proxy funcione solo en una en lugar de todas, tenemos que agregar la dirección a la configuración del puerto como se muestra de la siguiente manera donde la dirección 192.168.1.120 escuchará las peticiones de los equipos internos:

http_port IP:PUERTO
http_port 192.168.1.120:9998

Control de acceso

Por defecto squid esta configurado para que solo localhost pueda utilizar el proxy, por lo que tenemos que indicarle el rango de direcciones IP que tienen autorización para utilizar este servicio

En el archivo de configuración agregaremos este rango al final de la configuración inicial.

El archivo luce similar a como se muestra a continuación:

acl localnet src 100.64.0.0/10		# RFC 6598 shared address space (CGN)
acl localnet src 169.254.0.0/16 	# RFC 3927 link-local (directly plugged) machines
acl localnet src 172.16.0.0/12		# RFC 1918 local private network (LAN)

Al final de estos valores debemos indicar las direcciones de los equipos que utilizaran squid, a continuación se muestra como agregar a los equipos en el segmento 192.168.1.0/24 los cuales agruparemos con el nombre de red_interna

acl localnet src 100.64.0.0/10		# RFC 6598 shared address space (CGN)
acl localnet src 169.254.0.0/16 	# RFC 3927 link-local (directly plugged) machines
acl localnet src 172.16.0.0/12		# RFC 1918 local private network (LAN)
acl red_interna src 192.168.1.0/24

Ahora configuraremos que los equipos definidos en red_interna puedan utilizar el proxy agregando en la parte superior del control de acceso lo siguiente:

http_access allow red_interna

Después de esto el archivo de configuración debe lucir de la siguiente manera:

http_access allow red_interna
# Deny requests to certain unsafe ports
http_access deny !Safe_ports

# Deny CONNECT to other than secure SSL ports
http_access deny CONNECT !SSL_ports

Con esto procederemos a guardar los cambios en el archivo de configuración y a reiniciar el servicio squid para ver los cambios reflejados

sudo systemctl restart squid.service

Validación

Para validar que squid esta funcionando de forma correcto podemos utilizar curl para lanzar una petición consumiendo un servicio externo de la siguiente forma

curl -v -x http://IP_PROXY:PUERTO_PROXY URL_A_CONSUMIR

En el siguiente ejemplo consultaremos la pagina principal del blog (https://nestortechtips.com) utilizando el proxy recién configurado

curl -v -x http://192.168.1.120:9998 https://nestortechtips.com

*   Trying 192.168.1.120:9998...
* TCP_NODELAY set
* Connected to 192.168.1.120 (192.168.1.120) port 9998 (#0)
* allocate connect buffer!
* Establish HTTP proxy tunnel to nestortechtips.com:443
> CONNECT nestortechtips.online:443 HTTP/1.1
> Host: nestortechtips.online:443
> User-Agent: curl/7.68.0
> Proxy-Connection: Keep-Alive
> 
< HTTP/1.1 200 Connection established
Categories
Automatizacion Linux sysadmin

Crear y configurar llaves SSH en Ubuntu 20.04 Linux

En esta ocasión demostraremos cómo crear llaves rsa y ecdsa para poder autenticarse a un equipo remoto

Procedimiento

Instalar dependencias (ssh-keygen, ssh-copy-id)

Para crear las llaves se utilizará ssh-keygen y para instalar la llave creada en el equipo remoto se utilizará ssh-copy-id. Ambos paquetes pueden instalarse con el siguiente comando

sudo apt-get update && sudo apt-get install -y ssh-keygen ssh-copy-id

Generar llaves

Para generar la llave es necesario especificar por lo menos 2 argumentos

  • Algoritmo a utilizar
  • Longitud de la llave, este argumento depende de la opción de algoritmo seleccionada ya que para algunos de ellos se cuenta con una longitud máxima

El algoritmo se especifica con la opción -t y la longitud con la opción -b. Una llave utilizando el algoritmo RSA y una longitud de 4096 bits luce de la siguiente forma

ssh-keygen -t rsa -b 4096

El comando anterior solicitará el nombre del archivo en donde se almacenarán las llaves, si se desea especificar el nombre basta con agregar el argumento -f. El siguiente comando creará una llave usando el algoritmo ecdsa y una llave de 521 bits en el archivo y ruta /home/usuario/millave

ssh-keygen -t ecdsa -b 521 -f /home/usuario/millave

Si la creación de las llaves es exitosa deben de haberse creado 2 archivos en la ruta especificada. Uno con el nombre de la llave sin ninguna terminación de archivo (.doc, .java. crt, etc) y otro con terminación .pub el cual es la llave pública. El archivo sin terminación debe mantenerse en un lugar bien protegido

Copiar llaves a equipo remoto

Para poder utilizar las llaves ssh generadas es necesario que el equipo remoto cuente con la llave pública. Copiaremos la llave recién creada millave con el comando ssh-copy-id

ssh-copy-id -i /home/usuario/millave usuario@equipo-remoto

El comando anterior agrega la llave publica al archivo authorized_keys en el equipo remoto.

Es posible validar que la llave fue instalada de forma correcta conectándonos al equipo especificando la llave privada (la que no tiene terminación)

ssh -i /home/usuario/millave usuario@equipo-remoto

Categories
Contenedores Docker Linux Raspberry

Cómo instalar Docker en Ubuntu

En esta ocasión instalaremos Docker en un sistema operativo Ubuntu

Primero instalaremos un par de paquetes necesarios para poder instalar Docker en nuestro equipo, para instalarlos podemos ejecutar los siguientes comandos

user@controlplane:~$ sudo apt-get update
user@controlplane:~$ sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release

Después agregaremos la llave GPG oficial de Docker para asegurarnos que los archivos que descarguemos del repositorio de Docker sean legítimos

user@controlplane:~$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

A continuación agregamos el repositorio de Docker adecuado a nuestra versión y arquitectura.
Al agregar el repositorio al sistema podremos actualizar Docker desde nuestro gestor de paquetes

user@controlplane:~$ echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Una vez que hemos agregado el repositorio, actualizaremos la lista de paquetes disponibles para su instalación

user@controlplane:~$ sudo apt-get update

Actualizada la lista de paquetes disponibles, procederemos a instalar Docker

user@controlplane:~$ sudo apt-get install docker-ce \
docker-ce-cli containerd.io

Ahora Docker se encuentra instalado en el sistema, sin enbargo solo el usuario root puede utilizarlo. Para que nuestro usuario pueda ejecutar los comandos de Docker tendremos que crear un grupo Docker y agregar nuestro usuario a dicho grupo

user@controlplane:~$ sudo groupadd docker && sudo usermod -aG docker $USER

Hechos estos cambiamos tendremos que salir de nuestra sesión actual en el equipo e ingresar de nuevo para que nuestras credenciales sean actualizadas

user@controlplane:~$ exit

Validaremos que podemos ejecutar comandos de Docker con nuestro usuario ingresando de nuevo y ejecutando el siguiente comando

user@controlplane:~$ docker run hello-world

Ahora que hemos instalado Docker podemos continuar aprendiendo esta tecnología tan utilizada hoy en día. Para esto puedes leer nuestra publicación acerca de Kubernetes o puedes jugar con los laboratorios disponibles en Play with Docker

Categories
Linux redes

Cómo monitorear la velocidad de internet con speedtest-cli y iperf3 desde Python

En ocasiones nos gustaría poder saber cómo se ha estado comportando nuestra velocidad de internet o solo nos gustaría comprobar si estamos obteniendo la velocidad que tenemos contratada con nuestro proveedor de internet. Como averiguaremos esto es muy sencillo y solo necesitamos una computadora con acceso a internet y un poco de paciencia.

Requisitos

Obtener código fuente

Para poder monitorear el desempeño de nuestra red es necesario obtener el código fuente que se encargará de obtener las mediaciones programaticamente. El código se puede obtener desde la siguiente dirección

https://github.com/nestortechtips/monitor-velocidad/archive/refs/heads/main.zip

Dentro del archivo zip nos encontraremos con la siguiente estructura de archivos

.
|____requirements.txt
|____README.md
|____main.py

Instalar dependencias

Para que se pueda ejecutar la biblioteca iperf3 sin incovenientes se require instalar la biblioteca homónima en el sistema operativo. A continuación mostraremos cómo hacerlo en Ubuntu 20.04

apt-get update && apt-get install iperf3 -y

Ahora instalaremos las bibliotecas requeridas por nuestro programa de Python, el cuál utiliza Python 3+ (en caso de no tener Python instalado en nuestro sistema podemos instalarlo siguiendo la documentación oficial)

pip install -r requirements.txt

Comprendiendo el código

Ya que contamos con las dependencias del programa, tomemos un momento para analizar el código.

El programa consiste de un par de métodos que se encargan de obtener las mediciones de iperf3 y speedtest-cli además de un método principal que se encarga de orquestrar la ejecución del programa

obtener_velocidad_internet_speedtest_cli

Este método se encarga de obtener la medición de velocidad de speedtest. La línea test_velocidad_subida = speedtest.Speedtest() se encarga de crear el objeto por el que obtendremos el servidor con el que se realizará prueba (el servidor se obtiene de forma aleatoria pero es posible especificar uno en particular) y las velocidades de bajada y subida con los métodos test_velocidad_bajada.download() y test_velocidad_subida.upload() respectivamente. Los resultados de ambos métodos son en bits/segundo, para facilitar su interpretación se calculan en Mbits/segundo con las siguientes líneas velocidad_bajada /= (1 * 10 **6) y velocidad_subida /= (1 * 10 **6)

obtener_velocidad_internet_iperf3

Este método se encarga de obtener el ancho de banda disponible entre nuestra red y un servidor corriendo iperf3 públicamente (la lista de servidores disponibles se puede encontrar aquí). El método se encarga de crear un obtjeto iperf3 con los datos necesarios para realizar la prueba al servidor, los cuales son su hosts/dominio y puerto, adicionalmente configuramos la duración de la prueba en segundos (no se recomienda un duración mayor a 20 segundos para no interferir con la comunicación de los dispositivos en nuestra red). En código esto se ve de la siguiente manera

client = iperf3.Client()
client.duration = 7
client.server_hostname = 'iperf.scottlinux.com'
client.port = 5201

En el ejemplo anterior indicamos que el servidor se encuentra en el dominio iperf.scottlinux.com, que la prueba durará 7 segundos y que el servidor se encuentra escuchando en el puerto 5201

main

Por último el método main se encarga de configurar la ruta donde deseamos guardar el log de la ejecución filename=’/log/{HOST_NAME}.log, ejecutar los métodos obtener_velocidad_internet_speedtest_cli y obtener_velocidad_internet_iperf3 para obtener las medicione de velocidad.

Ejecucíon

El programa puede ejecutarse de la siguiente forma

python main.py

Después de unos momentos deberán aparecer en nuestra pantalla las mediciones de las pruebas realizadas

speedtest-cli descarga - 193.43 Mbits/s. Subida - 191.15 Mbits/s. Servidor - Axtel

iperf3 descarga - 28.833 Mbits/s. Subida - 30.929 Mbits/s
Categories
Automatizacion Linux Raspberry

Cómo crear un espejo local de los repositorios de Ubuntu

Si has tenido que instalar o actualizar paquetes en más de un par de servidores, podrás haberte dado cuenta que la descarga de paquetes está limitada en mayor medida al ancho de banda contratado con nuestro proveedor de internet y en menor a la tarjeta de red del propio equipo. En este tipo de situaciones resulta conveniente tener un repositorio local para acelerar este proceso. A continuación mostraré cómo configurar un espejo local corriendo en Ubuntu 18.04 y utilizando una carpeta NFS donde estarán alojados todos los paquetes.

Requisitos

  • Permisos de administrador/root en el servidor que servirá de repositorio
  • Carpeta compartida NFS o espacio local de por lo menos 200 GB
  • Conexión a internet para descargar los paquetes del espejo de Ubuntu

Instrucciones

Instalación de Apache2

Instalaremos Apache como servidor web, para que los demás servidores puedan obtener los archivos del espejo.

# apt-get update && apt-get install apache2

Ahora habilitaremos el servicio de apache

# systemctl enable apache2

Ahora Apache debe de estar funcionando, validaremos esto con el comando curl

$ curl localhost

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">  <!--    Modified from the Debian original for Ubuntu    Last updated: 2016-11-16    See: https://launchpad.net/bugs/1288690  -->  <head>

Si obtenemos texto similar al anterior quiere decir que Apache está funcionando de forma correcta.

Montar NFS en el sistema de archivos

Ahora montaremos la carpeta compartida NFS en nuestro servidor con el comando mount

# mount -t nfs 192.168.0.120:/volume1/mirror /var/www/html/ubuntu/

Para que la carpeta se monte de forma automática si el servidor es reiniciado haremos el montaje persistente editando el archivo /etc/fstab

# nano /etc/fstab

192.168.0.120:/volume1/mirror   /var/www/html/ubuntu nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0

Una vez que el punto de montaje está listo, crearemos las carpetas donde configuraremos apache

# mkdir -p /var/www/html/ubuntu
# chown www-data:www-data /var/www/html/ubuntu

Instalación de apt-mirror

apt-mirror nos permitirá descargar los paquetes del espejo de Ubuntu

# apt-get install apt-mirror

Después configuraremos la lista de repositorios que estaremos alojando localmente, para obtener mejores resultados seleccionaremos la lista de repositorios que se encuentran en el archivo /etc/apt/sources.list

# cat /etc/apt/sources.list

## Note, this file is written by cloud-init on first boot of an instance
## modifications made here will not survive a re-bundle.
## if you wish to make changes you can:
## a.) add 'apt_preserve_sources_list: true' to /etc/cloud/cloud.cfg
##     or do the same in user-data
## b.) add sources in /etc/apt/sources.list.d
## c.) make changes to template file /etc/cloud/templates/sources.list.tmpl

# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.
deb http://ports.ubuntu.com/ubuntu-ports bionic main restricted
# deb-src http://ports.ubuntu.com/ubuntu-ports bionic main restricted

## Major bug fix updates produced after the final release of the
## distribution.
deb http://ports.ubuntu.com/ubuntu-ports bionic-updates main restricted
# deb-src http://ports.ubuntu.com/ubuntu-ports bionic-updates main restricted
....

En esta ocasión solo seleccionaremos las entradas deb sin comentarios #, ya que las entradas deb-src incrementan los requisitos de almacenamiento en hasta 800 GB.

Ahora que contamos con la lista de repositorios a alojar, editaremos el archivo /etc/apt/mirror.list

Antes de editarlo realizaremos una copio de respaldo con el siguiente comando

# cp /etc/apt/mirror.list /etc/apt/mirror.list.bk

Ahora editaremos el archivo de configuración /etc/apt/mirror.list

# nano /etc/apt/mirror.list

############# config ##################
#
set base_path    /var/www/html/ubuntu
#
# set mirror_path  $base_path/mirror
# set skel_path    $base_path/skel
# set var_path     $base_path/var
# set cleanscript $var_path/clean.sh
# set defaultarch  <running host architecture>
# set postmirror_script $var_path/postmirror.sh
# set run_postmirror 0
set nthreads     20
set _tilde 0
#
############# end config ##############
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports bionic main restricted

deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports bionic-updates main restricted

deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports bionic universe
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports bionic-updates universe


deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports bionic multiverse
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports bionic-updates multiverse

deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports bionic-backports main restricted universe multiverse


deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports bionic-security main restricted
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports bionic-security universe
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports bionic-security multiverse

En este caso modificamos los campos

  • set base_path – Lugar donde se alojarán los paquetes del espejo
  • arch=arm64 – Para indicar que solo queremos descargar los paquetes de arquitectura arm64. Si piensas alojar los paquetes para todas las arquitecturas puedes eliminar esta opción del código para que quede de la siguiente forma
deb http://ports.ubuntu.com/ubuntu-ports bionic-security multiverse

Una vez modificado el archivo de configuración, copiaremos el script postmirror.sh, que se ejecutará una vez que se hayan descargado todos los paquetes

# mkdir -p /var/www/html/ubuntu/var
# cp cp /var/spool/apt-mirror/var/postmirror.sh /var/www/html/ubuntu/var/

Ahora es tiempo de descargar los paquetes, ten en cuenta que esto puede tardar un par de horas dependiendo de nuestra conexión a internet, por lo que recomendamos hacerlo durante la noche. De no ser posible descargar los paquetes en un solo intento, podemos reiniciar la descarga en cualquier momento.

# apt-mirror
Downloading 346 index files using 20 threads...
Begin time: Sun May 16 16:44:01 2021
[20]... [19]... [18]... [17]... [16]... [15]... [14]... [13]... [12]... [11]... [10]... [9]... [8]... [7]... [6]... [5]... [4]... [3]... [2]... [1]... [0]... 
End time: Sun May 16 16:44:05 2021

Processing translation indexes: [TTTTTTTTTTTTTTTTTTTTTTT]

Downloading 1137 translation files using 20 threads...
Begin time: Sun May 16 16:44:05 2021
[20]... [
....

End time: Sun May 16 16:44:09 2021

Processing DEP-11 indexes: [DDDDDDDDDDDDDDDDDDDDDDD]

Downloading 146 dep11 files using 20 threads...
Begin time: Sun May 16 16:44:10 2021
[20]... [19]... [18]... [17]... [16]... [15]... [14]... [13]... [12]... [11]... [10]... [9]... [8]... [7]... [6]... [5]... [4]... [3]... [2]... [1]... [0]... 
End time: Sun May 16 16:44:11 2021

Processing indexes: [PPP

Finalizado el script, habremos descargado todos los paquetes del espejo, crearemos un cronjob para ejecutar apt-mirror todos los días a las 2 am, y así obtener los nuevos paquetes del espejo.

# crontab -e
00 	02 	*	 *	 *	/usr/bin/apt-mirror

Configurar los servidores para utilizar el repositorio local

En cada servidor donde deseamos utilizar el espejo local modificaremos el archivo /etc/apt/sources.list para reemplazar ports.ubuntu.com por la dirección IP/dominio de nuestro servidor funcionando como espejo.

## Note, this file is written by cloud-init on first boot of an instance
## modifications made here will not survive a re-bundle.
## if you wish to make changes you can:
## a.) add 'apt_preserve_sources_list: true' to /etc/cloud/cloud.cfg
##     or do the same in user-data
## b.) add sources in /etc/apt/sources.list.d
## c.) make changes to template file /etc/cloud/templates/sources.list.tmpl

# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.
deb https://archive.nestortechtips.online/ubuntu/mirror/ports.ubuntu.com/ubuntu-ports bionic main restricted
# deb-src http://ports.ubuntu.com/ubuntu-ports bionic main restricted

## Major bug fix updates produced after the final release of the
## distribution.
deb https://archive.nestortechtips.online/ubuntu/mirror/ports.ubuntu.com/ubuntu-ports bionic-updates main restricted
# deb-src http://ports.ubuntu.com/ubuntu-ports bionic-updates main restricted

## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team. Also, please note that software in universe WILL NOT receive any
## review or updates from the Ubuntu security team.
deb https://archive.nestortechtips.online/ubuntu/mirror/ports.ubuntu.com/ubuntu-ports bionic universe
# deb-src http://ports.ubuntu.com/ubuntu-ports bionic universe
deb https://archive.nestortechtips.online/ubuntu/mirror/ports.ubuntu.com/ubuntu-ports bionic-updates universe
# deb-src http://ports.ubuntu.com/ubuntu-ports bionic-updates universe

## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team, and may not be under a free licence. Please satisfy yourself as to
## your rights to use the software. Also, please note that software in
## multiverse WILL NOT receive any review or updates from the Ubuntu
## security team.
deb https://archive.nestortechtips.online/ubuntu/mirror/ports.ubuntu.com/ubuntu-ports bionic multiverse
# deb-src http://ports.ubuntu.com/ubuntu-ports bionic multiverse
deb https://archive.nestortechtips.online/ubuntu/mirror/ports.ubuntu.com/ubuntu-ports bionic-updates multiverse
# deb-src http://ports.ubuntu.com/ubuntu-ports bionic-updates multiverse

## N.B. software from this repository may not have been tested as
## extensively as that contained in the main release, although it includes
## newer versions of some applications which may provide useful features.
## Also, please note that software in backports WILL NOT receive any review
## or updates from the Ubuntu security team.
deb https://archive.nestortechtips.online/ubuntu/mirror/ports.ubuntu.com/ubuntu-ports bionic-backports main restricted universe multiverse
# deb-src http://ports.ubuntu.com/ubuntu-ports bionic-backports main restricted universe multiverse

## Uncomment the following two lines to add software from Canonical's
## 'partner' repository.
## This software is not part of Ubuntu, but is offered by Canonical and the
## respective vendors as a service to Ubuntu users.
# deb http://archive.canonical.com/ubuntu bionic partner
# deb-src http://archive.canonical.com/ubuntu bionic partner

deb https://archive.nestortechtips.online/ubuntu/mirror/ports.ubuntu.com/ubuntu-ports/ bionic-security main restricted
# deb-src http://ports.ubuntu.com/ubuntu-ports bionic-security main restricted
deb https://archive.nestortechtips.online/ubuntu/mirror/ports.ubuntu.com/ubuntu-ports/ bionic-security universe
# deb-src http://ports.ubuntu.com/ubuntu-ports bionic-security universe
deb https://archive.nestortechtips.online/ubuntu/mirror/ports.ubuntu.com/ubuntu-ports/ bionic-security multiverse
# deb-src http://ports.ubuntu.com/ubuntu-ports bionic-security multiverse

El espejo que acabamos de configurar agrega ubuntu-mirror/ports.ubuntu.com/ a la ruta de paquetes, por lo que hay que tomar en cuenta esta ruta al archivo de configuración.
En el ejemplo anterior utilizamos un nombre de dominio, puedes reemplazar archive.nestortechtips.online por la dirección IP del servidor.

En el servidor cliente, validaremos los cambios ejecutando el siguiente comando

# apt-get update
Hit:1 http://archive.nestortechtips.online/ubuntu/mirror/ports.ubuntu.com/ubuntu-ports bionic InRelease
Get:2 http://archive.nestortechtips.online/ubuntu/mirror/ports.ubuntu.com/ubuntu-ports bionic-updates InRelease [88.7 kB]
Get:3 http://archive.nestortechtips.online/ubuntu/mirror/ports.ubuntu.com/ubuntu-ports bionic-backports InRelease [74.6 kB]
Get:4 http://archive.nestortechtips.online/ubuntu/mirror/ports.ubuntu.com/ubuntu-ports bionic-security InRelease [88.7 kB]
Ign:5 http://archive.nestortechtips.online/ubuntu/mirror/ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 Packages
Ign:6 http://archive.nestortechtips.online/ubuntu/mirror/ports.ubuntu.com/ubuntu-ports bionic-updates/universe arm64 Packages
Get:7 http://archive.nestortechtips.online/ubuntu/mirror/ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 Packages [1264 kB]
Get:8 http://archive.nestortechtips.online/ubuntu/mirror/ports.ubuntu.com/ubuntu-ports bionic-updates/universe arm64 Packages [1527 kB]
Fetched 3053 kB in 2s (1394 kB/s)                                              
Reading package lists... Done

El resultado del comando anterior confirma que los paquetes están siendo actualizados desde el espejo local.

Conclusión

Descargar actualizaciones puede tomar largo tiempo desde un espejo de internet, con un espejo local podemos aprovechar que la mayoría del equipo de red moderno pone a nuestra disposición velocidades Gigabit (1000 Mbits/s), que pueden no estar disponibles por nuestro proveedor de internet, o si lo están puede que no mantengan está velocidad de forma constante/estable. Con el repositorio local podemos mitigar este cuello de botella o al menos reducir su impacto.

Categories
Linux

Cómo medir la velocidad de descarga desde la terminal

En esta ocasión mediremos la velocidad de descarga de un servidor Ubuntu utilizando iperf3.

Requisitos

  • Servidor con acceso a internet
  • Permisos de administrador para instalar el paquete iperf3

Instrucciones

Instalación de paquetes necesarios

Para poder medir la velocidad de descarga del servidor instalaremos iperf3 de la lista de paquetes.

# apt-get update && apt-get install iperf3

Prueba de velocidad

Utilizaremos uno de los servidores disponibles en la página oficial de iperf3 para medir la velocidad entre ambos servidores. Es recomendable utilizar el que se encuentre más cercano al lugar donde el servidor donde mediremos la velocidad de descarga.

Nota – Los servidores en la lista pueden utilizar un puerto diferente al utilizado por defecto, podemos indicar a iperf3 el puerto con la opción -p

Una vez que hayamos seleccionado el servidor, podemos medir la velocidad utilizando el siguiente comando:

# iperf3 -c iperf.scottlinux.com -T 30 -4

En el comando anterior utilizamos las siguientes opciones

  • c – para indicar el servidor con el que validaremos la velocidad
  • T – para indicar la duración en segundos de la medición
  • 4 – para utilizar IPv4

Con los resultados podremos validar el ancho de banda disponible para el servidor. Si hemos utilizado speedtest-cli y los resultados no coinciden con los de iperf3 esto puede ser el resultado de throttling por parte del ISP.

Categories
Linux

Comandos básicos de Linux

El sistema de archivos controla cómo se almacenan y recuperan los datos en una computadora. Todos los archivos y carpetas en un sistema Linux son parte de una estructura de árbol más grande con raíz en /. Los archivos y carpetas se agregan al sistema de archivos agregándolos a esta estructura de árbol y se remueven eliminándolos. Todos los nombres de archivo distinguen entre mayúsculas y minúsculas. Al trabajar con archivos y directorios en la línea de comandos, los caracteres especiales, como espacios y corchetes, deben escaparse usando una barra invertida \.

ls

Puedes verificar el contenido del directorio actual usando el comando ls.

ls

Puedes ver más detalles sobre los archivos, como propiedadades y permisos, agregando la bandera -l al comando ls.

ls -l

Puedes ver los archivos ocultos en el directorio actual pasando la bandera -a al comando ls.

ls -a

pwd

Puedes averiguar dónde te encuentras en relación con el resto del sistema de archivos utilizando el comando pwd.

pwd

cd

Puedes navegar a diferentes directorios usando el comando cd.

cd /ruta/a/otra/carpeta

cat

Puedes verificar el contenido de un archivo usando el comando cat.

cat /ruta/al/archivo/nombre_del_archivo

less

Para archivos de entrada grandes, el comando less permite el movimiento dentro de los archivos. La sintaxis es similar a la del comando cat, pero puede moverse.

Leyendo archivos grandes usando less

less /ruta/al/archivo/nombre_del_archivo

El comando te proporcionará una vista desplazable del contenido dentro del archivo, hasta el final del contenido del archivo. Puedes desplazarte hacia abajo usando Enter y salir de la vista presionando q.

Crear carpetas/directorios (mkdir)

Los directorios/carpetas en Linux se crean usando el comando mkdir. El comando toma el nombre del directorio como argumento.

mkdir nombre_carpeta

Se pueden proporcionar varios directorios como argumentos y mkdir los creará todos.

mkdir dir1 dir2 dir3 

Parámetros

mkdir puede aceptar 3 opciones

  • p – permite a mkdir crear directorios padre en caso de no existir
  • m – se utiliza para asignar permisos durante la creación del directorio
  • v – ejecuta el comando en modo verbose

Eliminar carpetas/directorios vacios (rmdir)

Para eliminar directorios vacíos, se utiliza el comando rmdir. El nombre del directorio que se eliminará se pasa como argumento.

rmdir nombre_dir

Se pueden pasar varios nombres de directorios como argumentos y rmdir los eliminará todos.

rmdir dir1 dir2 dir3

Parámetros

rmdir toma solo una opción, que le dice que elimine los directorios padre si también están vacíos.

  • p – elimina los directorios padre si también se encuentran vacios

Crear archivos (touch)

De forma predeterminada, el comando touch se utiliza para cambiar los tiempos de modificación y acceso de un archivo. Si el archivo no existe, el comando touchse usa para crear un archivo con permisos predeterminados.

touch nombre_archivo

Parámetros

  • c – previene la creación de un nuevo archivo si no existe

Copiar y mover archivos y carpetas/directorios (cp, mv)

cp

El comando cp se usa para hacer una copia de uno o más directorios o archivos. El comando toma al menos un nombre de origen y un nombre de destino. Si el destino es un archivo, la fuente también debe ser un archivo. Se hará una copia de la fuente con el nuevo nombre proporcionado en el destino. Si no se especifica el nombre de destino, se realizará una copia de la fuente en el directorio de destino con el mismo nombre. Si ya existe un archivo con el nombre de destino en el directorio de destino, será reemplazado. Si el destino es un directorio existente, todas las fuentes (una o más) se copiarán en el directorio de destino. Si el destino es un directorio que no existe, entonces la fuente también debe ser un directorio. Se realizará una copia del directorio y su contenido en el destino con el mismo nombre.

cp /ruta/archivo/fuente /ruta/archivo/destino
cp /ruta/directorio/origen /ruta/directorio/destino

mv

El comando mv se usa para mover uno o más archivos o directorios a una ubicación diferente, o cambiarles el nombre por un nuevo nombre. Se debe pasar al menos un directorio o nombre de archivo de origen y destino. El comando mv sigue las reglas para directorios o archivos existentes o no existentes, al igual que cp.

mv /ruta/archivo/origen/nombre_archivo /ruta/archivo/destino/nombre_archivo

El directorio original no contiene el archivo ahora. Se ha movido al nuevo directorio destino.

rm

El comando rm se usa para eliminar uno o más archivos. Debe proporcionar al menos un argumento para eliminar.

rm /ruta/archivo/nombre_archivo

Buscar dentro de archivos (grep)

grep es un comando de Linux súper poderoso que se utiliza para buscar en archivos la aparición de una cadena de caracteres que coincida con un patrón específico. Podemos usar el comando en combinación con un montón de opciones y banderas diferentes para una búsqueda eficiente.

Parámetros

  • r – busca de manera recursiva
  • w – indica que el patrón/palabara entero debe de coincidir
  • n – solo el número de línea
  • e – indica que coincida el patrón
  • –include y –exclude – incluyo o excluye archivos en la búsqueda
  • –include-dir e –include-dir – incluye o exluye directorios en la búsqueda