Configuración de Passthrough para proxmox

Buenas y perdón por la desconexión que he tenido del blog, a ver si puedo ir metiendo poco a poco cada vez mas cositas en la cuales he ido trabajando.

Hoy toca proxmox y la configuración de Passthrough. ¿Esto que es? Para simplificar, esto trata de darle a una máquina virtual (vm) recursos físicos del servidor en el que está contenida.

En el ejemplo que voy a poner, voy a asignarle a una vm una gpu de la máquina física.

  • Lo primero es comprobar la arquitectura de la máquina física, si es Intel o AMD. -> lscpu
  • Si la arquitectura es AMD, hacemos un nano /etc/default/grub

#GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd-iommu=on"

  • Si la arquitectura es intel

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel-iommu=on"

  • A continuación ejecutamos el siguiente comando => update-grub y actualizamos el grub del sistema.
  • Una vez hecho esto hacemos un nano /etc/modules y añadimos lo siguiente:

vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd

  • A continuación ejecutamos el siguientes comandos:

echo "options vfio_iommu_type1 allow_unsafe_interrupts=1" > /etc/modprobe.d/iommu_unsafe_interrupts.conf

echo "options kvm ignore_msrs=1" > /etc/modprobe.d/kvm.conf
echo "blacklist radeon" > /etc/modprobe.d/blacklist.conf
echo "blacklist nouveau" > /etc/modprobe.d/blacklist.conf
echo "blacklist nvidia" > /etc/modprobe.d/blacklist.conf

  • Ahora procedemos a listar los componentes pci y para ello hacemos => lspci -v
  • Y buscamos dentro de este listado el adaptador VGA
  • Apuntamos el valor de la izquierda, en mi caso el ca:00.0
  • Volvemos a listar los componentes pci pero esta vez con el número que hemos obtenido => lspci -n -s ca:00.0
  • Y copiamos el valor obtenido
  • Con el valor obtenido ejecutamos el siguiente comando, si tuviéramos varios valores se ponen todos separados por => echo "options vfio-pci ids=1a03:200 disable_vga=1" > /etc/modprobe.d/vfio.conf
  • Para actualizar los cambios se utiliza el siguiente comando => update-initramfs -u

Debe de salir un mensaje similar a ‘in new private ount namespace…’

  • Reiniciamos el servidor proxmox
  • En la interfaz web, elgiemoss la vm que queremos que tenga la tarjeta gráfica , en el hardware le damos a añadir y a dispositivo PCI y en el listado debe de aparecer la gráfica del servidor, la seleccionamos y check en all functions, en advanced, en ROM-Bar y en PCI-Expressy le damos a añadir y listo

Tutorial flask – python II

En principio ya tenemos instalado y configurado casi todo lo que vamos a necesitar para empezar a programar. El siguiente paso va a ser levantar el entorno virtual de desarrollo que hemos creado, vamos a la ruta donde esta el directorio que contiene el entorno de desarrollo, en mi caso /home/proyecto/ProyectoPython/bin y con el comando: source activate comprobamos que funciona y está correctamente instalado, como se ve en la imagen

Una vez hecho esto, yo lo que suelo hacer es abrir este entorno virtual con PyCharm y con este editor comienzo a desarrollar. Abajo podemos ver un ejemplo del entorno de desarrollo.

Este para mi gusto es una forma relativamente limpia para programar y hacer pruebas en entornos virtualizados sin cargar al sistema de librerias de python que posiblemente nunca volvamos a utilizar.

Y una vez que tenemos todas las librerias que necesitamos si tenemos que instalar el mismo entorno en otro equipo, seria tan simple como con el comando «pip3 freeze > requirement.txt» exportariamos todas las librerias desde dentro del entorno virtual claro está. Y en el nuevo entorno virtual ejecutariamos «pip3 install -r requirement.txt» y tendriamos todo instalado otra vez sin preocuparnos de problemas con versiones.

Tutorial flask – python I

