lunes, 8 de enero de 2024

ODOO (XII) Configurar nginx con Odoo16 en Debian 12. Problemas con el firewall. Crear servidores simples http y https

 Créditos:

https://github.com/odoomates/odoosamples/blob/main/odoo_nginx_conf

https://www.youtube.com/watch?v=-hVYQd7A7PQ


1. Conseguir y adaptar los certificados al formato requerido por Nginx

Se opera igual que en el post anterior para conseguir cambiar el formato de los certificados, cuyo texto copio a continuacion:

En este caso disponemos de un certificado en formato pkcs#12 (extension ".p12"). Parece ser que Nginx prefiere tener el certificado en ficheros, uno con extensión ".crt" y otro, la clave , con extensión ".key". 

Para convertir de format pkcs#12 al último formato ejecutamos:

#1. Extract certificate in crt format
openssl pkcs12 -in ./MyCert.p12 -clcerts -nokeys -out wildcard2023Nginx.crt

#2. Extract key in rsa format
openssl pkcs12 -in ./MyCert.p12 -nocerts -nodes  -out wildcard2023Nginx.rsa

En este caso, el nombre se debe a que es un certificado wildcard que valida cualquier ordenador con el dominio "poblacion.es", como por ejemplo "odoo.poblacion.es" . En el proceso anterior nos pide la contraseña, por tanto ya tenemos este par de certificado y clave:

  • wildcard2023Nginx.crt y 
  • wildcard2023Nginx.rsa

2. Crear una carpeta en el servidor remoto y copiar dentro los certificados

Creamos la carpeta 

/etc/nginx/certs

y copiamos dentro los dos ficheros anteriores


3. Configurar nginx

El fichero /etc/nginx/sites-available/default esta interfiriendo en la configuracion de nginx. por tanto o hay que borrarlo (opcion drastica) o trasladarlo a una carpeta fuera de nginx donde guardar archivos por si acaso. 

En otro post anterior se vio como configurar nginx con docker, pero aqui cambian algunos detalles.

Ahora se crea el fichero /etc/nginx/conf.d/odoo.conf y se le da este contenido. Observar que no controla para nada el puerto 80 (cosa poco recomendable, pues habria que redirigirlo a un puerto https) y como puerto https se usa el 443 

Como el mismo servidor de Odoo tambien tiene instalado el nginx, entonces reconoce las perticiones a odoo al puerto 8069 (upstream odoo) y las del chat odoo del puerto 8072 (upstream odoochat)

Con el listen 443 ssl se permite la escucha oir dicho puerto con el esquema ssl (https para entendernos), y le indicamos la IP (en ester caso 192.168.28.139) o el alias si hubiera (server_name 192.168.28.139)

Se describe donde se guardan los logs y diversos parametros para la redireccion (location), cabeceras (proxy_set_header ...)


#odoo server
upstream odoo {
server 127.0.0.1:8069;
}

#Se tiene que abrir el puerto en el firewall.!!!!!
upstream odoochat {
server 127.0.0.1:8072;
}
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}

server {
listen 80;
server_name odoo.localidad.es 192.168.28.139;
rewrite ^(.*) https://$host$1 permanent;
}

server {
#listen 443 ssl;
listen 8443 ssl;
server_name odoo.localidad.es 192.168.28.139;

# 2.1.2 certificados obtenidos en el punto 2
ssl_certificate /etc/nginx/certs/wildcard2023Nginx.crt;
ssl_certificate_key /etc/nginx/certs/wildcard2023Nginx.rsa;

proxy_read_timeout 720s;
proxy_connect_timeout 720s;
proxy_send_timeout 720s;

# Add Headers for odoo proxy mode
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
add_header X-debug-message "1. Passing to odoo16 host=$host ,remote_addr=$remote_addr ,proxy_add_x_forwarded_for=$proxy_add_x_forwarded_for ,scheme=$scheme server_port=$server_port ,http_upgrade=$http_upgrade ,request_uri=$request_uri" always;

# log
access_log /var/log/nginx/odoo.access.log;
error_log /var/log/nginx/odoo.error.log;
location /websocket {
proxy_pass http://odoochat;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
}

location / {
proxy_redirect off;
proxy_pass http://odoo;
}

# common gzip
gzip_types text/css text/less text/plain text/xml application/xml application/json application/javascript;
gzip on;
}





#odoo server
upstream odoo {
server 127.0.0.1:8069;
}

upstream odoochat {
server 127.0.0.1:8072;
}


server {
#listen 80;
listen 443 ssl;
server_name 192.168.28.139;
#odoo.localidad.es www.odoo.localidad.es;

# 2.1.2 certificados obtenidos en el punto 2
ssl_certificate /etc/nginx/certs/wildcard2023Nginx.crt;
ssl_certificate_key /etc/nginx/certs/wildcard2023Nginx.rsa;


proxy_read_timeout 720s;
proxy_connect_timeout 720s;
proxy_send_timeout 720s;


# Add Headers for odoo proxy mode
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;

# log
access_log /var/log/nginx/odoo.access.log;
error_log /var/log/nginx/odoo.error.log;

# Redirect requests to odoo backend server
location / {
proxy_redirect off;
proxy_pass http://odoo;
}
location /longpolling {
proxy_pass http://odoochat;
}

# common gzip
gzip_types text/css text/less text/plain text/xml application/xml application/json application/javascript;
gzip on;


client_body_in_file_only clean;
client_body_buffer_size 32K;
client_max_body_size 500M;
sendfile on;
send_timeout 600s;
keepalive_timeout 300;
}


