Utilizar la IP Pública Estática de una VPS para Acceder a los Servicios del Servidor en Casa con IP Pública Dinámica
Aunque depende de la complejidad y la cantidad de usuarios, y si bien existen formas más populares y sencillas como usar servicios DDNS (No-IP, Duck DNS, DynDNS, Cloudflare, Dynu, etc.), para un servicio personal, la opción de utilizar una VPS puede traer grandes beneficios, como por ejemplo enmascarar el servidor en CASA, ya que su IP pública no queda expuesta, lo que reduce significativamente la superficie de ataque. Además, aunque se utilice un proveedor externo para alojar la VPS, esta opción ofrece mayor privacidad que los servicios DDNS, ya que la IP pública de la CASA no queda visible para ningún servicio de terceros, esto sumado al control completo que se tiene sobre la instalación Linux de la VPS, donde todas las configuraciones son administradas directamente por nosotros.
Esta guía está diseñada para ser simple y accesible, con la idea principal de que el usuario tome el control de sus propios datos.
La solución crea un túnel desde una VPS a un servidor en CASA con WireGuard, lo que permite aprovechar la IP Pública Estática de la VPS para acceder a nuestros servicios instalados en casa.
Se configura un Reverse Proxy que podrá generar certificados SSL para los dominios en la VPS para acceder de forma segura a las aplicaciones en CASA.
A partir de aqui podemos instalar los servicios en el servidor en CASA de forma nativa o con Docker. En estas notas se instala un servicio de Nextcloud con Docker, ademas de otros servicios segun la necesidad.
Para la instalación se utiliza lo siguiente:
- Un Dominio
- Un Servidor Linux VPS Ubuntu
- Un Servidor Linux en CASA Raspberry Pi OS (basado en Debian)
Si bien la instalación de Wireguard, el Reverse Proxy, Docker y Nextcloud es rápida, tenga en cuenta que, como es habitual en cualquier proyecto, los preparativos suelen ser un poco más extensos.
Si ya tiene preparados los servidores Linux y tiene un Dominio, puede saltar al paso 5.
Notas:
- Únicamente se abrirán los puertos (80, 443 y 51820) en la VPS.
- La configuración de dominios y la generación de certificados SSL se realizarán exclusivamente en la VPS.
- En el servidor en CASA puede realizar cualquier configuración o cambio sin que esto afecte a la VPS (Excepto servicios muy específicos).
- Si necesita cambiar de proveedor de VPS, el proceso es sencillo y no afecta el funcionamiento del servidor en CASA (Excepto servicios muy específicos).
Nota: Para estas notas, se puede utilizar cualquier VPS basado en Linux Debian y adquirir un Dominio con cualquier registrador, ya que las configuraciones son muy similares. En los ejemplos de estas notas se utilizan los servicios "Siempre Gratis" de Oracle Cloud OCI para crear el servidor Linux Ubuntu (permite hasta 4 servidores Linux permanentes de forma gratuita en "Try OCI for free") y los servicios de Gandi.net para registrar un dominio (por su interfaz simple y política de "No Bullshit") .
1. Requisitos
Requisitos:
El sitio oficial de Nextcloud recomienda mínimo 1 GB de RAM: https://docs.nextcloud.com/server/latest/admin_manual/installation/system_requirements.html
Usuarios y Passwords utilizados:
Esta es una lista de usuarios y passwords que se crean durante la instalación:
- User y Password para los servicios VPS Linux (Oracle Cloud OCI en los ejemplos).
- User y Password para el registrador de dominios (gandi.net en los ejemplos).
- Password para la Clave SSH (para ingresar al servidor Linux con el usuario pruebauser).
- User y Password para el nuevo usuario de Linux (pruebauser en los ejemplos). style="width: 200px;"
- Password para el usuario root de MariDB. (MySQL_root_password en los ejemplos)
- User y Password para el nuevo usuario de la DB de MariaDB (lucia en los ejemplos, password sin simbolos preferiblemente).
- User y Password para el usuario administrador de Nextcloud (Rick en los ejemplos).
Nota: Para facilitar la administración, se recomienda utilizar un gestor de passwords como KeepassXC.
2. Crear la Clave SSH
Crear la llave SSH en Linux desde la terminal:
#1. Crear la llave SSH con el nombre "server" (Usar cualquier nombre o el nombre por defecto).
ssh-keygen -o -t rsa -b 4096 -f ~/.ssh/server
#2. Solicitará agregar una contraseña cualquiera (normalmente una nueva) y luego confirmarla.
#3. Se crea en la carpeta ~/.ssh la Clave privada (server) y la Clave pública (server.pub).
#4. Consultar la llave SSH.
cat ~/.ssh/server.pub
Nota: El principio de la criptografía asimétrica es que el cliente posee una clave privada y el servidor una clave pública, solo quienes posean la clave privada pueden descifrar la clave SSH para acceder al servidor. Este par de archivos puede ser copiado o movido a cualquier ruta o dispositivo.
En Windows se pueden utilizar herramientas como PuTTY, WSL o incluso una máquina virtual con Linux. Sin embargo, se recomienda instalar Git SCM y utilizar su herramienta Git Bash:
https://git-scm.com/downloads/win (64-bit Git for Windows Setup)
La guía utiliza nano como editor de texto. Durante la instalación de Git SCM, hay una sección para elegir entre Vim y otros, se puede elegir nano.
Crear la llave SSH en Git Bash:
#1. Crear la llave SSH con el nombre "server" (Usar cualquier nombre o el nombre por defecto).
ssh-keygen -o -t rsa -b 4096 -f ~/.ssh/server
#2. Solicitará agregar una contraseña cualquiera (normalmente una nueva) y luego confirmarla.
#3. Consultar la llave SSH para copiar y utilizar en Oracle Cloud.
cat ~/.ssh/server.pub
#En Windows los archivos Clave privada (server) y la Clave pública (server.pub)
se crearon en C:/Users/USUARIO/.ssh/
Nota: El principio de la criptografía asimétrica es que el cliente posee una clave privada y el servidor una clave pública, solo quienes posean la clave privada pueden descifrar la clave SSH para acceder al servidor. Este par de archivos puede ser copiado o movido a cualquier ruta o dispositivo.
3. Crear el Servidor Linux
Crear una instancia OCI:
Una vez creada la cuenta en Oracle Cloud se inicia sesion.
- Ir al menú de opciones.
- Seleccionar "Instancias".
- Seleccionar la raíz.
- Crear instancia.
- Agregar un nombre, el cual sera el nombre del host (en el ejemplo es radicale, puede ser cualquiera).
- Cambiar la imagen de Linux.
- Seleccionar Ubuntu.
- Seleccionar la versión.
- Seleccionar imagen.
- Verificar si la red está creada, si no es así, crearla.
- Seleccionar "Pegar claves públicas".
- Agregar la clave SSH creada y copiada anteriormente.
- Crear.
- Controles de la instancia OCI (la máquina virtual Linux). Con el botón "Terminar" se puede eliminar la instancia.
- Obtenemos la IP pública estática.
- Obtenemos el usuario de la instancia llamado "ubuntu" (es el usuario del servidor Linux, más adelante se cambia por seguridad).
Abrir puertos en las configuraciones de red de Oracle Cloud:
- Buscar " Default Security List ".
- Hacer clic en la Subred encontrada.
- Agregar reglas de entrada.
- CIDR de origen: 0.0.0.0/0
- Protocolo IP: TCP.
- Rango de puertos de destino: 80,443.
- Agregar reglas de entrada.
- Agregar otra regla de entrada.
- CIDR de origen: 0.0.0.0/0
- Protocolo IP: UDP.
- Puertos de destino: 51820.
- Agregar reglas de entrada.
4. Agregar la IP a los DNS del Registrador de Dominios
En el ejemplo con gandi.net, después de adquirir un dominio ingresar a la pantalla principal.
- Ir a Dominio.
- Hacer clic en el dominio.
- Ir a Zonas DNS.
- Add record.
- Seleccionar tipo A.
- Normalmente se utiliza un TTL de 3600 (1 hora).
- Agregar cualquier nombre de subdominio, en el ejemplo se utiliza "cloud".
- Agregar la IP pública obtenida de Oracle Cloud.
- Crear.
5. Ingresar y Preparar el Servidor VPS y CASA
Ingresar a ambos servidores desde el cliente con la terminal:
#Ejemplo de ingreso a la VPS (Oracle CLoud OCI).
#1. Colocar el comando especificando la clave pública con el usuario y la IP pública.
ssh -i ~/.ssh/server ubuntu@168.138.92.191
#2. Escribir "yes".
#3. Agregar la contraseña de la clave SSH.
#4. Ahora se ha ingresado al servidor Linux.
Solo si utiliza Oracle Cloud OCI: Crear un usuario nuevo y eliminar el usuario por defecto "ubuntu".
#1. Crear usuario, en el ejemplo se llama "pruebauser".
sudo adduser pruebauser
#2. Agregar una nueva contraseña para el usuario nuevo y repetir.
#3. Se puede dejar en blanco o agregar información.
#4. Se agrega el usuario al grupo de sudo.
sudo usermod -aG sudo pruebauser
#4. Copiar la carpeta con la Clave Pública SSH al nuevo usuario para permitir su ingreso.
sudo cp -r /home/ubuntu/.ssh /home/pruebauser/
#4. Se le agregan los permisos del usuario nuevo a la carpeta copiada.
sudo chown -R pruebauser:pruebauser /home/pruebauser/.ssh
#5. "exit" dos veces para salir completamente e iniciar sesión con el nuevo usuario.
#6. Iniciar con el nuevo usuario, se utiliza el password para la Clave SSH.
ssh -i ~/.ssh/server pruebauser@168.138.92.191
#Eliminar el usuario "ubuntu".
#Usar sudo con el password del nuevo usuario.
sudo userdel -f ubuntu
sudo rm -r /home/ubuntu
Cambiar la zona horaria en la VPS y CASA:
#Esta vez ingresar como root en ambos con sudo su - o con su -
sudo su -
#Buscar el nombre correcto de la zona horaria (Ctrl+c para salir).
timedatectl list-timezones
#Cambiar la zona horaria.
timedatectl set-timezone America/Costa_Rica
Actualizar e instalar herramientas básicas en la VPS y CASA:
#Actualizar Linux.
apt update && apt upgrade -y
#Instalar nano, rsyslog, el framework para el firewall, etc.
apt install curl nano rsyslog resolvconf netfilter-persistent iptables-persistent -y
resolvconf -u
6. Instalar y Configurar el Servidor VPS y CASA.
Abrir el puerto UDP 51820 Únicamente en el VPS
#Apertura del puerto UDP 51820 en el VPS sudo iptables -I INPUT -m state --state NEW -p udp --dport 51820 -j ACCEPT sudo netfilter-persistent save
Instalar WireGuard en la VPS y CASA
#Esta vez ingresar como root en ambos con sudo su - o con su -
sudo su -
apt install wireguard -y
Generar la Key Pública y Privada en Ambos
Ejecutar los comandos en el servidor VPS y el servidor CASA
#Generar las Key en ambos:
wg genkey | tee /etc/wireguard/private.key | wg pubkey > /etc/wireguard/public.key
#Consultar la Key Privada en ambos:
cat /etc/wireguard/private.key
#Consultar la Key Pública en ambos:
cat /etc/wireguard/public.key
#Configurar las Key en ambos:
nano /etc/wireguard/wg0.conf
#Para la VPS:
[Interface]
Address = 10.10.10.1/24
ListenPort = 51820
PrivateKey = KEY PRIVADA DEL VPS
[Peer]
PublicKey = KEY PUBLICA DE CASA
AllowedIPs = 10.10.10.10/32
PersistentKeepalive = 25
#Para CASA (agregar la IP pública estática de la VPS, en el ejemplo 168.138.92.191):
[Interface]
Address = 10.10.10.10/32
PrivateKey = KEY PRIVADA DE CASA
DNS = 9.9.9.9, 149.112.112.112
[Peer]
PublicKey = KEY PUBLICA DEL VPS
Endpoint = 168.138.92.191:51820
AllowedIPs = 10.10.10.1/32
PersistentKeepalive = 25
#Habilitar en ambos:
systemctl enable wg-quick@wg0.service
systemctl start wg-quick@wg0.service
systemctl status wg-quick@wg0.service
#Verificar en VPS:
ping -c 4 10.10.10.10
wg show
#Verificar en CASA:
ping -c 4 10.10.10.1
wg show
Listo, ya se pueden configurar los servicios en el servidor CASA
Instalar Caddy Reverse Proxy en el VPS
Para el VPS solo debemos abrir los puertos necesarios a Internet e instalar y configurar Caddy. (http 80 - https 443)
#Abrir los puertos
iptables -I INPUT 6 -m state --state NEW -p tcp --match multiport --dports 80,443 -j ACCEPT
netfilter-persistent save
#Instalar
apt install caddy -y
#Respaldar el archivo de configuración de Caddy
mv /etc/caddy/Caddyfile /etc/caddy/Caddyfile.bak
#Abrir el archivo de configuración de Caddy y agregar la configuración
nano /etc/caddy/Caddyfile
#Esta configuración garantiza la redirección de todos los dominios agregados a HTTPS
http:// {
redir https://{host}{uri}
}
Modificar el archivo de configuración de Caddy en la sección 7 según el servicio a instalar.
En este archivo se agregan los Dominios y luego se generan los certificados SSL.
La configuración es sencilla y bien estructurada como en este ejemplo:
1. Bloque que asegura que cualquier solicitud que llegue por HTTP sea redirigida automáticamente a HTTPS
2. Bloque que redirige a un servicio de Nextcloud en la IP 10.10.10.10, puerto 8080 (cloud.varlogsys.com)
3. Bloque que redirige a un servicio de Jellyfin en la IP 10.10.10.10, puerto 8096 (media.varlogsys.com)
7. Instalar y Configurar los servicios en CASA y Ajustar el Reverse Proxy en la VPS
Configurar en la VPS el Dominio en Caddy Reverse Proxy y Generar los Certificados SSL
En VPS
#Abrir el archivo de configuración de Caddy y agregar la configuración
nano /etc/caddy/Caddyfile
#Reverse Proxy que redirige las solicitudes entrantes a la dirección 10.10.10.10:8080
https://cloud.varlogsys.com {
reverse_proxy 10.10.10.10:8080 {
header_up X-Real-IP {remote_host}
header_up X-Forwarded-For {remote_host}
header_up X-Forwarded-Proto {scheme}
}
header {
Strict-Transport-Security "max-age=15552000; includeSubDomains; preload"
}
}
Al reiniciar Caddy, los certificados se generarán automáticamente y se pueden verificar con 'status'."
#Antes de generar los certificados, verificar que hay acceso al subdominio.
host cloud.varlogsys.com
#El comando anterior debería devolver la IP Pública del VPS.
#Reiniciar y verificar Caddy
systemctl restart caddy
systemctl status caddy
Instalar y Configurar Nextcloud en Docker
En CASA
#Si Docker no está instalado:
apt install docker docker-compose -y
#Crear y ajustar el archivo para configurar los servicios, redes y volúmenes para Nextcloud.
#Hay dos líneas en 'volumen' comentadas con # que se utilizará más adelante.
mkdir /opt/nextcloud
nano /opt/nextcloud/docker-compose.yml
services:
db:
image: mariadb:10.11
container_name: nextcloud_db
environment:
MYSQL_ROOT_PASSWORD: pass123
MYSQL_DATABASE: dbnextcloud
MYSQL_USER: lucia
MYSQL_PASSWORD: luciadbpassword
volumes:
- db_data:/var/lib/mysql
restart: always
command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW --innodb-file-per-table=1 --skip-innodb-read-only-compressed
redis:
image: redis:alpine
container_name: nextcloud_redis
command: redis-server --requirepass pass123
volumes:
- redis_data:/data
restart: always
nextcloud:
image: nextcloud:latest
container_name: nextcloud
ports:
- "8080:80"
environment:
MYSQL_HOST: db
MYSQL_DATABASE: dbnextcloud
MYSQL_USER: lucia
MYSQL_PASSWORD: luciadbpassword
NEXTCLOUD_ADMIN_USER: Rick
NEXTCLOUD_ADMIN_PASSWORD: ricknextcloudpassword
NEXTCLOUD_TRUSTED_DOMAINS: cloud.varlogsys.com
NEXTCLOUD_OVERWRITEPROTOCOL: https
volumes:
- nextcloud:/var/www/html
#- /opt/nextcloud/cron.d:/etc/cron.d
#- /opt/nextcloud/custom-config.php:/usr/local/etc/php/conf.d/custom-config.php
restart: always
depends_on:
- db
- redis
volumes:
nextcloud:
db_data:
redis_data:
#Crear e iniciar los contenedores de Nextcloud, MariaDB y Redis:
docker-compose -f /opt/nextcloud/docker-compose.yml up -d
Listo, ahora puede ingresar al sitio web e ingresar con las credenciales, en el ejemplo:
- Sitio web de ejemplo: https://cloud.varlogsys.com
- Usuario administrador de Nextcloud: Rick
- Password: ricknextcloudpassword
Hacer ajustes a Nextcloud
Nota: Estas configuraciones reparan las advertencias que se muestran en las opciones de Nextcloud.
#Instalar algunas herramientas dentro del contenedor:
docker exec -it nextcloud bash -c "apt update && apt install nano vim cron -y"
#Ajustar el archivo config.php
#Ver el contenido del archivo config.php
docker exec -it nextcloud cat /var/www/html/config/config.php
#Respaldar el archivo config.php
docker exec -it nextcloud cp /var/www/html/config/config.php /var/www/html/config/config.php.bak
#El siguiente ajuste del archivo config.php configura lo siguiente:
1. Define un proxy de confianza.
2. Fuerza el uso de HTTPS.
3. Establece la URL base de Nextcloud.
4. Configura la región predeterminada para números de teléfono (en el ejemplo CR) (Códigos ISO A2)
5. Usa Redis para el bloqueo en caché.
6. Configura Redis como servidor de caché y define su host y puerto.
7. Configuraciones para Cron.
#Abrir config.php
docker exec -it nextcloud nano /var/www/html/config/config.php
'trusted_proxies' => ['10.10.10.1'],
'overwriteprotocol' => 'https',
'overwrite.cli.url' => 'https://cloud.varlogsys.com',
'overwritehost' => 'cloud.varlogsys.com',
'default_phone_region' => 'CR',
'memcache.locking' => '\\OC\\Memcache\\Redis',
'redis' => array (
'host' => 'redis',
'port' => 6379,
'password' => 'pass123'
),
'backgroundjobs_mode' => 'cron',
'maintenance_window_start' => 1,
#Ajustar Cron.
#Abrir nuevamente el archivo docker-compose.yml y descomentar eliminando el # a la linea en 'volumnes'.
#Linea a descomentar: - /opt/nextcloud/cron.d:/etc/cron.d
nano /opt/nextcloud/docker-compose.yml
mkdir -p /opt/nextcloud/cron.d
echo "*/5 * * * * www-data php -f /var/www/html/cron.php > /dev/null 2>&1" > /opt/nextcloud/cron.d/nextcloud
#Hacer una configuración personalizada
#Abrir nuevamente el archivo docker-compose.yml y descomentar eliminando el # a la linea en 'volumnes'.
#Linea a descomentar: - /opt/nextcloud/custom-config.php:/usr/local/etc/php/conf.d/custom-config.php
nano /opt/nextcloud/docker-compose.yml
#Buscar el formato correcto de la zona horaria que desea agregar en Zonas Horarias de PHP.
#Configuración PHP personalizada que permite subir y descargar archivos de hasta 10 GB.
#Se puede configurar según la necesidad.
nano /opt/nextcloud/custom-config.php
file_uploads = On
allow_url_fopen = On
memory_limit = 2048M
upload_max_filesize = 10G
post_max_size = 10G
max_execution_time = 3600
display_errors = Off
date.timezone = America/Costa_Rica
zend_extension=opcache
output_buffering = Off
opcache.enable = 1
opcache.interned_strings_buffer = 16
opcache.max_accelerated_files = 10000
opcache.memory_consumption = 128
opcache.save_comments = 1
opcache.revalidate_freq = 1
#Aplicar los cambios:
docker-compose -f /opt/nextcloud/docker-compose.yml restart nextcloud
#Optimización y Reparación de la Base de Datos y Estructura de Nextcloud:
docker exec --user www-data nextcloud php occ maintenance:repair --include-expensive
docker exec --user www-data nextcloud php occ db:add-missing-indices
Nota: en volumes: se puede definir una ruta persistente personal:
Agregar:
- /opt/nextcloud/data:/var/www/html/data
sudo touch /opt/nextcloud/data/.ncdata
echo "# Nextcloud data directory" | sudo tee /opt/nextcloud/data/.ncdata
sudo chown -R www-data:www-data /opt/nextcloud/data
Instalar y Configurar Jellyfin
En VPS
#Agregar al archivo de Caddy:
nano /etc/caddy/Caddyfile
https://media.varlogsys.com {
reverse_proxy 10.10.10.10:8096 {
header_up X-Real-IP {remote_host}
header_up X-Forwarded-For {remote_host}
header_up X-Forwarded-Proto {scheme}
}
header {
Strict-Transport-Security "max-age=15552000; includeSubDomains; preload"
}
}
#Antes de generar los certificados, verificar que hay acceso al subdominio.
host media.varlogsys.com
#El comando anterior debería devolver la IP Pública del VPS.
#Reiniciar y verificar Caddy
sudo systemctl restart caddy
sudo systemctl status caddy
En CASA
#Si Docker no está instalado:
apt install docker docker-compose -y
#Seguimos con el orden en opt creando el directorio:
#Dentro de media se pueden crear las subcarpetas necesarias para el contenido multimedia
mkdir -p /opt/jellyfin /opt/jellyfin/media
#Crear el archivo yml
nano /opt/jellyfin/docker-compose.yml
version: '3.8'
services:
jellyfin:
image: jellyfin/jellyfin
container_name: jellyfin
ports:
- "8096:8096"
volumes:
- jellyfin_config:/config
- jellyfin_cache:/cache
- /opt/jellyfin/media:/media
environment:
- JELLYFIN_PublishedServerUrl=https://media.varlogsys.com
restart: unless-stopped
volumes:
jellyfin_config:
jellyfin_cache:
#Iniciar los Contenedores:
docker-compose -f /opt/jellyfin/docker-compose.yml up -d
Nota: En el directorio /opt/jellyfin/media del host se pueden crear los demás directorios segun la categoría, al iniciar la interfzar de Jellyfin, podra seleccionar por ejemplo /media/Series.
Además, se pueden configurar los volúmenes para permitir subir contenido multimedia por medio de Nextcloud y que Jellyfin los reconozca.
Listo, ingresar al sitio web (en el ejemplo https://media.varlogsys.com).
Nextcloud Desplegado
Protección y Seguridad General del Servidor (Información Genérica)
En un servicio personal se pueden evitar los intentos de ingreso por SSH, de hecho, se puede visualizar estos intentos de ingreso.
Cambiar opciones de SSH:
# Ver intentos fallidos de inicio de sesión.
sudo lastb
# Ingresar a las configuraciones de SSH
sudo nano /etc/ssh/sshd_config
# - Descomentar y cambiar la línea #MaxSessions 10 por las deseadas, por ejemplo MaxSessions 2
# - Desactivar el inicio por ssh del usuario root PermitRootLogin no
# - Tiempo en segundos que se cierra la sesión: ClientAliveInterval 900
# - Agregar la siguiente linea para permitir solo nuestro usuario AllowUsers pruebause
# - Descomentar y cambiar la línea #port 22 por algún otro puerto, por ejemplo port 22090
# Recordar abrir el puerto 22090:
iptables -I INPUT 6 -m state --state NEW -p tcp --match multiport --dports 22090 -j ACCEPT
netfilter-persistent save
# Si usa Oracle Cloud, Azure, AWS, etc, abrir en las reglas.
# Ahora se inicia sesión con ssh -p 22090 pruebauser@168.138.92.191
sudo systemctl restart sshd
Deshabilitar el ingreso con contraseña root:
# Deshabilita el ingreso con contraseña root
passwd -d root
passwd -l root
Esta configuración habilita actualizaciones automáticas de seguridad y mantenimiento esenciales de la versión de Linux (en el ejemplo Ubuntu). Sin embargo, no cubre algunas actualizaciones, por eso es importante verificar el sistema cada cierto tiempo.
#Instalar las actualizaciones automáticas
sudo apt install unattended-upgrades -y
sudo mv /etc/apt/apt.conf.d/50unattended-upgrades /etc/apt/apt.conf.d/50unattended-upgrades.bak
sudo nano /etc/apt/apt.conf.d/50unattended-upgrades
#Copiar y pegar el siguiente contenido en el archivo abierto con nano:
// Automatically upgrade packages from these origins and components
Unattended-Upgrade::Origins-Pattern {
"origin=Ubuntu,codename=${distro_codename},label=Ubuntu";
"origin=Ubuntu,codename=${distro_codename},label=Ubuntu-Security";
"origin=UbuntuESMApps,codename=${distro_codename},label=UbuntuESMApps";
"origin=UbuntuESM,codename=${distro_codename},label=UbuntuESM";
};
// List of blacklisted packages that should not be automatically upgraded
Unattended-Upgrade::Package-Blacklist {
};
// Automatically reboot *without* confirmation if needed
Unattended-Upgrade::Automatic-Reboot "true";
// Automatically reboot even if users are logged in
Unattended-Upgrade::Automatic-Reboot-WithUsers "true";
// Time to reboot the system when unattended upgrades are done
Unattended-Upgrade::Automatic-Reboot-Time "02:00";
// Enable notifications of upgrades
Unattended-Upgrade::Mail "root";
Unattended-Upgrade::MailOnlyOnError "true";
// Remove unused dependencies
Unattended-Upgrade::Remove-Unused-Dependencies "true";
// Do not automatically upgrade to newer kernel versions if the system requires a reboot
Unattended-Upgrade::MinimalSteps "true";
sudo mv /etc/apt/apt.conf.d/20auto-upgrades /etc/apt/apt.conf.d/20auto-upgrades.bak
sudo nano /etc/apt/apt.conf.d/20auto-upgrades
#Copiar y pegar el siguiente contenido en el archivo abierto con nano:
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::AutocleanInterval "7";
APT::Periodic::Unattended-Upgrade "1";
#Seleccionar Yes
sudo dpkg-reconfigure --priority=low unattended-upgrades
Sobre el consumo del servidor
Siendo objetivos, es importante mencionar que utilizar la memoria Swap para suplir la falta de memoria RAM es una mala práctica.
La memoria Swap utiliza parte del almacenamiento del disco y, en términos generales, la emplea como si fuera RAM.
El problema de esta práctica es que la memoria Swap es significativamente más lenta y, además, provoca un desgaste en la unidad de almacenamiento.
Sin embargo, en ocasiones tenemos aplicaciones que solo se ejecutan esporádicamente y requieren picos de memoria RAM como sucede con ClamAV, que durante sus escaneos puede llegar a tener picos de consumo de RAM. Dado que esto no ocurre de manera constante, podemos recurrir a la memoria Swap como apoyo.
Por otro lado, si estamos usando servicios en la nube y no nuestro propio hardware, algunos picos de consumo de RAM a la semana no son tan preocupantes.
#Agregar 4GB de Swap: sudo fallocate -l 4G /swapfile && sudo chmod 600 /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile sudo cp /etc/fstab /etc/fstab.bak echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab && sudo sysctl vm.swappiness=10 && echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf #Verificar la memoria: free -mh
Nota: Si el servidor tiene menos de 1 GB, se recomienda no continuar o agregar memoria Swap. La instalación de rkhunter, chkrootkit y ClamAV es opcional.
Instalación de rkhunter y chkrootkit
rkhunter y chkrootkit detectan rootkits y malware en Linux, escaneando archivos y buscando comportamientos sospechosos o signos de infecciones conocidas.
En un sistema recién instalado, es una buena oportunidad para escanear y obtener los posibles 'falsos positivos' para en un futuro tenerlo de referencia.
#Instalar sudo apt install rkhunter chkrootkit -y Si pregunta sobre configurar Postfix: "No configuration" #Habilitar escaneos automáticos con cron.(Seleccionar 1. nano.) sudo crontab -e #Agregar al final del texto lo siguiente para escanear una vez a la semana:0 5 * * 1 /usr/bin/rkhunter --check --report-warnings-only | tee /var/log/rkhunter.log 0 6 * * 1 /usr/sbin/chkrootkit | tee /var/log/chkrootkit.log# Actualizar la base de datos de propiedades. sudo rkhunter --propupd #Realizar un escaneo manual con rkhunter. sudo rkhunter --check #Solo ver los mensajes de advertencia. sudo rkhunter --check --report-warnings-only #Realizar un escaneo manual con chkrootkit. sudo chkrootkit | sudo tee /var/log/chkrootkit.log #Ver los resultados de los escaneos. sudo cat /var/log/rkhunter.log sudo cat /var/log/chkrootkit.log
Instalación de ClamAV
ClamAV es un antivirus de código abierto para Linux, diseñado para detectar malware y virus.
Es posible que, después de la instalación se inicie un escaneo, lo que puede provocar lentitud o que la conexión se congele, lo mejor es esperar que termine, especialmente si la máquina es modesta.
#Instalar ClamAV.
sudo apt install clamav clamav-daemon clamav-freshclam -y
#Habilitar las actualizaciones.
sudo systemctl enable clamav-freshclam
sudo systemctl start clamav-freshclam
sudo systemctl status clamav-freshclam
#Habilitar escaneos automáticos con cron.(Seleccionar 1. nano.)
sudo crontab -e
#Agregar al final del texto lo siguiente para escanear a las 4am:
0 4 * * * /usr/bin/clamscan -r / --log=/var/log/clamav/clamav.log
#Ver los resultados de los escaneos.
sudo cat /var/log/clamav/scan.log
#Verificar el estado de la base de datos.
sudo cat /var/log/clamav/freshclam.log