Voy a documentar en varias entradas web como monto un pequeño proyecto web con el firmware flask de python y así se queda guardado para que cualquiera pueda consultarlo.

En mi caso voy a utilizar la versión gratuita de PyCharm como IDE ( Entorno de desarrollo integrado) para hacer la aplicación, cada uno puede usar el que mas le guste.

1 – El primer paso es verificar que versión de python tenemos instalada en nuestro sistema operativo y en el caso de que no tuviéramos habría que instalar la versión mas actualizada, en mi caso al usar ubuntu 20.04 la versión que tengo es Python 3.8.10, para verlo solo hay que usar en el terminal el comando python3 y obtendremos la versión instalada.

Con este comando también entramos en el terminal a la consola de python y para salir de la misma tenemos que teclear exit().

2- El segundo paso es instalar un servidor web, vale tanto nginx como apache 2, yo por comodidad uso apache2 y para ello hay que ejecutar el siguiente comando sudo apt – get install apache2, de esta forma instalaremos el servidor web y una vez instalado con el comando sudo service apache2 status comprobaremos que el servicio está en ejecución y aparecerá algo similar a lo que aparece en la siguiente imagen.


3 – Ahora tenemos dos opciones o instalar un entorno de virtualización para python o realizar toda la instalación en el sistema operativo, yo por motivos de desarrollo y para evitar instalar paquetes que no sean necesarios en diferentes proyectos prefiero hacerlo en entornos virtualizados y para ello vamos a instalar dicho paquete con el siguiente comando: sudo apt install python3-virtualenv.
Una vez instalado vamos a crear el entorno virtual, dicho entorno podemos crearlo desde PyCharm o desde el terminal de comandos con el siguiente comando: virtualenv ProyectoPython –python=python3.8.5.

4 – Instalamos el modulo wsgi de apache, con el comando sudo apt-get install libapache2-mod-wsgi, de tal forma que apache2 responda a las peticiones de la aplicación que vamos a programar. También mas adelante crearemos un archivo de configuración que apunte al entorno virtualizado que hemos creado anteriormente de tal forma que podamos crear una aplicación completa en un entorno virtualizado y que apache sea el que gestione las peticiones a la misma.

5 – Vamos a instalar también el gestor de paquetes pip para python 3 ya que mas adelante lo vamos a necesitar para realizar la instalación de varios paquetes necesarios para importar algunas librerías que vamos a usar, para ello usamos el comando: sudo apt install python3-pip.

6 – También vamos a necesitar instalar un gestor de base de datos, en este caso yo voy a usar mysql en su versión 8. Para ello ejecutamos el comando sudo apt install mysql-server e instalamos el gestor. Una vez instalado vamos a proceder a su configuración, para ello ejecutamos sudo mysql_secure_installation y seguimos los pasos para crear una contraseña al usuario root , entramos en mysql con el comando sudo mysql y creamos el usuario root en local y nuestro usuario, para ello introducimos el siguientes comandos, ALTER USER ‘root’@’localhost’ IDENTIFIED WITH caching_sha2_password BY ‘contraseña’;  y posteriormente crear un usuario para nuestra conexión, para ello usamos el comando create user ‘usuario’@’localhost’ identified by ‘contraseña’;

7 – Por último vamos a instalar un entorno de desarrollo, yo suelo usar PyCharm, pero cualquier IDE es válido, para instalar PyCharm ejecutaremos en la línea de comandos los siguiente: sudo snap install pycharm-community –classic

Con esto ya estaría toda la instalación previa para empezar con nuestra aplicación python

Instalación lamp linux con php 5 y percona

1- Instalación de apache

sudo apt-get install apache2

2- Instalación de php 5.6

sudo add-get-repository ppa:ondrej/php

sudo apt-get update

sudo apt-get install php7.0 php5-6 php5.6-mysql php-gettext php5.6-mbstring php-xdebug libapache2-mod-php5.6 libapache2-mod-php7.0

3- Instalación de percona.

