Bienvenido
Usuario: Clave:

CITM/HERMES

Últ.Rev: 2022-12-14 12:42

TEMAS PENDIENTES

  • Automatizar certificado para la Web segura
  • Aumentar tamaño de letra en terminal de Stargazer
  • Preparar punto acceso tonto para Stargezer
Volver al índice

Qué es CITM/HERMES

CITM (Cointel In The Middle) es un servidor Linux que centraliza aspectos del mantenimiento de sistemas AlphaCom/ICX, CAST (Cointel ASTerisk), el nuevo ConnectPro y las estaciones Zenitel aisladas en modo SIP/Pulse/EDGE.

HERMES es la aplicación Java que muestra toda la información de registro y estado, permite gestionar la configuración y que puede estar en el mismo equipo CITM o en un cliente remoto (Windows/Linux).

HERMES está formado por dos partes:

  • citmd: el "demonio" Linux que se encarga de toda la transmisión de datos. Puede funcionar en Windows también para tener una versión portable de HERMES.
  • HERMES: el frontend gráfico

Además, se podrá usar la web del servidor CITM para, al menos, consultar el estado y los registros de llamadas.

Para comenzar el desarrollo, creamos una máquina virtual con la que documentar todo el proceso. Dicha máquina tendrá entorno gráfico para poder ejecutar incluso desde ella misma el HERMES.

Volver al índice

Creación de máquina virtual

Creación de la máquina virtual Ubuntu Server 22.04.1

La creamos en Megalosaurus y vamos a darle un poco de vida respecto a las que solemos crear: 2 núcleos y 4GB de RAM con 128MG de vídeo de momento:

VBoxManage createvm --name Ubuntu_22_04_1_Base --ostype Ubuntu_64 --register
VBoxManage modifyvm Ubuntu_22_04_1_Base --memory 4096
VBoxManage modifyvm Ubuntu_22_04_1_Base --vram 128
VBoxManage modifyvm Ubuntu_22_04_1_Base --cpus 2
VBoxManage modifyvm Ubuntu_22_04_1_Base --graphicscontroller vmsvga
VBoxManage modifyvm Ubuntu_22_04_1_Base --vrde on
VBoxManage modifyvm Ubuntu_22_04_1_Base --vrdemulticon on
VBoxManage modifyvm Ubuntu_22_04_1_Base --vrdeport 33151
VBoxManage modifyvm Ubuntu_22_04_1_Base --nic1 bridged
VBoxManage modifyvm Ubuntu_22_04_1_Base --bridgeadapter1 eno8403
VBoxManage modifyvm Ubuntu_22_04_1_Base --cableconnected1 on
VBoxManage createhd --filename /home/vbox/VirtualBox\ VMs/Ubuntu_22_04_1_Base/Ubuntu_22_04_1_Base.vdi --format VDI --size 150000 --variant Standard
VBoxManage storagectl Ubuntu_22_04_1_Base --name "SATA" --add sata --controller IntelAhci
VBoxManage storageattach Ubuntu_22_04_1_Base --storagectl "SATA" --port 0 --device 0 --type hdd --medium /home/vbox/VirtualBox\ VMs/Ubuntu_22_04_1_Base/Ubuntu_22_04_1_Base.vdi
VBoxManage storageattach Ubuntu_22_04_1_Base --storagectl "SATA" --port 1 --device 0 --type dvddrive --medium /home/vbox/ubuntu-22.04.1-live-server-amd64.iso

Comprobar la máquina

VBoxManage showvminfo Ubuntu_22_04_1_Base

Arrancar la máquina y proceder a la instalación del sistema

VBoxHeadless --startvm Ubuntu_22_04_1_Base &
Volver al índice

Instalación de Ubuntu Server 22.04.1 LTS Jammy Jellyfish (EOL 2032)

Al arrancar la máquina elegimos Try or Install...:

Instalar Ubuntu

Tras alrededor de un minuto, cuando termina de cargar lo necesario, eleccionamos español:

Idioma Español

Actualizamos el instalador:

Actualizar instalador

Elegimos español como idioma de la distribución del teclado:

Teclado Español

Elegimos la opción de servidor normal con software de terceros:

Ubuntu Server con terceros

Dejamos unos segundos para que DHCP haga su trabajo:

Esperar al DHCP

Dejamos la configuración de proxy por defecto:

Proxy por defecto

Dejamos la opción de mirror or defecto:

Mirror por defecto

Usamos todo el disco, sin LVM ni cifrado (el cifrado sería interesante por seguridad, pero en las pruebas resulta que pide la clave cada vez que arrancas la máquina):

Dedicar todo el disco a Ubuntu

Cuando muestre el resumen de configuración de disco pulsamos Done:

Aceptar resumen de Disco

Confirmamos que queremos destruir los datos del disco:

Confirmar destrucción de datos del disco

Damos nombre al servidor y configuramos el usuario inicial. Tendremos en cuenta que va a incluir un servidor Asterisk para pruebas, por lo que usaremos ese usuario inicialmente:

Nombre de máquina y primer usuario

Imprescindible instalar el servidor de SSH:

Instalar SSH

Continuamos cuando nos muestre que no encuentra nada de terceros para instalar:

No encuentra paquetes de terceros

No elegimos ningún extra:

Sin paquetes extra

Esperamos mientras de termina la instalación:

Esperar a que acabe la instalación

Cuando termina la instalación, reiniciamos la máquina:

Reiniciar

No hay que preocuparse al retirar la imagen de Ubuntu: Sólo hay que pulsar Enter y se expulsa automáticamente.

