Docker network + macvlan

Seguimos con los posts de docker y ahora toca uno sobre el tema de networking.

La necesidad básica es la de publicar a Internet un servidor web con nginx. En lugar de definir la IP pública al servidor docker nos interesa ponerla dentro del contenedor de nginx y luego que él sea el que tenga acceso al resto de máquinas.

El servidor de docker con el que estoy trabajando es una máquina física con debian con una IP de guifi (10.90.234.170) y en el datacenter donde está en la VLAN 138 está el rango de IP públicas (5.10.205.128/27).

Crear la network

Docker por defecto trae 3 networks, por defecto cuando creamos un contenedor nuevo asigna la red bridge (driver bridge) 172.17.0.0/16

root@wezen02:~# docker network ls
NETWORK ID          NAME                           DRIVER              SCOPE
f9e3dcfa1e06        bridge                         bridge              local
262f24ac9f10        host                           host                local
c4572142389a        none                           null                local

Para crear una nueva red y vincularla a la vlan correspondiente usaremos lo siguiente:

# docker network create -d macvlan -o parent=eno1.138 public

Cuando creamos una nueva red docker le asigna un rango por defecto correlativo al último rango creado, por ejemplo 172.18.0.0/16 pero nos interesa que cuando asignemos ésta network a un contenedor le asigne una IP de nuestro rango público.

# docker network rm public
# docker network create -d macvlan -o parent=eno1.138 public --subnet=5.10.205.128/27 --gateway=5.10.205.129 --ip-range 5.10.205.152/29

Con –subnet indicamos la red en la que trabaja la network, –gateway la puerta de enlace de nuestro router e –ip-range el rango que asignará automáticamente a los …

Servicios postmaster gmail y hotmail: los correos de mi servidor llegan a SPAM

Pues después de varios meses tratando de solucionar éste problema, creo que porfin lo he resuelto! al menos la teoría es ésta a la fecha de éste post.

Es muy común que proveedores de correo electrónico como Gmail o Hotmail cuando reciben los correos electrónicos desde nuestro servidor de correo nos manden los correos electrónicos de nuestras cuentas a SPAM, cosa que hace que se pierdan correos en el limbo y se generen problemas como clientes perdidos, plazos finalizados o otros problemas comunes.

Para ello tenemos que entender la complejidad de un sistema de correo electrónico y los motivos porqué un correo electrónico entra como SPAM.

Una lista de los problemas mas comunes son:
– IP en una blacklist
– Open Relay
– DNS (DKIM/DMARC)
– postmaster

Voy a detallar pues los errores mas comunes y como verificar que tenemos una configuración correcta.

IP en una blacklist

Hay unas páginas web que se encargan de recolectar IPs y rangos de IPs sospechosamente maliciosos. Los servidores de correo se configuran para verificar cada una de las listas de éstas páginas web. Una forma de verificar si tu IP está en una blacklist de éstas te recomiendo usar ésta página web que comprueba automáticamente si tu IP está listada en alguna de las listas mas comunes.

Si tu IP aparece en alguna de las blacklist te tocará ir página por página y pedir que retiren tu IP de su blacklist. Normalmente las páginas funcionan correctamente pero hace unos meses había una …

Caso real de despliegue con Docker Compose

Hago éste post con muchísima ilusión por tener la sensación de haber hecho un muy buen trabajo y haber asentado los conocimientos adquiridos en el curso de DevOPs que hice ya hace unas 3 semanas. Ya lo he hecho personalmente y ahora lo hago públicamente, pero le doy las infinitas gracias a Sens Solutions por confiar en mi y por la gran oportunidad de hacer un trabajo de éste tipo sabiendo que partía de unos conocimientos muy básicos! También a Alberto García por la formación ofrecida y el cuál no he tenido que contactar para resolver dudas (de momento).

Así que mi aportación de retorno es explicar como lo he hecho y que pueda servir a otras personas que como yo se están adentrando a éste mundo de Docker.

Para éste post recomiendo antes de todo revisar éstos dos posts que hice hace ya unas semanas: Comandos básicos de Docker y Introducción al trabajo con Dockerfile.

Con Dockerfile tenemos una receta para desplegar un contenedor (o container). Con docker-compose tenemos pues una receta para desplegar un conjunto de contenedores que interactuarán entre ellos. El caso (real) que voy a desarrollar en éste post considero que es muy didáctico porqué desplegaremos contenedores sin usar Dockerfile y otros los vamos a desplegar usando Dockerfile, una vez desplegados los vamos a vincular entre ellos. Prometo un post extenso y completo :)