sudo apt-get install gnupg2

wget https://repo.percona.com/apt/percona-release.$(lsb_release -sc)_all.deb

sudo dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb

sudo percona-release setup ps80

sudo apt-get install percona-server-server

4- Instalar phpmyadmin

sudo apt-get install phpmyadmin

Colocar contraseña en phpmyadmin

1- Crear el usuario en mysql que tendrá el acceso y darle permisos totales, este usuario debe de ser doble, para localhost y para %, si es que queremos tener acceso tanto desde el equipo local como en remoto.

2 – En linux /opt/lampp/phpmyadmin/config.php.inc
Buscar la línea $cfg[‘Servers’][$si][‘auth_type’] = ‘config’;
Cambiar la config por cookie y debajo poner el usuario y la contraseña

Para arrancar xampp en linux sudo /opt/lampp/lampp start

Configuración iptables

Iptables es un firewall incluido en el kernel de Linux y el uso es bastante complejo, vamos a hacer un resumen general.

Para Iniciar/Para/Reiniciar Iptables

  • sudo service iptables start
  • sudo service iptables stop
  • sudo service iptables restart

Los principales comandos de Iptables son los siguientes:

  • -A –append → agrega una regla a una cadena.
  • -D –delete → borra una regla de una cadena especificada.
  • -R –replace → reemplaza una regla.
  • -I –insert → inserta una regla en lugar de una cadena.
  • -L –list → muestra las reglas que le pasamos como argumento.
  • -F –flush → borra todas las reglas de una cadena.
  • -Z –zero → pone a cero todos los contadores de una cadena.
  • -N –new-chain → permite al usuario crear su propia cadena.
  • -X –delete-chain → borra la cadena especificada.
  • -P –policy → explica al kernel qué hacer con los paquetes que no coincidan con ninguna regla.
  • -E –rename-chain → cambia el orden de una cadena.

Condiciones TCP/UDP

  • -sport –source-port → selecciona o excluye puertos de un determinado puerto de origen.
  • -dport –destination-port → selecciona o excluye puertos de un determinado puerto de destino.

Existen muchas mas condiciones para una configuración avanzada del firewall, pero las elementales ya las tenemos listadas.

Configurar reglas por defecto

La configuración por defecto de un firewall debería ser, traducido al español, «bloquear todo excepto [reglas]». Para configurar el firewall para que bloquee todas las conexiones debemos teclear:

  • iptables -P INPUT DROP
  • iptables -P FORWARD DROP
  • iptables -P OUTPUT DROP

Con esto nos quedaremos sin internet, por lo que a continuación debemos empezar a crear reglas permisivas.

Para aplicar una regla que filtre un determinado puerto, debemos ejecutar:

  • iptables -A INPUT -p tcp –sport 22 22 → crea una regla para el puerto de origen tcp 2222

Para bloquear el tráfico procedente de una determinada IP, debemos ejecutar:

  • iptables -A INPUT -p tcp -m iprange –src-range 192.168.100.2-192.168.100.21 (ejemplo de IP)

También podríamos bloquear por MAC con la condición -mac- source.

  • iptables -A INPUT -m mac –mac-source 00:00:00:00:00:00

Una vez ejecutadas las reglas que queramos aplicar, debemos guardarlas tecleando sudo service iptables save

Ver el estado del firewall

  • iptables -L -n -v

El parámetro L muestra las líneas abiertas. V permite recibir más información sobre las conexiones y N nos devuelve las direcciones IP y sus correspondientes puertos sin pasar por un servidor DNS.

Eliminar las reglas existentes

Para borrar toda la configuración del firewall para volver a configurarlo de nuevo debemos teclear:

  • iptables -F

Permitir conexiones entrantes

Teclearemos los siguientes parámetros:

  • iptables -A INPUT -i [interface] -p [protocolo] –dport [puerto] -m state –state NEW,ESTABLISHED -j ACCEPT