Expulsar medios
Volver al índice

Actualizar el sistema

sudo apt update -y
sudo apt upgrade -y

El sistema nos pedirá reiniciar algunos servicios que están usando librerías viejas:

Reiniciar servicios

Reiniciamos el sistema para asegurar de que se tienen en cuenta los cambios:

sudo shutdown -r now

Volver al índice

Utilidades básicas

sudo apt install mc vim wget htop openssh-server -y
sudo apt -y install sqlite3

El sistema nos pedirá reiniciar algunos servicios que están usando librerías viejas (si no hemos hecho un reset del sistema antes, sobre todo):

Reiniciar servicios

Por defecto, vim usa un color malísimo para los comentarios.

Para el usuario actual:

echo "highlight Comment ctermfg=Green" >> ~/.vimrc

Lo hacemos también para el root:

echo "highlight Comment ctermfg=Green" | sudo tee /root/.vimrc

Por defecto, aunque el primer usuario que se crea tiene Bash como shell, todos los demás que se creen usarán sh, cosa que no queremos:

sudo cp /etc/default/useradd /etc/default/useradd.bk
echo "SHELL=/bin/bash" | sudo tee /etc/default/useradd

Por defecto, el sistema se instala con zona horaria UTC:

sudo unlink /etc/localtime
sudo ln -s /usr/share/zoneinfo/Europe/Madrid /etc/localtime
timedatectl

De momento no vamos a tocar el firewall, que viene desactivado por defecto:

usuariopbx@citm1:~$ sudo ufw status
[sudo] password for usuariopbx:
Status: inactive
Volver al índice

Instalar MySQL

sudo apt update
sudo apt upgrade
sudo apt install mysql-server
sudo mysql_secure_installation

En versiones modernas de Ubuntu (20 o mayor), al tratar de introducir la nueva clave, nos muestra un error:

usuariopbx@citm1:~$ sudo mysql_secure_installation

Securing the MySQL server deployment.

Connecting to MySQL using a blank password.

VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

Press y|Y for Yes, any other key for No: n
Please set the password for root here.

New password:

Re-enter new password:
 ... Failed! Error: SET PASSWORD has no significance for user 'root'@'localhost' 
 as the authentication method used doesn't store authentication data in the MySQL server. 
 Please consider using ALTER USER instead if you want to change authentication parameters.

New password:

Para solucionarlo, abrimos una nueva terminal ssh SIN CERRAR la actual, y en ella:

sudo mysql
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password by 'cn79drpqfm';
flush privileges;

Escribir exit un par de veces para salir y seguir con la ventana original introduciendo de nuevo la clave.

Volver al índice

ODBC

ODBC es un estándar que permite intermediar (y por tanto simplificar y aislar) entre cualquier aplicación cliente compatible con ODBC y un sistema de base de datos compatible con ODBC como MySQL, Postgress...

Existe un derivado específico para Java: JDBC.

En nuestro caso, necesitamos OBDC para conectar Asterisk con MySQL.

