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 …

Instalar openstack en ubuntu 20.04 (virtualizado)

El propósito del post de hoy es investigar un poco sobre openstack. Openstack es un conjunto de programas que permiten la creación de entornos virtuales donde desplegar tus aplicaciones.

Mi idea era instalarlo en un contenedor lxc, pero no ha sido posible, nisiquiera activando el modo nested virtualization, así que la única solución ha sido instalarlo en un kvm. Mi objetivo final es ver qué posibilidades me ofrece openstack para reemplazar la infraestructura actual que tengo desplegada con proxmox.

En ésta primera prueba vamos a instalar openstack usando devstack que consiste en un conjunto de scripts que van a instalar todo lo necesario para tener un openstack completo funcionando. Si la cosa avanza, vendrán otros posts de como desplegar openstack en un cluster de 4 maquinas. En el siguiente gráfico podemos ver de que partes se compone openstack

Cada uno de los componentes tiene una función:

Dashboard: Llamado Horizon, va a ser el interfaz web para gestionar openstack. Está desarrollado en python y django (cosa que me ha alegrado muchísimo!)
Identity: Llamado Keystone, se encarga de la autenticación de los usuarios en el sistema de openstack y la asignación de permisos.
Image: Llamado glance, que es donde se pueden consultar las imágenes disponibles
Object Storage: Llamado swift, que es donde están almacenadas las imagenes
Compute: Llamado nova, que es quien se encarga de desplegar las imágenes según las necesidades de cómputo que se necesiten
Network: Llamado neutron, que …

Proxmox: habilitar virtualización anidada (nesting virtualization)

Uno de los problemas que me estoy encontrando últimamente es que los contenedores lxc que instalo con debian 10 no arrancan los servicios porque tengo que reconfigurar systemd para decirle que el PrivateTmp es false, por ejemplo para poder levantar apache2 tendría que hacer ésto

Job for apache2.service failed because the control process exited with error code.
See "systemctl status apache2.service" and "journalctl -xe" for details.
invoke-rc.d: initscript apache2, action "start" failed.
* apache2.service - The Apache HTTP Server
   Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Wed 2020-07-01 16:35:29 UTC; 9ms ago
     Docs: https://httpd.apache.org/docs/2.4/
  Process: 11730 ExecStart=/usr/sbin/apachectl start (code=exited, status=226/NAMESPACE)

Jul 01 16:35:29 wordpress systemd[1]: Starting The Apache HTTP Server...
Jul 01 16:35:29 wordpress systemd[11730]: apache2.service: Failed to set up mount namespacing: Permission denied
Jul 01 16:35:29 wordpress systemd[11730]: apache2.service: Failed at step NAMESPACE spawning /usr/sbin/apachectl: Permission denied
Jul 01 16:35:29 wordpress systemd[1]: apache2.service: Control process exited, code=exited, status=226/NAMESPACE
Jul 01 16:35:29 wordpress systemd[1]: apache2.service: Failed with result 'exit-code'.
Jul 01 16:35:29 wordpress systemd[1]: Failed to start The Apache HTTP Server.

# vi /lib/systemd/system/apache2.service
PrivateTmp=false
:wq
# systemctl daemon-reload
# systemctl start apache2.service

Pero me encuentro el mismo problema con otros servicios que instalo.

Por lo que entiendo systemd crea como una especie de “entorno virtual” para cada uno de los servicios y para que funcione correctamente, leyendo documentación veo que la solución es habilitar la virtualización anidada.

Así que en la documentación de proxmox encontramos ésta página que nos dice como hacerlo.

Tendremos …

Instalar entorno de producción de python

Una vez hemos desarrollado una aplicación con django nos interesará ponerla en producción. La forma correcta de hacerlo es usando uwsgi + nginx. Así que vamos a ello.

Mi aplicación corre sobre postgresql así que instalaremos los siguientes paquetes

# apt -y install nginx uwsgi uwsgi-plugin-python3 postgresql python3-psycopg2 libpq-dev git virtualenv memcached

Creamos el usuario y la base de datos postgresql

# su - postgres
$ createuser colibri_user
$ createdb -O colibri_user colibri_db
$ psql colibri_db
colibri_db=# alter user colibri_user with encrypted password 'XXXXXXXX';
colibri_db=# grant all privileges on database colibri_db to colibri_user;

Ahora clonamos el código del programa en /var/www

# cd /var/www/
# git clone git@git.capa8.net:blackhold/colibri.git

Creo el entorno virtual

# cd colibri
# virtualenv -p python3 venv

Entro en el entorno virtual y ejecuto los comandos necesarios para iniciar la aplicación

# source venv/bin/activate
# pip install -r requirements.txt
# ./clean.sh
# python manage.py runserver 0.0.0.0:5001

Ahora configuramos uwsgi para que apunte donde está nuestra aplicación de django

# cd /etc/uwsgi/apps-available
# vi colibri.ini
[uwsgi]
master = true
processes = 10
socket = /tmp/uwsgi-colibri.sock
uid = www-data
gid = www-data

;# with appropriate permissions - *may* be needed
;chmod-socket    = 664

chdir = /var/www/colibri
module = colibri.wsgi
home = /var/www/colibri/venv/
vacuum = true
env = DJANGO_SETTINGS_MODULE=colibri.settings
safe-pidfile = /tmp/uwsgi-colibri.pid
;harakiri = 20 # respawn processes taking more than 20 seconds
;limit-as = 128 # limit the project to 128 MB
max-requests = 5000
daemonize = /var/log/uwsgi/colibri.log
;callable = application
plugin = python37

Guardamos y lo activamos en …

Proxy nginx: Redirigir las IPs reales