-i: debemos configurar la interfaz, por ejemplo, eth0. Esto es útil en caso de tener varias tarjetas de red, si tenemos sólo una, no tenemos por qué especificar este parámetro.

-p: protocolo. Debemos especificar si el protocolo será TCP o UDP.

–dport: el puerto que queremos permitir, por ejemplo, en caso de HTTP sería el 80.

Un ejemplo para permitir las conexiones entrantes desde páginas web:

  • iptables -A INPUT -i eth0 -p tcp –dport 80 -m state –state NEW,ESTABLISHED -j ACCEPT

Permitir las conexiones salientes

  • iptables -A OUTPUT -o [interfaz] -p [protocolo] –sport [puerto] -m state –state ESTABLISHED -j ACCEPT

-o: debemos configurar la interfaz, por ejemplo, eth0, al igual que en el caso anterior.

-p: protocolo. Debemos especificar si el protocolo será TCP o UDP.

–sport: el puerto que queremos permitir, por ejemplo, en caso de HTTPS sería el 443.

Un ejemplo para permitir el tráfico saliente hacia páginas web:

  • iptables -A OUTPUT -o eth0 -p tcp –sport 80 -m state –state ESTABLISHED -j ACCEPT

Permitir los paquetes ICMP

Por defecto, el ping está deshabilitado. Debemos habilitarlo manualmente añadiendo las correspondientes entradas en iptables. Para ello teclearemos:

Para poder hacer ping a otros servidores:

  • iptables -A OUTPUT -p icmp –icmp-type echo-request -j ACCEPT

Para permitir recibir solicitudes de ping de otros equipos:

  • iptables -A INPUT -p icmp –icmp-type echo-reply -j ACCEPT

Permitir que el tráfico interno salga a internet

En el caso de tener 2 tarjetas de red (eth0 en local y eth1 conectada a internet) podemos configurar el firewall para que reenvíe el tráfico de la red local a través de internet. Para ello escribiremos:

  • iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT

Bloquear y prevenir ataques DDoS

  • iptables -A INPUT -p tcp –dport 80 -m limit –limit 25/minute –limit-burst 100 -j ACCEPT

Consultar los paquetes rechazados por iptables

Para saber los paquetes que iptables ha rechazado debemos teclear:

  • iptables -N LOGGING

Ejemplos prácticos

Cómo bloquear las conexiones entrantes por el puerto 5000:

  • iptables -A INPUT -p tcp –dport 5000 -j DROP
  • iptables -A INPUT -i eth1 -p tcp –dport 80 -j DROP → bloquea en la interfaz eth1

Bloquear una dirección IP:

  • iptables -A INPUT -s 192.168.1.0/24 -j DROP

Bloquear una dirección IP de salida:

  • iptables -A OUTPUT -d 83.226.352.196 -j DROP

También podemos bloquear una url, por ejemplo, facebook:

Bloquear el tráfico desde una direccion MAC:

  • iptables -A INPUT -m mac –mac-source 00:0F:EC:85:25:12 -j DROP

Bloquear peticiones ping:

  • iptables -A INPUT -p icmp –icmp-type echo-request -j DROP

Documentación sacada de: https://www.redeszone.net/gnu-linux/iptables-configuracion-del-firewall-en-linux-con-iptables/

Comandos de interés

Eliminar ram cacheada

  • Con el comando => free -M podemos obtener la ram usada y la libre que tenemos en nuestro sistema operativo
  • En caso de necesitar liberar ram previamente cacheada usaremos el comando => sync && echo 3 > /proc/sys/vm/drop_caches

Colocar ip y gateway de forma manual

  • Para ver el gateway ==> route -n
  • Para colocar la ip de forma manual ==> ifconfig eth0 «ip_a_colocar» netmask «mascara de subred». Por ejemplo ifconfig eth0 10.0.201 netmask 255.255.255.0
  • Para colocar gateway ==> sudo route add default gw «ip_puerta_enlace»

Testear un disco duro con linux

badblocks