El entorno que necesitamos desplegar consiste en:
– 1 contenedor con mariadb (dockerhub)
– 1 contenedor con una aplicación django, backend …

Introducción al trabajo con Dockerfile

Continuamos con los posts de Docker, en éste otro post hemos visto los comandos básicos para manejarnos con docker. Ahora vamos a entrar con Dockerfile para después centrarnos en docker-compose.

DOCKERFILE
El dockerfile consiste en un fichero con el nombre “Dockerfile” el cual contiene una “receta” para construir una imagen para después desplegarla como contenedor. Éste fichero lo encontraremos solo o acompañado de ficheros que se usarán para el despliegue del contenedor. Éste fichero tiene unas palabras reservadas que atienden a lo siguiente (se describen los mas usados):

FROM indica cuál es la imagen en la que se basa el contenedor que vamos a crear

MAINTAINER los datos del autor de la imagen
Sintaxis: MAINTAINER

RUN Esta instrucción ejecuta cualquier comando en una capa nueva encima de una imagen y hace un commit de los resultados. Esa nueva imagen intermedia es usada para el siguiente paso en el Dockerfile. Cuando creamos una imagen nos interesa hacerla con el mínimo de capas posible. RUN tiene 2 formatos
Sintaxis: RUN comando
Sintaxis: RUN [“ejecutable”, “parametro1”, “parametro2”]

ENV variables de entorno a pasar al crear el contenedor (-e)
Éstas variables pueden usarse dentro de cualquier fichero del entorno, por ejemplo un script ejecutable. Éstos son los valores por defecto a menos que se especifique otro en -e
Sintaxis: ENV key value
Sintaxis: ENV key=value

ADD/COPY copiar ficheros o directorios que se encuentran en el mismo sitio que el Dockerfile hacia dentro del contenedor. ADD permite descargar un fichero alojado por http.

Sintaxis: …

Comandos básicos de Docker

El otro día vimos como instalar un cluster de docker con swarm. Mas adelante veremos como se monta un cluster de Docker con Kubernettes. Tanto Swarm como Kubernettes son orquestadores de docker y para entender como funcionan antes debemos entender como usar Docker a pelo.

Docker puede funcionar perfectamente en una sola máquina y no es necesario montar un cluster, para tenerlo a mano, pego en modo resumen la parte de instalación de docker del anterior post (instalación en Debian):

root@docker-master:~# apt update && apt -y upgrade && apt -y dist-upgrade
root@docker-master:~# apt-get remove docker docker-engine docker.io containerd runc
root@docker-master:~# apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
root@docker-master:~# curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
root@docker-master:~# apt-key fingerprint 0EBFCD88
root@docker-master:~# add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
root@docker-master:~# apt update
root@docker-master:~# apt-get install docker-ce docker-ce-cli containerd.io

Una vez instalado Docker, voy a explicar de que va ésto.

Docker es un software de virtualización. La virtualización nace en AIX, el sistema operativo de los mainframes de IBM. La virtualización nace de la necesidad de correr otros sistemas operativos dentro de un sistema operativo. A lo largo de los años y a medida que los servidores y ordenadores de sobremesa han sido mas potentes, han ido apareciendo muchos programas y métodos de virtualización.
Por un lado tenemos los sistemas de virtualización de un sistema operativo entero como podrían ser VirtualBox, VMWare, KVM, Xen, etc. y mas adelante salieron otros sistemas que compartían el núcleo del sistema operativo (kernel) con el host.…

Instalar cluster docker (swarm) + portainer.io

Ésta semana y la anterior estoy con un curso de DevOPs. En él estamos viendo principalmente docker y los orquestadores swarm y kubernetes.
En éste post nos vamos a centrar de momento con swarm.

Swarm viene “instalado” cuando instalamos docker y no tendremos que instalar nada addicional, simplemente configurarlo que lo veremos mas adelante.

Primero de todo pues tendremos que instalar docker, pero no usaremos los paquetes del repositorio, sino que vamos a seguir la instalación de la página web de docker para debian.

El entorno donde vamos a instalar docker van a ser 3 máquinas virtuales con KVM, docker-master (172.31.0.201), docker-worker1 (172.31.0.202) y docker-worker2 (172.31.0.203). La instalación la repetimos en las 3 máquinas.