sudo apt update -y
sudo apt upgrade -y
wget https://dev.mysql.com/get/Downloads/Connector-ODBC/8.0/mysql-connector-odbc-8.0.31-linux-glibc2.27-x86-64bit.tar.gz
tar xvf mysql-connector-odbc-8.0.31-linux-glibc2.27-x86-64bit.tar.gz
cd mysql-connector-odbc-8.0.31-linux-glibc2.27-x86-64bit/
sudo cp bin/* /usr/local/bin
sudo cp -R lib/* /usr/local/lib
sudo chmod 777 /usr/local/lib/libmy*
sudo apt -y install libodbc1
sudo apt -y install odbcinst1debian2
sudo myodbc-installer -a -d -n "MySQL ODBC 8.0 Driver" -t "Driver=/usr/local/lib/libmyodbc8w.so"
sudo myodbc-installer -a -d -n "MySQL ODBC 8.0" -t "Driver=/usr/local/lib/libmyodbc8a.so"
cd
rm -R mysql-connector-odbc-8.0.31-linux-glibc2.27-x86-64bit/
rm -f mysql-connector-odbc-8.0.31-linux-glibc2.27-x86-64bit.tar.gz

La instalación de ODBC nos tiene que dejar el siguiente contenido en /etc/odbcinst.ini (que originalmente está vacío):

[MySQL ODBC 8.0 Driver]
Driver=/usr/local/lib/libmyodbc8w.so
UsageCount=1

[MySQL ODBC 8.0]
Driver=/usr/local/lib/libmyodbc8a.so
UsageCount=1

Conviene instalar las utilidades básicas de ODBC:

sudo apt -y install unixodbc
Volver al índice

Instalar NTP

sudo apt update -y
sudo apt upgrade -y
sudo apt -y install ntp
# Modificar al gusto el /etc/ntp.conf
sudo systemctl enable ntp
sudo systemctl start ntp

Ntpdate es una utilidad cliente NTP de consola para sincronizar la hora local de un host con la hora global en un servidor NTP.

sudo apt -y install ntpdate

Podemos comprobar si NTP está funcionando:

usuariopbx@citm1:~$ ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 0.ubuntu.pool.n .POOL.          16 p    -   64    0    0.000   +0.000   0.000
 1.ubuntu.pool.n .POOL.          16 p    -   64    0    0.000   +0.000   0.000
 2.ubuntu.pool.n .POOL.          16 p    -   64    0    0.000   +0.000   0.000
 3.ubuntu.pool.n .POOL.          16 p    -   64    0    0.000   +0.000   0.000
 ntp.ubuntu.com  .POOL.          16 p    -   64    0    0.000   +0.000   0.000
+time.cloudflare 10.40.9.47       3 u   51   64    1   10.849  +14.103   2.518
-89.140.186.3 (d 193.203.3.170    2 u   54   64    1   31.973  +14.369   1.197
-185.90.148.209  150.214.94.10    2 u   54   64    1   38.103  +12.137   1.179
-ntp68.kashra-se 90.187.112.137   2 u   49   64    1   40.528   +9.032   3.013
...

Recordar que deberemos tener el puerto UDP/123 abierto en el Firewall si lo tenemos activo.

Volver al índice

LAMP

sudo apt update -y
sudo apt upgrade -y
sudo apt -y install apache2
sudo systemctl enable apache2
sudo systemctl start apache2
sudo systemctl status apache2
sudo apt -y install php libapache2-mod-php
sudo apt -y install php-mysql
sudo apt -y install php-gd php-opcache php-mbstring php-xml php-intl php-gettext
sudo systemctl restart apache2
sudo apt install -y phpmyadmin
# necesita intervención del usuario y pongo misma clave que root de MySQL

Ojo: Protesta porque no encuentra el php-gettext

Más adelante prepararemos los certificados y la configuración para poder trabajar por HTTPS(443) en lugar de HTTP(80).

Volver al índice

Uso de SQLite en el stack LAMP

sudo apt -y update && sudo apt -y upgrade
# Este paso lo dimos en las utilidades básicas:
sudo apt -y install sqlite3
sqlite3 --version
3.37.2 2022-01-06 13:25:41 872ba256cbf61d9290b571c0e6d82a20c224ca3ad82971edc46b29818d5dalt1
# El cliente para ver las bases de datos SQLite:
#  (es un cliente gráfico)
sudo apt -y install sqlitebrowser

Para que podamos usar SQLite con el stack LAMP que tenemos preparado:

sudo apt -y install php-sqlite3
sudo systemctl restart apache2

Una página con phpinfo() en el servidor debería mostrar si se ha integrado correctamente:

sudo cp /var/www/html/index.html /var/www/html/index_old.html
sudo mv /var/www/html/index.html /var/www/html/index.php
sudo vim /var/www/html/index.php

Y dejar como contenido en el fichero:


Debería aparecer una sección sobre pdo_sqlite (en principio, la única manera de funcionar con PHP y SQLite es usar PDOs).

Volver al índice

Servidor TFTP

sudo apt update -y
sudo apt upgrade -y
sudo apt -y install tftpd-hpa
sudo vim /etc/default/tftpd-hpa
sudo systemctl enable tftpd-hpa
sudo systemctl start tftpd-hpa
sudo systemctl status tftpd-hpa
sudo apt -y install tftp-hpa

Contenido de /etc/default/tftpd-hpa

# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="--secure"
Volver al índice

Servidor DHCP

sudo apt update -y
sudo apt upgrade -y
sudo apt -y install isc-dhcp-server
sudo vim /etc/dhcp/dhcpd.conf
sudo systemctl enable isc-dhcp-server
sudo systemctl start isc-dhcp-server
# Una vez comprobado que funciona correctamente, LO DEJAMOS APAGADO:
sudo systemctl status isc-dhcp-server
sudo systemctl disable isc-dhcp-server
sudo systemctl stop isc-dhcp-server

Contenido (orientativo para provisioning) de /etc/dhcp/dhcpd.conf:

default-lease-time 600;
max-lease-time 7200;

ddns-update-style none;
authoritative;

option tftp66 code 66 = string;

subnet 192.168.4.0 netmask 255.255.255.0 {
  range 192.168.4.80 192.168.4.89;
  option tftp66 "192.168.4.101";
  option routers 192.168.4.33;
  option subnet-mask 255.255.255.0;
  option domain-name-servers 8.8.8.8, 8.8.4.4;
}

host hostconipespecifica {
  hardware ethernet 08:00:07:26:c0:a5;
  fixed-address 192.168.4.91;
}
Volver al índice

Herramientas de desarrollo

Conviene actualizar y hacer hecho un reinicio del sistema para tener todo en condiciones:

sudo apt update -y
sudo apt upgrade -y
sudo shutdown -r now
sudo apt -y install git curl wget subversion build-essential autoconf
sudo apt -y install libnewt-dev libssl-dev libncurses5-dev libsqlite3-dev libjansson-dev libxml2-dev uuid-dev libedit-dev unixodbc-dev
sudo apt install libcurl4-openssl-dev
Volver al índice

Definición de alias

La línea de comandos es muy flexible, pero muy árida de manipular. Por ello, puede ser conveniente definir unos alias más cortos que permitan algo más de comodidad.

Para que los alias persistan en los reinicios, los meteremos en el fichero ~/.bash_aliases (que es leído por .bashrc cuando se inicia la sesión del usuario y, por tanto, habrá que crearlos para cada usuario).

alias quepasa="ps -efly | grep -i "
alias dir="ls -la "
alias cast="asterisk -rvvv"

Los cambios no tendrán efecto hasta que se reinicie la sesión o hasta que se recargue el .bashrc en una existente:

source ~/.bashrc
Volver al índice

Asterisk

La última versión LTS de Asterisk a fecha de esta instalación es la 20.0.1.

cd 
mkdir -p /home/usuariopbx/src/asterisk
cd /home/usuariopbx/src/asterisk/
wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-20-current.tar.gz
tar -zxvf asterisk-20-current.tar.gz
cd asterisk-20.0.1/
#Sólo para probar, añadimos la codificación MP3:
contrib/scripts/get_mp3_source.sh
# Y esto no había visto antes (muy recomendable):
sudo contrib/scripts/install_prereq install
sudo ./configure
# Seleccionar todo lo seleccionable.
sudo make menuselect
# Ojo: channel drivers- chan_sip viene como deprecated: marcarlo para tenerlo disponible
# Ojo: Compiler Flags- BUILD_NATIVE desactivado en las virtuales
sudo make full
sudo make install
sudo make config
sudo make samples
sudo ldconfig
sudo usermod -aG audio,dialout usuariopbx
sudo chown -R usuariopbx:usuariopbx /etc/asterisk
sudo chown -R usuariopbx:usuariopbx /usr/lib/asterisk/
# Por algún motivo, tengo que repetir este más adelante: CHEK THIS !
sudo chown -R usuariopbx:usuariopbx /var/{lib,log,spool,run}/asterisk
sudo systemctl enable asterisk
sudo systemctl start asterisk
sudo systemctl status asterisk
Volver al índice

Preparar MySQL para Asterisk

En caso de querer usar MySQL desde Asterisk, creamos una BBDD y unos usuarios:

mysql -u root -p
CREATE DATABASE asterisk;
CREATE USER 'asterisk'@'localhost' IDENTIFIED BY 'euadmye83c';
CREATE USER 'asterisk'@'127.0.0.1' IDENTIFIED BY 'euadmye83c';
GRANT ALL PRIVILEGES ON asterisk.* TO 'asterisk'@'localhost';
GRANT ALL PRIVILEGES ON asterisk.* TO 'asterisk'@'127.0.0.1';
flush privileges;
exit

Con el usuario creado, preparamos la conexión ODBC. Creamos el fichero /etc/odbc.ini:

[conexion-asterisk]
Description     =Conexión MySQL con Asterisk
Driver          =MySQL ODBC 8.0 Driver
Database        =asterisk
Server          =localhost
Port            =3306
User            =asterisk
Password        =euadmye83c

Podemos probar si la conexión funciona:

isql conexion-asterisk
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> select 1
+---------------------+
| 1                   |
+---------------------+
| 1                   |
+---------------------+
SQLRowCount returns 1
1 rows fetched
SQL> quit
Volver al índice

Instalar entorno gráfico

El entorno gráfico por defecto es gnome.

sudo apt update -y
sudo apt upgrade -y

Por defecto, ubuntu-desktop es un alias para el escritorio Gnome (paciencia que tarda un rato en instalar todo):

sudo apt -y install ubuntu-desktop
sudo shutdown -r now

En la máquina virtual no arranca y se queda con un cursor fijo arriba a la izquierda...

La mejor solución es modificar el driver que usa la máquina:

VBoxManage modifyvm Ubuntu_22_04_1_Base --graphicscontroller vmsvga

Para evitar que el sistema arranque en modo gráfico:

sudo systemctl set-default multi-user
sudo shutdown -r now

Para arrancar el escritorio:

sudo systemctl start gdm3

Para volver a activar el arranque en modo gráfico:

sudo systemctl set-default graphical

Firefox no está instalado por defecto:

sudo apt -y install firefox

Cambiar idioma

Tras la instalación, el entorno gráfico nos aparece en inglés. Vamos a cambiarlo a español (sobre todo de cara a posibles clientes).

Settings, Region & Languaje, Manage Installed Languages, Idiomas, Instalar o Eliminar Idiomas, Elegir Spanish, Apply, confirmar la clave, Aplicar a todo el sistema, confirmar la clave, esperar un ratillo (muy largo, como que reinicio sin más al de 15 minutos).

Al loro con el cambio de idioma: Luego decirle que sí cuando pregunte por cambiar el nombre de las carpetas.

La gnome-terminal no se abre (suele ser por cambiar el idioma)

Editar el /ect/default/locale y cambiar las primeras líneas:

LANG="es_ES.UTF-8"
LANGUAGE="es"
LC_NUMERIC="es_ES.UTF-8"
LC_TIME="es_ES.UTF-8"
LC_MONETARY="es_ES.UTF-8"
LC_PAPER="es_ES.UTF-8"
LC_IDENTIFICATION="es_ES.UTF-8"
LC_NAME="es_ES.UTF-8"
LC_ADDRESS="es_ES.UTF-8"
LC_TELEPHONE="es_ES.UTF-8"
LC_MEASUREMENT="es_ES.UTF-8"

También es conveniente regenerar los locales:

sudo locale-gen --purge
Volver al índice

Java JDK (oficial Oracle)

Desde la versión 11, OpenJDK y OracleJDK son lo mismo desde el punto de vista de la funcionalidad, con la única diferencia de la licencia.

Vamos a instalar OracleJDK 11.

Por defecto no hay Java instalado en la máquina que estamos usando de pruebas.

El acuerdo de licencia de Oracle no permite la instalación directa del JDK usando gestor de paquetes. Hay que crear una cuenta Oracle y descargar el JDK manualmente para añadir un repositorio de paquetes nuevo para la versión que queramos usar. Entonces se puede usar apt desde un script de instalación de terceros.

La versión de Oracle JDK que hay que descargar tiene que coincidir con la del script instalador.

Para el repositorio que vamos a usar, podemos ver la versión en este enlace. NO ES NECESARIO DESCARGAR EL INSTALADOR: Se toma del repositorio.

sudo apt update -y
sudo apt upgrade -y
# Importar la clave de firmado para verificar el nuevo software (paciencia que tarda):
sudo gpg --homedir /tmp --no-default-keyring --keyring /usr/share/keyrings/oracle-jdk11-installer.gpg --keyserver keyserver.ubuntu.com --recv-keys EA8CACC073C3DB2A
# Añadir el repositorio a la lista de fuentes de paquetes:
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/oracle-jdk11-installer.gpg] https://ppa.launchpadcontent.net/linuxuprising/java/ubuntu jammy main" | sudo tee /etc/apt/sources.list.d/oracle-jdk11-installer.list > /dev/null
# Recargar la base de datos de paquetes disponibles:
sudo apt update
Obj:1 http://es.archive.ubuntu.com/ubuntu jammy InRelease
Des:2 http://es.archive.ubuntu.com/ubuntu jammy-updates InRelease [114 kB]
Des:3 http://es.archive.ubuntu.com/ubuntu jammy-backports InRelease [99,8 kB]
Des:4 http://es.archive.ubuntu.com/ubuntu jammy-security InRelease [110 kB]
Des:5 https://ppa.launchpadcontent.net/linuxuprising/java/ubuntu jammy InRelease [18,1 kB]
Des:6 http://es.archive.ubuntu.com/ubuntu jammy-updates/main amd64 DEP-11 Metadata [95,0 kB]
Des:7 http://es.archive.ubuntu.com/ubuntu jammy-updates/universe amd64 DEP-11 Metadata [257 kB]
Des:8 http://es.archive.ubuntu.com/ubuntu jammy-updates/multiverse amd64 DEP-11 Metadata [940 B]
Des:9 http://es.archive.ubuntu.com/ubuntu jammy-backports/universe amd64 DEP-11 Metadata [11,6 kB]
Des:10 http://es.archive.ubuntu.com/ubuntu jammy-security/main amd64 DEP-11 Metadata [20,1 kB]
Des:11 http://es.archive.ubuntu.com/ubuntu jammy-security/universe amd64 DEP-11 Metadata [13,2 kB]
Des:12 https://ppa.launchpadcontent.net/linuxuprising/java/ubuntu jammy/main amd64 Packages [1.932 B]
Des:13 https://ppa.launchpadcontent.net/linuxuprising/java/ubuntu jammy/main Translation-en [692 B]
Descargados 743 kB en 1s (734 kB/s)
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias... Hecho
Leyendo la información de estado... Hecho

Descargamos del sitio de Oracle el pack de instalación (jdk-11.0.13_linux-x64_bin.tar.gz) previa introducción de los datos de la cuenta Oracle. Lo subimos al servidor con WinSCP o similar.

# El script instalador busca el pack en este directorio:
sudo mkdir -p /var/cache/oracle-jdk11-installer-local/
# Si tenemos el pack en home:
sudo cp jdk-11.0.13_linux-x64_bin.tar.gz /var/cache/oracle-jdk11-installer-local/
# Por fin la instalación en sí misma:
sudo apt install oracle-java11-installer-local
# OK y Yes para aceptar el acuerdo de licencia.
java -version
java version "11.0.13" 2021-10-19 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.13+10-LTS-370)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.13+10-LTS-370, mixed mode)

Si tenemos problemas al instalar (la versión que descargamos no coincide con el instalador del repositorio, descargamos el nuevo paquete y eliminamos los restos de la instalación anterior:

sudo apt remove oracle-java11-installer-local

A continuación, copiamos en su sitio el pack y volvemos a tratar de instalar.

En caso de tener varias instalaciones de Java, podemos elegir cuál es la que se va a usar por defecto:

sudo update-alternatives --config java
Existe 1 opción para la alternativa java (que provee /usr/bin/java).

  Selección   Ruta                                  Prioridad  Estado
------------------------------------------------------------
  0            /usr/lib/jvm/java-11-oracle/bin/java   1091      modo automático
* 1            /usr/lib/jvm/java-11-oracle/bin/java   1091      modo manual

Pulse <Intro> para mantener el valor por omisión [*] o pulse un número de selección:

Conviene preparar la variable de entorno JAVA_HOME que usan algunas aplicaciones (este cambio afecta a todos los usuarios):

# Fijarse en la ruta de los archivos de la versión preferida de 
#  Java del punto anterior (/usr/lib/jvm/java-11-oracle/bin/java)
# y añadirlo JAVA_HOME="/usr/lib/jvm/java-11-oracle" al fichero:
sudo vim /etc/environment
# Recargar o salir y entrar de la sesión:
source /etc/environment

Ejecución desde escritorio

En principio, Ubuntu no sabe cómo ejecutar un jar cuando se hace doble click sobre él en el escritorio.

La mejor opción es hacer click con el botón derecho, Properties, Open With y seleccionar Oracle Java 11 Runtime, Set as default.

Con eso ya podemos hacer doble click sobre los ejecutables.

Volver al índice

Configuración de red

Vamos a crear una configuración específica para poder conectarnos a:

  • Redes de la oficina: 172.29.8.158/20 (Red oficial)
  • Red de ATL. Enrutamientos estáticos.
  • Red del BBVA. Enrutamientos estáticos.

Netplan

Con la Aparición de 18.04 Bionic Beaber, Ubuntu introduce una nueva manera de gestionar la configuración de red, llamada Netplan.

a idea subyacente de Netplan es que funciona como un frontend en el que creamos una configuración que es totalmente independiente del sistema de configuración de red usado en el sistema (backend).

A día de hoy, el backend puede ser basado en systemd-networkd (Ubuntu lo usa en la instalación server) o en NetworkManager (Usado por Ubuntu en su modo Desktop).

Network Manager se emplea en los modos de escritorio porque es la manera de hacer que la red sea un sistema completamente transparente para el usuario: cuando te conectas por cable, la WiFi se desconecta automáticamente. Cuando el cable es desconectado, la WiFi se conecta de manera automáticamente. El resultado es que el usuario tiene siempre conectividad, independientemente del medio usado y sin tener que intervenir de ninguna manera.

La configuración Netplan está en una serie de ficheros *.yaml dentro de /etc/netplan.

Netplan toma esos ficheros y crea automáticamente otros adecuados para la configuración del backend.

Nota: es necesario prestar atención a la indexación del contenido de los ficheros de configuración de Netplan. Hay que usar espacios en blanco, no tabuladores, por cierto.

IPv4 estática. Configuración sencilla

Comprobamos el nombre de la interfaz:

ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:30:ad:dd brd ff:ff:ff:ff:ff:ff
    inet 172.29.15.112/20 metric 100 brd 172.29.15.255 scope global dynamic enp0s3
       valid_lft 27809sec preferred_lft 27809sec
    inet6 fdfb:4935:bfc4::a7a/128 scope global dynamic noprefixroute
       valid_lft 25677sec preferred_lft 25677sec
    inet6 fdfb:4935:bfc4:0:a00:27ff:fe30:addd/64 scope global mngtmpaddr noprefixroute
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe30:addd/64 scope link
       valid_lft forever preferred_lft forever

Por defecto, la instalación de Ubuntu crea un fichero /etc/netplan/00-installer-config.yaml:

# This is the network config written by 'subiquity'
network:
  ethernets:
    enp0s3:
      dhcp4: true
  version: 2

Modificación para conexión básica a la red de la oficina:

network:
  ethernets:
    enp0s3:
      cdhcp4: no
      addresses: 
        - 172.29.8.158/20
      # Se considera que gatewaty4 esta obsoleto:
      #gateway4: 172.29.0.1
      # Usar routes en su lugar
      routes:
        - to: default
          via: 172.29.0.1
          metric: 100
      nameservers:
        addresses: [8.8.8.8,8.8.4.4]
      dhcp6: false
  version: 2

Comprobamos si la configuración es buena (el sistema pone en marcha la nueva configuración, mostrando los mensajes de lo que pueda dar problemas, y si hay problemas vuelve el solo a la configuración anterior):

sudo netplan --debug apply

Desactivar IPv6

Podemos desactivar completamente y de manera permanente las opciones de IPv6 si no las vamos a usar. Editamos (sudo) /etc/default/grub y dejamos la línea:

GRUB_CMDLINE_LINUX_DEFAULT="ipv6.disable=1"

Ponemos en marcha los cambios para el siguiente reinicio:

sudo update-grub

CloudInit

Es un paquete de Ubuntu, instalado por defecto en Ubuntu Server, que permite la inicialización temprana de una instancia de red de Ubuntu.

En nuestro caso no lo usamos, por lo que vamos a evitar que funcione para no tener problemas de retrasos al arrancar la máquina.

sudo touch /etc/cloud/cloud-init.disabled

En el siguiente reinicio nos habremos librado de él.

Configuración avanzada

IP Alias

Definir varias direcciones IP para una misma interfaz es muy sencillo. En el archivo yaml, añadimos las direcciones:

network:
  ethernets:
    enp0s3:
     dhcp4: no
     addresses:
       - 172.29.8.158/20
       - 10.20.85.158/21
       - 11.20.85.158/21
     routes:
       - to: default
         via: 172.29.0.1
         metric: 100
     nameservers:
       addresses: [8.8.8.8,8.8.4.4]
     dhcp6: false
  version: 2

Rutas estáticas

El comando ip route muestra las rutas configuradas actualmente (en este caso para las dos IP del apartado anterior):

ip route
default via 172.29.0.1 dev enp0s3 proto static metric 100
11.20.80.0/21 dev enp0s3 proto kernel scope link src 11.20.85.158
172.29.0.0/20 dev enp0s3 proto kernel scope link src 172.29.8.158

Para añadir una ruta estática modificamos el fichero yaml y añadimos los elementos. Podemos jugar con la métrica de los enrutamientos: Menor metric = mayor prioridad:

network:
  ethernets:
    enp0s3:
     dhcp4: no
     addresses:
       - 172.29.8.158/20
     routes:
       - to: default
         via: 172.29.0.1
         metric: 100
       - to: 11.126.96.0/20
         via: 172.29.1.101
         metric: 200
     nameservers:
       addresses: [8.8.8.8,8.8.4.4]
     dhcp6: false
  version: 2

FortiClient

Es posible instalar el FortiClient (el cliente de VPN de los productos FortiGate).

Es necesario instalar varias dependencias (depende del caso concreto, pero en este ejemplo hablamos de un Ubuntu...):

sudo apt update
sudo apt install libappindicator1
sudo apt install libgconf-2-4

Descargamos el paquete de la web oficial.

Y lo instalamos:

sudo dpkg -i forticlient_vpn_7.0.7.0246_amd64.deb

De cara a la ejecución, no encuentro opción de línea de comandos por lo que hay que buscarlo en el lanzador de aplicaciones.

Notas finales: También es posible hacer bridging entre interfaces...

Volver al índice

Puesta en marcha de la web

La instalación por defecto del servidor Apache2 permite el acceso por el puerto 80 (no seguro) al sistema.

Por defecto hay una página de muestra en /var/www/html/index.html que muestra dónde están los ficheros por defecto de configuración, manuales, etc.

(Todos los ficheros de configuración son propiedad de root)

This is the default welcome page used to test the correct operation of the Apache2 
server after installation on Ubuntu systems. It is based on the equivalent page on 
Debian, from which the Ubuntu Apache packaging is derived. If you can read this page, 
it means that the Apache HTTP server installed at this site is working properly. 
You should replace this file (located at /var/www/html/index.htmlfully 
documented in /usr/share/doc/apache2/README.Debian.gz. Refer to 
this for the full documentation. Documentation for the web server 
itself can be found by accessing the manual if the apache2-doc 
package was installed on this server.

The configuration layout for an Apache2 web server installation on Ubuntu systems is as follows:

/etc/apache2/
|-- apache2.conf
|       `--  ports.conf
|-- mods-enabled
|       |-- *.load
|       `-- *.conf
|-- conf-enabled
|       `-- *.conf
|-- sites-enabled
|       `-- *.conf
  

== apache2.conf is the main configuration file. It puts the pieces together by 
including all remaining configuration files when starting up the web server.
== ports.conf is always included from the main configuration file. It is used 
to determine the listening ports for incoming connections, and this file 
can be customized anytime.
== Configuration files in the mods-enabled/, conf-enabled/ and sites-enabled/ 
directories contain particular configuration snippets which manage modules, 
global configuration fragments, or virtual host configurations, respectively.
== They are activated by symlinking available configuration files from their 
respective *-available/ counterparts. These should be managed by using 
our helpers a2enmod, a2dismod, a2ensite, a2dissite, and a2enconf, a2disconf . 
See their respective man pages for detailed information.
== The binary is called apache2. Due to the use of environment variables, 
in the default configuration, apache2 needs to be started/stopped with 
/etc/init.d/apache2 or apache2ctl. Calling /usr/bin/apache2 directly 
will not work with the default configuration.

Document Roots

By default, Ubuntu does not allow access through the web browser to 
any file apart of those located in /var/www, public_html directories 
(when enabled) and /usr/share (for web applications). If your site 
is using a web document root located elsewhere (such as in /srv) 
you may need to whitelist your document root directory in 
/etc/apache2/apache2.conf.

The default Ubuntu document root is /var/www/html. You can make 
your own virtual hosts under /var/www. This is different to previous 
releases which provides better security out of the box.
Reporting Problems

Please use the ubuntu-bug tool to report bugs in the Apache2 package 
with Ubuntu. However, check existing bug reports before reporting
a new bug.

Please report bugs specific to modules (such as PHP and others) 
to respective packages, not to the web server itself.

El primer paso es hacer una copia de seguridad de todos los ficheros, por si la liamos:

sudo cp -R /etc/apache2 /root/apache2_backup
sudo cp -R /var/www/html/index.html /root/index_backup.html
sudo cp -R /var/www/html/index.php /root/index_backup.php

Nos "fabricamos" un certificado digital para el servidor, con el que cifraremos las comunicaciones (tendremos ya instaladas las utilidades openssl en el servidor). OJO, al tratarse de un certificado autofirmado, las comunicaciones estarán cifradas, pero en todos los navegadores recibiremos el aviso de que NO confía en el certificado por no estar firmado por una CA de confianza:

vbox@vbox2:~$ sudo openssl req -x509 -nodes -days 9125 -newkey rsa:2048 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt
Can\'t load /home/vbox/.rnd into RNG
140262466421184:error:2406F079:random number generator:RAND_load_file:Cannot open file:../crypto/rand/randfile.c:88:Filename=/home/vbox/.rnd
Generating a RSA private key
.............+++++
.........................................................................................+++++
writing new private key to \'/etc/ssl/private/apache-selfsigned.key\'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter \'.\', the field will be left blank.
-----
Country Name (2 letter code) [AU]:ES
State or Province Name (full name) [Some-State]:BIZKAIA
Locality Name (eg, city) []:jBILBO
Organization Name (eg, company) [Internet Widgits Pty Ltd]:COINTEL S.L.
Organizational Unit Name (eg, section) []:Tech.Dep.
Common Name (e.g. server FQDN or YOUR name) []:172.29.8.158
Email Address []:jlanza@cointel.es
vbox@vbox2:~$

El dato realmente importante de los proporcionados al comando es el Common Name, ya que es el usado para reconocer al servidor. Si tenemos un nombre de dominio lo usamos, si no, ponemos la IP del servidor.

Hay una explicación bastante completa del proceso aquí. Las distintas opciones significan:

openssl
This is the basic command line tool for creating and managing OpenSSL certificates, keys, and other files.
req
This subcommand specifies to use X.509 certificate signing request (CSR) management. The “X.509” is a public key infrastructure standard that SSL and TLS adhere to for its key and certificate management. To create a new X.509 cert, use this subcommand.
-x509
This further modifies the previous subcommand by telling the utility to make a self-signed certificate instead of generating a certificate signing request, as would normally happen.
-nodes
This tells OpenSSL to skip the option to secure the certificate with a passphrase. Apache needs to be able to read the file, without user intervention, when the server starts up. A passphrase would prevent this from happening because users would have to enter it after every restart.
-days 9125
This option sets the length of time that the certificate will be considered valid. In this case, it’s set for 25 years.
-newkey rsa:2048
This specifies that you want to generate a new certificate and a new key at the same time. The key required to sign the certificate was not created in a previous step, so it needs to be created along with the certificate. The rsa:2048 portion tells it to make an RSA key that is 2048 bits long.
-keyout
This line tells OpenSSL where to place the generated private key file that’s being created.
-out
This tells OpenSSL where to place the certificate that’s being created.

El comando deja ya en sus carpetas la clave y el certificado.

Ahora toca configurar Apache para que active la escucha por el puerto 443 (no olvidar el firewall si lo tenemos activo) y para que use el cifrado fuerte que queremos.

Creamos (sudo) un fichero de configuración (no existe por defecto) llamado /etc/apache2/conf-available/ssl-params.conf con el siguiente contenido (podrá ser usado por todos los servidores virtuales):

SSLCipherSuite EECDH+AESGCM:EDH+AESGCM
# Requires Apache 2.4.36 & OpenSSL 1.1.1
SSLProtocol -all +TLSv1.3 +TLSv1.2
SSLOpenSSLConfCmd Curves X25519:secp521r1:secp384r1:prime256v1
# Older versions
# SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLHonorCipherOrder On
# Disable preloading HSTS for now.  You can use the commented out header line that includes 
# the "preload" directive if you understand the implications.
# Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
# Requires Apache >= 2.4
SSLCompression off
SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
# Requires Apache >= 2.4.11
SSLSessionTickets Off

Editamos (sudo) el fichero /etc/apache2/sites-available/default-ssl.conf:

<IfModule mod_ssl.c>
        <VirtualHost _default_:443>
                ServerAdmin jlanza@cointel.es
                ServerName 172.29.8.40
                DocumentRoot /var/www/html
                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined
                SSLEngine on
                SSLCertificateFile    /etc/ssl/certs/apache-selfsigned.crt
                SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key
                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory /usr/lib/cgi-bin>
                                SSLOptions +StdEnvVars
                </Directory>
        </VirtualHost>
</IfModule>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

No queremos que el sistema trabaje por el puerto 80, así que editamos (sudo) el fichero /etc/apache2/sites-available/000-default.conf para que todo tráfico del puerto 80 pase al 443:

<VirtualHost *:80>
        ServerAdmin jlanza@cointel.es
        DocumentRoot /var/www/html
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
        Redirect "/" "https://172.29.8.40/"
</VirtualHost>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

Habilitamos los cambios en Apache:

Habilitar el módulo ssl:

sudo a2enmod ssl

Habilitar el módulo de cabeceras:

sudo a2enmod headers

Habilitar el servidor virtual:

sudo a2ensite default-ssl

Habilitar los parámetros de cifrado:

sudo a2enconf ssl-params

Podemos probar si está todo bien:

sudo apache2ctl configtest
AH00558: apache2: Could not reliably determine the server\'s fully qualified domain name, using 127.0.1.1. Set the \'ServerName\' directive globally to suppress this message
Syntax OK
vbox@vbox2:~$

Reiniciamos Apache:

sudo systemctl restart apache2

Si queremos que la redirección sea permanente una vez que vemos que funciona, volvemos a editar /etc/apache2/sites-available/000-default.conf (pero primero hay que hacer la otra redirección, no se puede hacer esta directamente):

<VirtualHost *:80>
        ServerAdmin jlanza@cointel.es
        DocumentRoot /var/www/html
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
        Redirect permanent "/" "https://172.29.8.40/"
</VirtualHost>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
Volver al índice

Algunos detalles sueltos

Ver la ruta para llegar a una dirección

ip route get 8.8.8.8
8.8.8.8 via 172.29.0.1 dev enp0s3 src 172.29.8.158 uid 1000
    cache
ip route get 11.20.85.44
11.20.85.44 dev enp0s3 src 11.20.85.158 uid 1000
    cache

Ver qué conexiones hay en el sistema

ss -ltpan
State      Recv-Q     Send-Q         Local Address:Port          Peer Address:Port      Process
LISTEN     0          4096           127.0.0.53%lo:53                 0.0.0.0:*
LISTEN     0          128                  0.0.0.0:22                 0.0.0.0:*
LISTEN     0          128                127.0.0.1:631                0.0.0.0:*
LISTEN     0          70                 127.0.0.1:33060              0.0.0.0:*
LISTEN     0          151                127.0.0.1:3306               0.0.0.0:*
LISTEN     0          10                   0.0.0.0:5038               0.0.0.0:*
LISTEN     0          511                  0.0.0.0:80                 0.0.0.0:*
ESTAB      0          0                  127.0.0.1:50424            127.0.0.1:3306
ESTAB      0          0                  127.0.0.1:3306             127.0.0.1:50424
ESTAB      0          0               172.29.8.158:59440         35.82.48.240:443        users:(("firefox",pid=2791,fd=102))
ESTAB      0          0               172.29.8.158:22            172.29.1.120:63331

Ver estadísticas de red

ip -s link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    RX:  bytes packets errors dropped  missed   mcast
         34677     290      0       0       0       0
    TX:  bytes packets errors dropped carrier collsns
         34677     290      0       0       0       0
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 08:00:27:30:ad:dd brd ff:ff:ff:ff:ff:ff
    RX:  bytes packets errors dropped  missed   mcast
       4856856   59680      0       0       0     810
    TX:  bytes packets errors dropped carrier collsns
      11852474   26042      0       0       0       0
Volver al índice

(c) 2010 a 2022 J.L.T.