Con esta herramienta podemos hacer un chequeo completo del disco y ver la cantidad de sectores defectuosos que hay

1- Desmontar la partición a testear.

fdisk -l

sudo umount [ruta de la partición]

2- Uso básico

sudo badblocks [ruta de la partición]

3- Uso básico con Verbose

sudo badblocks -v [ruta de la partición]

4- Uso de lectura y escritura no destructivo

sudo badblocks -nsv [ruta patición]

e2fsck

1- Uso básico

sudo e2fsck /dev/sda1

2- Uso combinado con Badblocks

sudo e2fsck -c /dev/sda1

Hacer un formateo lento de un disco

Con este formateo se colocan todos los sectores de un disco a cero y se marcan y aíslan aquellos sectores dañados

sudo dd if=/dev/zero of=/dev/sdb

Al ir bloque a bloque es un proceso lento, pero esto se puede optimizar seleccionando el tamaño de bloque a utilizar

sudo dd if=/dev/zero of=/dev/sdb bs=4096

Instalación php 7 y 5 juntos

Hay casos en los que necesitaremos tener instalados las dos versiones de php, tanto la 7 como la 5 e ir cambiando de una a otra en función de nuestras necesidades, a continuación explico como hacerlo.

1- Procedemos con la instalación de los mismos

sudo apt-get install software-properties-common

sudo add-apt-repository -y ppa:ondrej/php

sudo apt-get update

sudo apt-get install php7.0 php5.6 php5.6-mysql php-gettext php5.6-mbstring php-xdebug libapache2-mod-php5.6 libapache2-mod-php7.0

#Buscar paquetes que necesitemos e instalarlos si fuera necesarioapt-cache search php- | less

sudo apt-get install php5.6-cli php5.6-intl php5.6-curl php5.6-mcrypt php5.6-zip php5.6-xml

#Si es necesario cambiar algún parámetro como memory_limitsudo nano /etc/php/5.6/apache2/php.ini

Activar PHP 5.6 / Desactivar PHP 7.0

sudo a2dismod php7.0 ; sudo a2enmod php5.6 ; sudo service apache2 restart 

sudo ln -sfn /usr/bin/php5.6 /etc/alternatives/php

Activar PHP 7.0 / Desactivar PHP 5.6

sudo a2dismod php7.0 ; sudo a2enmod php5.6 ; sudo service apache2 restart

sudo ln -sfn /usr/bin/php5.6 /etc/alternatives/php

Comprobar que PHP está instalado como módulo Apache

ls /etc/apache2/mods-enabled/

rsnapshot instalación y configuración

Esta aplicación la vamos a usar para realizar copias de una intranet previamente configurada con samba.

1- El primer paso es instalar la aplicación => sudo apt-get install rsnapshot

2- Configuración de la aplicación => Hay que modificar el archivo de configuración, para ello usamos el siguiente comando sudo nano /etc/rsnapshot.conf

En dicho archivo de configuración hay que colocar en la línea snapshot_root la ruta de descarga. Por ejemplo snapshot_root /backup/

En la línea retain, el número de copias que queremos de de cada tipo.

retain hourly 6

retain daily 7

retain weekly 4

retain monthly 6

retain yearly 5

Y en los Backup point desde donde se hace el backup y si es de otro equipo, por ejemplo de un equipo remoto, la ip del mismo.

backup /home/ localhost/

backup /etc/ localhost/

backup /var/log/ localhost/

Para comprobar que está todo correcto se ejecuta el comando «sudo rsnapshot configtest».

Para generar la primera copia => sudo rsnapshot hourly.

3- Programar las tareas.

En el crontab de root => sudo crontab -e configuramos cuando se ejecutan las tareas.

Por ejemplo:

# m h  dom mon dow   command
00 16 * * *     /usr/bin/rsnapshot hourly
08 23 * * 5    /usr/bin/rsnapshot daily
08 20 2 * *    /usr/bin/rsnapshot weekly
30 23 5 * *    /usr/bin/rsnapshot monthly