Instalar docker

Comprobamos que docker no esté instalado y si lo está, lo desinstalamos

root@docker-master:~# apt update && apt -y upgrade && apt -y dist-upgrade
root@docker-master:~# apt-get remove docker docker-engine docker.io containerd runc

Instalamos las dependencias necesarias

root@docker-master:~# apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

Añadimos la clave GPG

root@docker-master:~# curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
root@docker-master:~# apt-key fingerprint 0EBFCD88

Configuramos el repositorio “stable”

root@docker-master:~#  add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"

Instalamos docker

root@docker-master:~# apt update
root@docker-master:~# apt-get install docker-ce docker-ce-cli containerd.io

A partir de aquí ya tenemos docker instalado y procederemos a montar el cluster swarm.

Activar cluster swarm

A continuación, montaremos 1 master y 2 workers. La recomendación es tener mínimo 3 master y 3 workers. En swarm, un master puede actuar como worker. De momento en el entorno que estamos …

Instalar JDK Oracle en Debian + javaws

La receta de hoy pues sale tras la necesidad de acceder a la ILO/iDrac de un servidor Dell Poweredge R320. En varios sitios de internet te dicen que simplemente instalar el paquete icedtea-netx te vale, pero en mi caso no me termina de funcionar, así que he decidido probar un poco con el software privativo de oracle a ver qué tal respiraba la cosa, ya que en la máquina virtual windows que uso para acceder a otras ILO/iDrac en ésta versión de ILO/iDrac hay algún problema y no carga tampoco (quizás versiones de java demasiado viejas).

Así que primero iremos a la web de oracle y nos descargaremos el .tar.gz para linux de 64 bits.

A continuación lo descomprimimos en /usr/lib/jvm

# mkdir /usr/lib/jvm
# tar zxvf jdk-8u261-linux-x64.tar.gz -C /usr/lib/jvm

Y finalmente definimos los programas por defecto (update-alternatives crea un link simbólico en /etc/alternatives/ a la ubicación del binario y otro en /usr/bin/ a /etc/alternatives)

# update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jvm/jdk1.8.0_261/bin/java" 1
# update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk1.8.0_261/bin/javac 1
# update-alternatives --install /usr/bin/javaws javaws /usr/lib/jvm/jdk1.8.0_261/bin/javaws 1

Y luego para hacer funcionar el control remoto de la iDrac, entramos por http en ella y le indicamos “Launch Virtual Console”, nos descarga el fichero viewer.jnlp y lo ejecutamos así

$ javaws viewer.jnlp

Instalar asterisk con odbc + configurar odbc mariadb

Debido a una de las migraciones de servidores de un proxmox a otro, me he encontrado que la vieja debian 8 donde tenía instalado el servidor de telefonía, no arrancaba, así que he instalado asterisk en una debian 10, dentro de un contenedor lxc y con nesting activado.

Lo primero de todo será instalar asterisk

root@asterisk:~# cd /usr/src/
root@asterisk:/usr/src# wget http://downloads.asterisk.org/pub/telephony/certified-asterisk/asterisk-certified-16.8-current.tar.gz
root@asterisk:/usr/src# tar xvzf asterisk-certified-16.8-current.tar.gz
root@asterisk:/usr/src# cd asterisk-certified-16.8-cert3/contrib/scripts
root@asterisk:/usr/src/asterisk-certified-16.8-cert3/contrib/scripts# ./install_prereq
root@asterisk:/usr/src/asterisk-certified-16.8-cert3/contrib/scripts# ./get_mp3_source.sh
root@asterisk:/usr/src/asterisk-certified-16.8-cert3/contrib/scripts# cd ../../
root@asterisk:/usr/src/asterisk-certified-16.8-cert3# ./configure
root@asterisk:/usr/src/asterisk-certified-16.8-cert3# make menuselect
root@asterisk:/usr/src/asterisk-certified-16.8-cert3# make
root@asterisk:/usr/src/asterisk-certified-16.8-cert3# make install
root@asterisk:/usr/src/asterisk-certified-16.8-cert3# make config
root@asterisk:/usr/src/asterisk-certified-16.8-cert3# make samples

En el make menuselect activar chan_inunavailable, chan_sip, func_odbc

y con asterisk -vcccccccccccccc vemos como arranca asterisk y los errores

