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 …

Resetear switch dell powerconnect 5524 por consola

Hoy volvemos a usar de nuevo éste prehistórico sistema de comunicación por puerto serie, y ésta vez con un cable de ethernet a puerto serie y el conversor de serie a USB.

El motivo es el de resetear un par de switches dell powerconnect 5524.

Lo primero será conectar el cable ethernet en el puerto de management del switch, el cable serie con el adaptador y el adaptador al ordenador por USB.

A continuación lo que haremos será configurar gtkterm con ésta configuración

Una vez conectados, podremos interaccionar con el switch

Así que vamos a lo siguiente que es lo que me interesa hacer con éstos switch, el reset de fábrica para configurar la ip y reestablecer el password del usuario admin

Hacer reset de fábrica

console> enable
console# delete startup-config
console# reload
y
y

Al reiniciar nos pedirá la configuración de red y el nombre de usuario y contraseña que usaremos para acceder via web.

A continuación otros comandos interesantes
Cambiar el password del usuario

console> enable
console# config
console# username admin password ****
console> enable
console# host myhostname
console# snmp-server community public ro

Aplicar configuración

console> enable
console# config
console(config)# host switch24-2
switch24-2(config)# exit
switch24-2# copy run start
Overwrite file [startup-config] ?[Yes/press any key for no]....01-Oct-2006 17:41:30 %COPY-I-FILECPY: Files Copy - source URL running-config destination URL flash://startup-config
01-Oct-2006 17:41:34 %COPY-N-TRAP: The copy operation was completed successfully
Copy succeeded
switch24-2# copy run backup
01-Oct-2006 17:41:38 %COPY-I-FILECPY: Files Copy - source URL running-config destination URL flash://backup
.01-Oct-2006 17:41:40 %COPY-N-TRAP: The 

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 …

Arreglando el script de hacer backup con mikrotik

Actualizo éste script/post para que si por algún motivo no pueda conectar con el router mikrotik haga timeout y siga con el Backup.

root@xava-ftp:~/scripts# cat /root/scripts/backup_mikrotiks_SN.sh 
#!/bin/bash

############################################
# SCRIPT CREATED BY: Laura Mora i Aubert   #
# SCRIPT DATE: 2019-11-27                  #
# WEBSITE: http://blackhold.nusepas.com    #
# INFO: Script that allows remote backup   #
#       of Mikrotik Routers.               #
#       tested on 5.x & 6.x routers        #
# LICENSE: creative commons (by:sa)        #
############################################

############################################
#             INSTRUCTIONS                 #
############################################
#                                          #
# 1. Generate ssh-keys on your server      #
#      cd ~/.ssh                           #
#      sh-keygen -t dsa                    #
#                                          #
# 2. Rename pubkey                         #
#      cp .ssh/id_dsa.pub backupkey        #
#                                          #
# 3. Put the file on MKT Router            #
#      ftp x.x.x.x                         #
#      ftpbin                            #
#      ftpput backupkey                  #
#      ftpbye                            #
#                                          #
# 4. Import pubkey in MKT Router           #
#      telnet x.x.x.x                      #
#      [admin@mikrotik] /user ssh-keys\    #
#       import user=admin\                 #
#       public-key-file=backupkey          #
#                                          #
# 5. Access with ssh to the MKT Router     #
#                                          #
# 6. [SCRIPT] Change USER  and ID values   #
#                                          #
# 7. Run the script!                       #
#                                          #
############################################

############################################
#               OTHERS                     #
############################################
#                                          #
# If you have bruteforce login rules,      #
# add your backup server IP in the last    #
# rule: src-address=!SERVERIP              #
#                                          #
############################################ 

# Change username
USER=blackhold
BACKUP_DIR="/root/backups/capa8"


if [ ! -d "${BACKUP_DIR}" ]; then
	mkdir -p ${BACKUP_DIR}
fi

cd ${BACKUP_DIR}

# delete 

Pyocclient: Apuntes

Abro éste post para ampliar un poco como se usa pyoocclient, una librería de python para gestionar un nextcloud. En éste post voy a mostrar como he solucionado el tema de crear directorios, subir ficheros, compartir ficheros, descargar un fichero (binario) y eliminar ficheros, pero la librería permite incluso hacer gestión de usuarios y algunas cosas mas, realmente da para seguir jugando :) En página podéis ver el código de la librería.…

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 …

El apareamiento de los dispositivos bluetooth

Llego a casa después de trabajar y me dispongo a tener mi momento de relax, con música variada de fondo con mi flamante y de la que estoy orgullosísima JBL Charge 4. Al reinstalar la debian de mi portátil éste fin de semana me ha tocado configurar el bluetooth, una tarea no demasiado compleja y que no requiere muchas habilidades, por no ser que sólo la hacemos una vez cada mil y nunca nos acordamos como era, así que nos perdemos en el concepto y entre haber pulsado todos los botones habidos y por haber, desistimos.

El funcionamiento de bluetooth es

1. encender ambos dispositivos
2. emparejar
3. conectar
4. reproducir/mandar señal de audio

¡Siempre pecamos por saltarnos el paso 2! así que antes para conectar dos dispositivos que no se habían emparejado antes, deben emparejarse. Si, al igual que los humanos (si lo comparamos con una óptica tradicional y reptiliana).
Según dice la tradición, para que dos personas se puedan conectar y transmitir flujo de datos (ya me entendéis…), antes deben emparejarse/aparearse. ¡Encima aquí los dispositivos pueden irse con otros!

La cuestión es que a medida que va evolucionando la tecnología bluetooth, además de la calidad de la señal, compresión, etc. vienen mejoras tan buenas como el emparejamiento con dispositivos similares para por ejemplo, ya que estamos hablando de altavoces bluetooth, conectar decenas de ellos para cubrir un área entera o el multi-emparejamiento, que permite tener conectado varios dispositivos (el comportamiento es que el último que manda señal de …

do ut des

Éste es el estandarte de una de las Asociaciones las cuales capitaneo junto a Josep Jover, Aspertic.
El término nace del mal uso del “quid pro quo” que significa un intercambio directo y comúnmente material, cadena de favores, etc., el “quid pro quo” lo veo como la base del capitalismo agresivo, cuando el “do ut des” es mas el dar para después (y ya veremos, si hay un trato justo) recibir.

Anoto de la wikipedia el siguiente fragmento

En ocasiones nos encontramos con un mal uso en castellano de quid pro quo en lugar de do ut des, como en tantas ocasiones, por influencia del inglés. Esto sucede porque en inglés la expresión quid pro quo comenzó a aplicarse por error para referirse a la reciprocidad en un trato explícito o implícito, en un intercambio de favores, o en cualquier tipo de relación social o interpersonal, especialmente en las negociaciones en las que debe haber beneficios o cesiones equivalentes por cada parte; del modo en que se usan las expresiones castellanas «toma y dame» o «toma y daca» y las expresiones inglesas what for whatgive and take y this for that, en lugar de utilizar la locución latina apropiada para este caso, do ut des («doy para que des»).

Y refiriéndose al término “do ut des”

Esta es una expresión latina que significa literalmente «doy para que des».2​ Se usaba para referirse a la reciprocidad de cualquier trato o pacto. Del mismo modo, era

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