En un post anterior se explicó un poco como podemos hacer un debug de las variables de nginx usando las herramientas de desarrollador de los navegadores. En concreto se uso esta definicion de cabecera:

add_header X-debug-message "2. Passing to odoo16 host=$host ,remote_addr=$remote_addr ,proxy_add_x_forwarded_for=$proxy_add_x_forwarded_for ,scheme=$scheme server_port=$server_port ,http_upgrade=$http_upgrade ,request_uri=$request_uri" always;

Siendo las variables de nginx las que comienzan por "$"

4. Rearrancar el servicio de nginx


sudo service nginx stop
sudo service nginx start

5. Dar un nombre de dominio

Como se ha instalado un certificado wildcard que se aplica a "*.localidad.es", se le puede dar el nombre de dominio "odoo.localidad.es".
Para ello, se deben dar de alta estos dominios a los "domain servers" que tengamos en nuestra red y ya se abren mediante un firewall a la internet general.

6. Problemas con el firewall

OJO:  
  • Verificar que NO se utilizan los puertos 80 ni 443 en nginx!! 
  • Utilizar 8080 o 8443 
  • Tras la instalación del servidor https/https "twisted" y su ejecución, parece ser que inexplicablemente deja de haber problemas de rechazo de conexión!


Si queremos testear nuestra IP de salida que esta filtrada por el firewall, hay que hacerlo desde una maquina remota, para ello podemos hacer uso de killercoda.com


Entramos en Playgrounds y seleccionamos una maquina ubuntu y podemos testear desde esta maquina externa nuestros puertos.

6.1 Herramientas disponibles

Para escanear los puertos abiertos de una IP remota se puede hacer de varias maneras:

6.1.1 Utilizando netcat

Instalar net cat : apt-get install netcat -y
nc -zv IP puerto (ejemplo nc -zv 46.24.94.100 443) y devuelve:
  • Si esta abierto: Connection to 46.24.94.100 443 port [tcp/http] succeeded!
  • Si esta cerrado: Se queda en espera eternamente y no contesta.
  • Si rechaza la conexion: nc: connect to 46.24.94.60 port 7324 (tcp) failed: Connection refused
Siendo
-z : escanea daemos de esclucha (listening daemons).
-v : Muestra salida detallada(output in verbose mode).

6.1.2 Utilizando nmap

Instalar net cat : apt-get install nmap -y
nmap IP (escanea todos los puertos que sean estandard !!!) 
nmap IP -p puerto 

Si hacemos nmap 46.24.94.100 contesta:

Starting Nmap 7.80 ( https://nmap.org ) at 2024-01-10 07:07 UTC
Nmap scan report for static-60-94-24-100.ipcom.comunitel.net (46.24.94.100)
Host is up (0.034s latency).
Not shown: 989 filtered ports
PORT     STATE  SERVICE
25/tcp   open   smtp
80/tcp   open   http
465/tcp  open   smtps
587/tcp  open   submission
981/tcp  closed unknown
2222/tcp open   EtherNetIP-1
8088/tcp open   radan-http
8099/tcp open   unknown
8443/tcp open   https-alt
9090/tcp open   zeus-admin
9943/tcp open   unknown

Pero si hacemos nmap 46.24.94.100 -p 19444 contesta:
  • Si esta abierto19444/tcp open  unknown
  • Si esta cerrado19444/tcp filtered unknown
  • Si rechaza la conexion: 19444/tcp closed swx.

6.1.3 Utilizando telnet

Instalar net cat : apt-get install telnet -y

telnet IP puerto (por ejemplo telnet 46.24.94.100 443)

Y contesta

Pero si hacemos nmap 46.24.94.100 -p 19444 contesta:
  • Si esta abiertoConnected to 46.24.94.60. Escape character is '^]'.
  • Si esta cerrado: Se queda en espera..
  • Si rechaza la conexion: telnet: Unable to connect to remote host: Connection refused

6.1.4 Utilizar un escaneador de puertos por internet

Por ejemplo https://dnschecker.org y le damos la IP y el puerto o puertos.


6.2 Crear un servidor http/https de pruebas interno


Veamos como crear un servidor http simple

python3 -m http.server <port>  (por ejemplo python3 -m http.server 8080)

Y si queremos crear un servidor https simple , tenemos que instalar el servidor twisted

pip3 install twisted

Y ejecutar 

# Definicion del comado
sudo twistd web --https=<port> --path=. -c </path/to/cert.pem> -k </path/to/privatekey.pem> 

# Ejemplo de uso
sudo twistd web --https=8443 --path=. -c /etc/nginx/certs/wildcard2023Nginx.crt -k /etc/nginx/certs/wildcard2023Nginx.rsa

Donde se definen las rutas al certificado y la clave


y si entramos en un navegador vemos:





No hay comentarios :

Publicar un comentario