Me encuentro con una aplicación la cual tengo detrás de un frontal de nginx. La cuestión es que la petición al servidor llega con la IP interna del frontal de nginx en lugar de la IP real del cliente.

Para ello tendremos que realizar una configuración en el frontal de nginx para pasar la IP real del usuario y otra en el nginx de la aplicación para que interprete correctamente la IP.

Frontal nginx

root@frontal1-nginx:~# vi /etc/nginx/sites-enabled/app.capa8.net
server {
    listen 80;

    server_name app.capa8.net;
    return 301 https://app.capa8.net$request_uri;
    #root /var/www/html/;
}

server {
        server_name app.capa8.net;

        listen 443 ssl;
        ssl_certificate /etc/letsencrypt/live/app.capa8.net/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/app.capa8.net/privkey.pem;
        include /etc/letsencrypt/options-ssl-nginx.conf;
        ssl_trusted_certificate /etc/letsencrypt/live/app.capa8.net/chain.pem;

        location / {
                proxy_set_header  Host $host;
                proxy_set_header  X-Real-IP $remote_addr;
                proxy_set_header  X-Forwarded-Proto https;
                proxy_set_header  X-Forwarded-For $remote_addr;
                proxy_set_header  X-Forwarded-Host $remote_addr;
                proxy_pass http://192.168.100.15:80;
        }
}

nginx Aplicación

Siendo set_real_ip_from la subred por donde pueden venir las peticiones de proxy

root@app:~# vi /etc/nginx/sites-enabled/app
server {
    listen 80;
    server_name app.capa8.net;

    set_real_ip_from 192.168.100.0/24;
    real_ip_header X-Real-IP;
    real_ip_recursive on;

    location / {
        include uwsgi_params;
        uwsgi_pass unix:/tmp/uwsgi-app.sock;
    }

    # /static
    location /static/ {
        autoindex off;
        root /var/www/app/web/;
    }

    location /static/admin {
        autoindex off;
        root /var/www/app/venv/lib/python3.5/site-packages/django/contrib/admin/;
    }
}

Reiniciamos ambos nginx y comprobamos en los logs que la ip pasa correctamente.

Fuente: Forward IP Addresses with NGINX Proxy

Redirección de puertos con iptables + contrack

Pues seguimos con éstos pequeños errores que hemos cometido siempre y que ahora en un momento de cambios y con mucho mas entendimiento llegan mejores soluciones para que las cosas funcionen mejor (tanto a nivel técnico como personal). Hoy estoy tiernecilla y quiero agradecer con éste post todas éstas personas que seguís los posts que publico y tenéis al igual que yo éste blog como una herramienta de consulta, un lugar claro, sin muchas complicaciones donde encontrar justo aquello que necesito en cada momento o me da la pista para poder seguir avanzando con algo mas grande que estoy construyendo con el paso de los días.

Ésta vez me encuentro solucionando un problema que inicialmente parecía de nginx pero ha resultado ser de iptables, y es que las cosas nunca son lo que parecen a primera vista y es necesario tener un gran conocimiento del sistema para entender como poder solucionar los problemas de base y encontrar una solución definitiva que evita fallos futuros, para casos como hoy que ya en producción me encuentro con un problema grave de base. Para que un sistema funcione bien, las capas inferiores (base) deben estar bien.

Me dejo ya de palabrerías y comentarios dobles y me pongo en materia. El post que rectifico es éste: Proxmox + nat + iptables.

Gracias a las configuraciones de las antenas en los supernodos entiendo que se deben marcar los paquetes tanto de entrada (prerouting) como de salida (postrouting). En TCP hay una llamada de un …

Debian 10: Problema al hacer dpkg -i paquete.deb

Acabo de instalar mi primera debian con entorno gráfico con cinnamon y veo que le faltan bastantes cosillas

# apt -y install mate-terminal pluma glances mtr net-tools dnsutils

Y también que al hacer dpkg -i de algun paquete me suelta éste error:

# dpkg -i google-chrome-stable_current_amd64.deb 
dpkg: avís: no s'ha trobat «ldconfig» en el PATH o no és executable
dpkg: avís: no s'ha trobat «start-stop-daemon» en el PATH o no és executable
dpkg: s'ha produït un error: no s'han trobat 2 programes esperats al PATH, o no són executables
Nota: el PATH del root normalment ha de contenir /usr/local/sbin, /usr/sbin i /sbin

El motivo es que necesitamos definir los directorios donde se encuentran los binarios del sistema:

# echo 'export PATH=$PATH:/usr/local/sbin:/usr/sbin:/sbin' /home/aspertic/.bashrc
# echo 'export PATH=$PATH:/usr/local/sbin:/usr/sbin:/sbin' /root/.bashrc

Salimos de la sesión de terminal del usuario y la volvemos a iniciar y ta-dá!

Recuerdo que si un paquete no deja instalar las dependencias, tenemos que forzar la instalación manual con apt -f install

root@aspertic01:/home/aspertic/Baixades# dpkg -i teamviewer_14.5.1691_amd64.deb 
S'està seleccionant el paquet teamviewer prèviament no seleccionat.
(S'està llegint la base de dades… hi ha 173445 fitxers i directoris instal·lats actualment.)
S'està preparant per a desempaquetar teamviewer_14.5.1691_amd64.deb…
S'està desempaquetant teamviewer (14.5.1691)…
dpkg: problemes de dependències impedeixen la configuració de teamviewer:
 teamviewer depèn de libqt5gui5 (= 5.5) | qt56-teamviewer; tot i així:
  El paquet libqt5gui5 no està instal·lat.
  El paquet qt56-teamviewer no està instal·lat.

 [...]

dpkg: s'ha produït un error en processar el paquet teamviewer (--install):
 problemes de dependències - es deixa sense