[Jul 21 00:14:03] WARNING[615]: res_odbc.c:1067 odbc_obj_connect: res_odbc: Error SQLConnect=-1 errno=0 [unixODBC][Driver Manager]Data source name not found, and no default driver specified

Para solucionar éste error, ahora configuraremos el odbc

root@asterisk:~# apt -y install unixodbc odbcinst

Ahora nos descargamos las librerías ya compiladas para debian buster

root@asterisk:~# wget https://downloads.mariadb.com/Connectors/odbc/connector-odbc-3.1.9/mariadb-connector-odbc-3.1.9-debian-buster-amd64.tar.gz
root@asterisk:~# tar xvzf mariadb-connector-odbc-3.1.9-debian-buster-amd64.tar.gz
root@asterisk:~# cd mariadb-connector-odbc-3.1.9-debian-buster-amd64
root@asterisk:~# cp lib/mariadb/lib*.so /usr/lib/x86_64-linux-gnu/odbc/

Ahora configuramos los ficheros odbc.ini y odbcinst.ini

root@asterisk:~# vi /etc/odbcinst.ini
[MySQL]
Description = ODBC para MySQL
Driver = /usr/lib/x86_64-linux-gnu/odbc/libmaodbc.so
FileUsage = 1
root@asterisk:~# vi /etc/odbc.ini
[asterisk]
Description = MySQL Asterisk
Driver = MySQL
Database = asterisk
Server = localhost
User = xxxxx
Password = xxxxx
Port = 3306
Option = 3
Socket=/var/run/mysqld/mysqld.sock

[asterisk_users]
Description = MySQL Asterisk
Driver = MySQL
Database = users
Server = localhost
User = xxxxx
Password = xxxxx
Port = 3306
Option = 3
Socket=/var/run/mysqld/mysqld.sock

Es importante …

Centreon: Tunnear gráfico de red

Tras la instalación y configuración básica de centreon, seguimos con el tunneo en éste caso de las gráficas de red.

La configuración por defecto no refleja claramente el tráfico de entrada y de salida. El tráfico de entrada tiene un valor negativo y no se visualiza en la gráfica, además de que prefiero dejarlo con la visualización que tiene mikrotik, verde y rellenado para tráfico de entrada y línea azul sin rellenar para el tráfico de salida.

Así que iremos a Monitoring Performance Curves y filtraremos por la cadena “traffic”

Nos aparecen 2, el inbound y el outbound

Para inbound lo dejamos así (cambiamos el color, desactivamos el invert)

Y para el outbound así (cambiamos el color, desactivamos el filling y aumentamos el thickness de la línea)

Y la cosa quedará así (éste es otro gráfico de red, para que se pueda ver bien como queda)

Y listo! ahora quizás lo siguiente que haré será configurar gráficas para que generen el 95 percentil, una medida que usamos los operadores. Actualización: Ni caso, no funciona. Tocará en unas horas o días otro post sobre éste tema :P…

Instalar centreon 20.04 (y configuración inicial)

Pues después de mucho tiempo vuelvo a centreon. He probado zabbix, grafana, etc. todos muy guays pero a la hora de configurarlos simplemente me pierdo, así que vuelvo a lo ya conocido y aprovecho para refrescar conocimientos.

Hago un manual porque me puse a instalarlo a saco y luego el poller no arrancaba no sé muy bien porqué, así que hice lo que un jefe sabiamente me recomendó al instalar una impresora y al ver que sobraban piezas que debía leer el manual. Así que aprovecho para hacer la versión en castellano.

Lo primero de todo será descargar la iso de centreon 20.04. También hay la opción de descargarse una máquina ya preparada para virtualbox y vmware. Como voy a instalarlo en un qemu uso la iso. También existe la opción de instalarlo como paquete (sobre centos) o usando los ficheros source.

Así que proseguimos con la instalación con la iso.

De mientras vamos creando la máquina qemu con los requisitos necesarios. En mi caso le pongo 6Gb de RAM y 60Gb de disco duro.

Una vez descargada la iso arrancamos la máquina virtual e iniciamos la instalación y le indicamos “Install CentOS 7”:

Seleccionamos el idioma de la instalación:

Y nos aparece la siguiente pantalla en la que tendremos que configurar varias cosas:

La primera será indicar el tipo de instalación:

Central with database: Instala Centreon (la interfaz web y la base de datos), el motor de monitoreo y el Broker.
Central without database: Instala …