A continuación dejo un ejemplo del archivo de configuración

Ubuntu borrar kernels antiguos para liberar espacio

No suele ser lo habitual, pero cuando escasea el disco duro siempre tenemos que racanear disco de donde sea, o en el caso de hacer una instalación de ubuntu automática la partición /boot suele ser bastante pequeña y aquí es donde van las instalaciones del kernel, vamos a ver un procedimiento para listar las versiones y eliminar las que no usermos.

Empecemos por ver que versión de Kernel estamos usando

uname -r

En mi caso esta es la versión utilizada en este momento.

Ahora vamos a listar todos los kernel que hay en mi sistema.

dpkg –list | grep linux-image

Aquí podemos ver cuales son.

Ahora vamos a proceder a desinstalar los kernel antiguos, en este caso Ubuntu pero todo esto es igual de válido para Debian.

sudo apt-get purge linux-image-5.4.0-47-generic

Y con esto ya está todo hecho, si quieres estar seguro que el menú grub2 se ha actualizado, puedes comprobarlo con el siguiente comando ==> sudo update-grub

Instalación y configuración NFS

¿Que es el sistema de archivos en red, NFS?

Es una aplicación cliente/servidor que permite a un usuario ver y almacenar en un equipo remoto archivos, como si estuvieran en el propio equipo. De esta forma podemos exportar un directorio de un equipo y montarlo en otro y para este es como si el directorio fuera local.

Se suelen usar sobre todo cuando hay problemas de almacenamiento.

INSTALACIÓN DE NFS

Es tan sencilla como ==> sudo apt-get install nfs-common nfs-kernel-server

CONFIGURACIÓN DEL SERVIDOR NFS

Antes de arrancar el servicio vamos a indicar que carpetas vamos a compartir, para ello nos vamos al archivo /etc/exports.

Cada línea de este archivo debe especificar lo siguiente:

  • La carpeta a compartir
  • El modo en que se comparte y los permisos ( lectura, lectura y escritura)
  • Desde que equipos se permite el acceso

Ejemplo de dicho archivo

/datos/backup 192.168.100.10(rw,sync, no_root_squash,no_subtree_check)

Aquí vemos la carpeta que se va a exportar, a que equipo y con que permisos

ARRANQUE Y PARADA DE NFS

Para que el servidor funcione es necesario que esté arrancado el servicio portmap por lo tanto habrá que arrancarlo ==> /etc/init.d/portmap start

Una vez modificado el archivo siempre hay que reiniciar el servicio NFS ==> /etc/init.d/nfs-kernel-server restart

Y para pararlo ==> /etc/init.d/nfs-kernel-server stop

Para dejar el servicio en arranque automático ==> update-rc.d portmap defaults

==> update-rc-d nfs-kernel-server defaults

INSTALACIÓN Y CONFIGURACIÓN EN EL CLIENTE

Para poder montar en el cliente las carpetas previamente exportadas en el servidor tenemos que instalar el cliente NFS ==> sudo apt-get install nfs-common

Ahora vamos a comprobar los recursos, en este caso carpetas exportadas desde el servidor y para ello ejecutamos el siguiente comando ==> showmount -e ip_del_servidor

De esta forma obtendremos un listado con todas las carpetas exportadas.

Para montar dichas carpetas lo podemos hacer a mano ==> mount -t nfs ip_del_servidor:/capeta_remota /mnt/carpeta_local

O podemos meter el punto de montaje dentro del archivo fstab para que se monte de forma automática al arrancar el sistema operativo, para esto último hacemos lo siguiente ==> sudo nano /etc/fstab

Dentro de este archivo introducimos las lineas de montaje

ip_servidor_nfs:/carpeta_remonta /carpeta_local nfs defaults 0 0

Una vez hecho esto guardamos y forzamos el montaje del contenido del archivo fstab con el siguiente comando ==> sudo mount -a

Con esto ya está todo hecho, como se puede comprobar es bastante sencillo