Diferència entre revisions de la pàgina «Wiket:ProxyInversIETI»

De Wiket
Salta a la navegació Salta a la cerca
 
(Hi ha 12 revisions intermèdies del mateix usuari que no es mostren)
Línia 1: Línia 1:
 
Projectes Ciberseguretat 2022-2023 - IETI Cloud
 
Projectes Ciberseguretat 2022-2023 - IETI Cloud
  
Reverse Proxy Web Interface
+
<h2> Reverse Proxy Web Interface con Vagrant </h2>
  
  
Dins el IETI Cloud tenim un frontend de proxy invers implementat amb HAProxy i Apache2. Volem una interfície web per gestionar-ho amb més facilitat i poder afegir nous dominis sense necessitat de tocar arxius de configuració directament.
+
'''Dins el IETI Cloud tenim un frontend de proxy invers implementat amb HAProxy i Apache2. Volem una interfície web per gestionar-ho amb més facilitat i poder afegir nous dominis sense necessitat de tocar arxius de configuració directament.
 +
 
 +
'''El projecte pot contemplar parts molt diferenciades:
  
El projecte pot contemplar parts molt diferenciades:
 
  
 
1. Fer una recerca i prova de diverses interfícies web per HAProxy (tipus Roxy-Wi) per veure si hi ha alguna que ens faciliti molt la feina, adaptant-se a les nostres necessitats, i que sigui segura.
 
1. Fer una recerca i prova de diverses interfícies web per HAProxy (tipus Roxy-Wi) per veure si hi ha alguna que ens faciliti molt la feina, adaptant-se a les nostres necessitats, i que sigui segura.
Línia 17: Línia 18:
 
pfSense
 
pfSense
 
Traefik v2
 
Traefik v2
Apache (noté mode TCP pel què no pot redirigir )
+
Apache (no té mode TCP pel què no pot redirigir )
 
Nginx
 
Nginx
  
Per a fer les proves requerim també un entorn de treball en Vagrant (o, si es vol investigar, en Terraform) que posi en marxa N VMs de servidor (per a N dominis diferents, amb un mínim de 3) + 1 VM de proxy invers (sigui HAProxy o Traefik). Aquest ens anirà bé per provar tant la part (1,3) dels softwares que trobarem, com la part (2) de desenvolupament de l’aplicació pròpia per a HAProxy.
 
  
  
Para realizar todos estos pasos anteriores, primero deberemos preparar el entorno.
+
'''Para realizar todos estos pasos anteriores, primero deberemos preparar el entorno.
 
Para ello se utilizará un fichero Vagrantfile en el cual a partir de una serie de parametros determinados nos permitira virtualizar varias maquinas a la vez.
 
Para ello se utilizará un fichero Vagrantfile en el cual a partir de una serie de parametros determinados nos permitira virtualizar varias maquinas a la vez.
  
El fichero contendrá los parametros necesarios para generar 5 MV's de manera que habrán 3 servidores con apache instalado, 1 proxy inverso con Traefik, y 1 equipo cliente para realizar las comprobaciones.
+
'''El fichero contendrá los parametros necesarios para generar 5 MV's de manera que habrán 3 servidores con apache instalado, 1 proxy inverso con Traefik, y 1 equipo cliente para realizar las comprobaciones.
 +
 
 +
* Los ficheros de configuración del servicio Traefik solo se crearán, pero hará falta rellenarlos segun la configuración que se quiera realizar
 +
 
 +
Contenido del fichero Vagrantfile:
  
A continuación se muestra un diagrama sobre el funcionamiento del sistema desde la petición del cliente, que a traves de uno de los dominios disponibles accede al proxy inverso configurado con TraefikV2, el cual segun la carga de procesamiento que tengan los servidores lo redirigirá al servidor con menor carga de datos.
+
 
 +
 
 +
<
 +
 
 +
Vagrant.configure("2") do |config|
 +
  (1..3).each do |i|
 +
    config.vm.define "node-#{i}" do |node|
 +
      node.vm.box = "ubuntu/focal64"
 +
      node.vm.hostname = "srv#{i}.ieti.local"
 +
      node.vm.box_url = "ubuntu/focal64"
 +
      node.vm.network :private_network, ip: "192.168.2.1{i}"
 +
      node.vm.synced_folder ".", "/home/vagrant", type: "virtualbox"
 +
        node.vm.provider :virtualbox do |v|
 +
          v.customize ["modifyvm", :id, "--memory", "1024"]
 +
          v.customize ["modifyvm", :id, "--cableconnected1", "on"]
 +
          v.customize ["modifyvm", :id, "--uart1", "0x3F8", "4"]
 +
          v.customize ["modifyvm", :id, "--uartmode1", "file", File::NULL]
 +
          v.gui = true     
 +
        end
 +
        config.vm.provision "shell", inline: <<-SHELL
 +
        apt-get update
 +
        apt-get install -y apache2
 +
        sudo ufw allow 'Apache'
 +
        sudo systemctl start apache2
 +
        sudo echo "<html><hI>SRV#{i}</hI></html>" > /var/www/html/index.html
 +
        sudo systemctl restart apache2
 +
        SHELL
 +
    end
 +
  end
 +
  #Maquina Proxy Inverso Traefik
 +
  config.vm.define "prxy1" do |prxy1|
 +
    prxy1.vm.box = "ubuntu/focal64"
 +
    prxy1.vm.hostname = 'prxy1'
 +
    prxy1.vm.box_url = "ubuntu/focal64"
 +
    prxy1.vm.network :private_network, ip: "192.168.2.11"
 +
    prxy1.vm.network :private_network, ip: "192.168.1.11"
 +
    prxy1.vm.synced_folder ".", "/home/vagrant", type: "virtualbox"
 +
    prxy1.vm.provider :virtualbox do |v|
 +
      v.customize ["modifyvm", :id, "--memory", "1024"]
 +
      v.customize ["modifyvm", :id, "--cableconnected1", "on"]
 +
      v.customize ["modifyvm", :id, "--uart1", "0x3F8", "4"]
 +
      v.customize ["modifyvm", :id, "--uartmode1", "file", File::NULL]
 +
      v.gui = true
 +
    end
 +
    config.vm.provision "shell", inline: <<-SHELL
 +
    apt-get update
 +
    #Descargamos el source code de traefik, descomprimimos el archivo y damos permisos
 +
    #de ejecución
 +
    sudo wget
 +
    https://github.com/traefik/traefik/releases/download/v2.8.7/traefik_v2.8.7_linux_amd64.tar.gz
 +
    sudo tar -xzvf traefik_v2.8.7_linux_amd64.tar.gz
 +
    sudo chmod +x traefik
 +
    #Movemos el binario de traefik a la carpeta bin y le permitimos el "bind" de puertos
 +
    sudo mv traefik /usr/local/bin/traefik
 +
    sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/traefik
 +
    #Creamos el grupo y usuario traefik (especificado en traefik.service)
 +
    sudo groupadd -g 321 traefik
 +
    sudo useradd  -g traefik --no-user-group  --home-dir /var/www --no-create-home --shell
 +
    /usr/sbin/nologin --system --uid 321 traefik 
 +
    #Creamos la carpeta donde estara la configuración de traefik
 +
    #(adjuntare un archivo de muestra)
 +
    #y otorgamos dueños y permisos de los archivos
 +
    sudo mkdir /etc/traefik
 +
    sudo mkdir /etc/traefik/acme
 +
    sudo chown -R root:root /etc/traefik
 +
    sudo chown -R traefik:traefik /etc/traefik/acme
 +
    #En este paso, deberemos crear un archivo de configuración en caso de que no lo tengamos
 +
    sudo touch /etc/traefik/trafik.toml
 +
    sudo chown root:root /etc/traefik/traefik.toml
 +
    sudo chmod 644 /etc/traefik/traefik.toml
 +
    #Aqui moveremos el archivo de configuración DEL SERVICIO, en caso de no tenerlo deberemos
 +
    #crearlo y copiar el texto que haya en el archivo de ejemplo que he adjuntado
 +
    sudo touch /etc/systemd/system/traefik.service
 +
    sudo chown root:root /etc/systemd/system/traefik.service
 +
    sudo chmod 644 /etc/systemd/system/traefik.service
 +
    #Recargamos el servicio y lo iniciamos
 +
    sudo systemctl daemon-reload
 +
    sudo systemctl start traefik.service
 +
    sudo systemctl enable traefik.service
 +
    #Añadimos los nombres de los servidores a /etc/hosts
 +
    sudo echo "192.168.2.10 srv1.ieti.local" >> /etc/hosts
 +
    sudo echo "192.168.2.11" srv2.ieti.local >> /etc/hosts
 +
    sudo echo "192.168.2.12" srv3.ieti.local >> /etc/hosts
 +
    SHELL
 +
  end
 +
  #Maquina cliente
 +
  config.vm.define "cli1" do |cli1|
 +
    cli1.vm.box = "ubuntu/focal64"
 +
    cli1.vm.hostname = 'cli1'
 +
    cli1.vm.box_url = "ubuntu/focal64"
 +
    cli1.vm.network :private_network, ip: "192.168.2.12"
 +
    cli1.vm.synced_folder ".", "/home/vagrant", type: "virtualbox"
 +
    cli1.vm.provider :virtualbox do |v|
 +
      v.customize ["modifyvm", :id, "--memory", "3072"]
 +
      v.customize ["modifyvm", :id, "--cableconnected1", "on"]
 +
      v.customize ["modifyvm", :id, "--uart1", "0x3F8", "4"]
 +
      v.customize ["modifyvm", :id, "--uartmode1", "file", File::NULL]
 +
      v.gui = true
 +
    end
 +
    config.vm.provision "shell", inline: <<-SHELL
 +
    sudo apt-get update
 +
    sudo apt install ubuntu-gnome-desktop
 +
    SHELL
 +
  end
 +
end
 +
 
 +
>
 +
 
 +
 
 +
 
 +
 
 +
 
 +
'''A continuación se muestra un diagrama sobre el funcionamiento del sistema desde la petición del cliente, que a traves de uno de los dominios disponibles accede al proxy inverso configurado con TraefikV2, el cual segun la carga de procesamiento que tengan los servidores lo redirigirá al servidor con menor carga de datos. '''
  
 
[[Fitxer:Blank diagram.png|900px|centre|]]
 
[[Fitxer:Blank diagram.png|900px|centre|]]
Línia 35: Línia 151:
 
A partir de las maquinas obtenidas a traves del Vagrantfile, hay unos aspectos a tener en cuenta de modificar para que haya un funcionamiento correcto.
 
A partir de las maquinas obtenidas a traves del Vagrantfile, hay unos aspectos a tener en cuenta de modificar para que haya un funcionamiento correcto.
  
1. Editar el fichero /etc/hosts en el Proxy y añadir la IP del servidor seguido de su dominio. (Ej: 192.168.1.10 srv1.ieti.local)
+
1. Editar el fichero /etc/hosts en el Proxy y añadir la IP del servidor seguido de su dominio.  
 +
 
 +
(Ej: 192.168.1.10 srv1.ieti.local)
  
 
2. Editar i/o añadir el fichero de configuración de Traefik (traefik.toml/traefik.yaml). Se adjunta un ejemplo:
 
2. Editar i/o añadir el fichero de configuración de Traefik (traefik.toml/traefik.yaml). Se adjunta un ejemplo:
  
''
+
 
 
Definimos el entryPoint (puerto por donde escuchará el proxy)
 
Definimos el entryPoint (puerto por donde escuchará el proxy)
 +
 +
<
  
 
[entryPoints]
 
[entryPoints]
 
   [entryPoints.web]
 
   [entryPoints.web]
 
     address = ":80"
 
     address = ":80"
[http]
+
 
 +
//Tambien se pueden realizar las configuraciones en mas de un fichero, uno para indicar el entryPoint, y otro para indicar el servicio HTTP (Disponible en la documentación al final de la wiki)
 +
[http]
 
       //Indicamos el host que debe redirigir
 
       //Indicamos el host que debe redirigir
 
     [http.routers]
 
     [http.routers]
Línia 56: Línia 178:
 
         [[http.services.traefik.loadBalancer.servers]]
 
         [[http.services.traefik.loadBalancer.servers]]
 
           url = "dom1.ieti.cat"
 
           url = "dom1.ieti.cat"
[serversTransport]
+
[serversTransport]
 
   insecureSkipVerify = true
 
   insecureSkipVerify = true
 
+
//Indicamos el fichero de logs
//Indicamos el fichero de logs
+
[log]
[log]
 
 
   filePath = "/var/log/traefik.log"
 
   filePath = "/var/log/traefik.log"
//Habilitamos el acceso al dashboard
+
  //Habilitamos el acceso al dashboard
[api]
+
  [api]
 
   dashboard = true
 
   dashboard = true
 
   insecure = true
 
   insecure = true
''
+
>
 +
 
  
  
Línia 74: Línia 196:
 
3. Editar i/o añadir el fichero de configuración del servicio de Traefik (traefik.service). Se adjunta ejemplo:
 
3. Editar i/o añadir el fichero de configuración del servicio de Traefik (traefik.service). Se adjunta ejemplo:
  
''
+
 
 +
<
 
[Unit]
 
[Unit]
 +
Description=traefik proxy
  
Description=traefik proxy
 
 
After=network-online.target
 
After=network-online.target
 +
 
Wants=network-online.target systemd-networkd-wait-online.service
 
Wants=network-online.target systemd-networkd-wait-online.service
  
 
[Service]
 
[Service]
 
 
Restart=on-abnormal
 
Restart=on-abnormal
  
Línia 91: Línia 214:
 
//Always set "-root" to something safe in case it gets forgotten in the traefikfile.
 
//Always set "-root" to something safe in case it gets forgotten in the traefikfile.
 
ExecStart=/usr/local/bin/traefik --configfile=/etc/traefik/traefik.toml
 
ExecStart=/usr/local/bin/traefik --configfile=/etc/traefik/traefik.toml
 
 
//Limit the number of file descriptors; see `man systemd.exec` for more limit settings.
 
//Limit the number of file descriptors; see `man systemd.exec` for more limit settings.
 
LimitNOFILE=1048576
 
LimitNOFILE=1048576
  
 
//Use private /tmp and /var/tmp, which are discarded after traefik stops.
 
//Use private /tmp and /var/tmp, which are discarded after traefik stops.
 
 
PrivateTmp=true
 
PrivateTmp=true
  
 
//Use a minimal /dev (May bring additional security if switched to 'true', but it may not work on //Raspberry Pi's or other devices, so it has been disabled in this dist.)
 
//Use a minimal /dev (May bring additional security if switched to 'true', but it may not work on //Raspberry Pi's or other devices, so it has been disabled in this dist.)
 
 
PrivateDevices=false
 
PrivateDevices=false
  
 
//Hide /home, /root, and /run/user. Nobody will steal your SSH-keys.
 
//Hide /home, /root, and /run/user. Nobody will steal your SSH-keys.
 
 
ProtectHome=true
 
ProtectHome=true
  
 
//Make /usr, /boot, /etc and possibly some more folders read-only.
 
//Make /usr, /boot, /etc and possibly some more folders read-only.
 
 
ProtectSystem=full
 
ProtectSystem=full
  
 
//… except /etc/ssl/traefik, because we want Letsencrypt-certificates there.
 
//… except /etc/ssl/traefik, because we want Letsencrypt-certificates there.
 
//  This merely retains r/w access rights, it does not add any new. Must still be writable on the //host!
 
//  This merely retains r/w access rights, it does not add any new. Must still be writable on the //host!
 
 
ReadWriteDirectories=/etc/traefik/acme
 
ReadWriteDirectories=/etc/traefik/acme
  
Línia 119: Línia 236:
 
// They further restrict privileges that can be gained by traefik. Uncomment if you like.
 
// They further restrict privileges that can be gained by traefik. Uncomment if you like.
 
// Note that you may have to add capabilities required by any plugins in use.
 
// Note that you may have to add capabilities required by any plugins in use.
 
 
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
 
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
 
AmbientCapabilities=CAP_NET_BIND_SERVICE
 
AmbientCapabilities=CAP_NET_BIND_SERVICE
Línia 125: Línia 241:
  
 
[Install]
 
[Install]
 +
WantedBy=multi-user.target
 +
>
  
WantedBy=multi-user.target
 
  
''
+
<h2> Reverse Proxy con Docker </h2>
 +
 
 +
'''Para realizar un proxy inverso con Docker, se realiza de una manera distinta ya que se integra con el container a partir de una serie de etiquetas definidas'''
 +
 
 +
 
 +
Como se ha mostrado y explicado anteriormente, harian falta ficheros de configuración los cuales se modificarán segun las configuraciones del individuo que haga la instalación, pero en este caso se indican estos parametros en los "labels" del "fichero docker-compose.yml"
 +
 
 +
 
 +
 
 +
Una vez tenemos los ficheros, prepararemos el terminal para ejecutar los siguientes comandos:
 +
 
 +
 
 +
//Abrimos el fichero de condiguración de Docker
 +
 
 +
'''nano docker-compose.yml'''
 +
 
 +
A partir de aqui, generaremos el fichero que al levantarlo, nos generará un servicio con el whoami, tambien podriamos añadir Wordpress o cualquier otro servicio que nos apetezca.
 +
 
 +
<version: "3.3"
 +
 
 +
services:
 +
  traefik:
 +
    image: "traefik:v2.6"
 +
    command:
 +
      #- "--log.level=DEBUG"
 +
        //Permite acceso al dashboard de traefik
 +
      - "--api.insecure=true"
 +
        //Habilita la configuración de Docker
 +
      - "--providers.docker=true"
 +
        //No exponer sevicios de Docker por defecto
 +
      - "--providers.docker.exposedbydefault=false"
 +
        //Punto de entrada creado, llamado web
 +
      - "--entrypoints.web.address=:80"
 +
    ports:
 +
      - "80:80"
 +
      - "8080:8080"
 +
    volumes:
 +
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
 +
 
 +
  whoami:
 +
    image: "traefik/whoami"
 +
    labels:
 +
        //Decimos a traefik que queremos exponer el servicio
 +
      - "traefik.enable=true"
 +
        //Especificamos la regla usada para el acceso al servicio
 +
      - "traefik.http.routers.whoami.rule=Host(`localhost`)"
 +
        //Indicamos que punto de entrada se utilizará
 +
      - "traefik.http.routers.whoami.entrypoints=web">
 +
 
 +
//Y por ultimo levantamos el contenedor
 +
 
 +
'''docker-compose up'''
 +
 
 +
Así entonces, segun el servicio que levantemos aplicamos los labels correspondientes para redirigir el trafico y poder acceder via web, como en este caso.
 +
 
  
  
 +
[[Fitxer:whoami.png|900px|centre|]]
  
  
Línia 136: Línia 308:
 
'''Paginas de referencia:'''
 
'''Paginas de referencia:'''
  
'''Instalación de Traefik''':
+
'''Instalación de Traefik Vagrant''':
  
 
https://gist.github.com/ubergesundheit/7c9d875befc2d7bfd0bf43d8b3862d85#file-traefik-service-L3
 
https://gist.github.com/ubergesundheit/7c9d875befc2d7bfd0bf43d8b3862d85#file-traefik-service-L3
 
https://blog.emka.web.id/2022/09/how-to-install-traefik-in-debian.html
 
https://blog.emka.web.id/2022/09/how-to-install-traefik-in-debian.html
  
 +
 +
'''Instalación de Traefik Docker''':
 +
 +
https://geekland.eu/instalar-y-configurar-el-proxy-inverso-traefik-en-docker/
 +
https://geekland.eu/anadir-servicios-a-traefik-que-estan-corriendo-en-maquinas-remotas/
 +
https://accesto.com/blog/docker-reverse-proxy-using-traefik/
  
  
Línia 148: Línia 326:
 
https://doc.traefik.io/traefik/routing/overview/
 
https://doc.traefik.io/traefik/routing/overview/
 
https://doc.traefik.io/traefik/routing/entrypoints/
 
https://doc.traefik.io/traefik/routing/entrypoints/
 +
https://doc.traefik.io/traefik/providers/file/

Revisió de 15:40, 12 juny 2023

Projectes Ciberseguretat 2022-2023 - IETI Cloud

Reverse Proxy Web Interface con Vagrant


Dins el IETI Cloud tenim un frontend de proxy invers implementat amb HAProxy i Apache2. Volem una interfície web per gestionar-ho amb més facilitat i poder afegir nous dominis sense necessitat de tocar arxius de configuració directament.

El projecte pot contemplar parts molt diferenciades:


1. Fer una recerca i prova de diverses interfícies web per HAProxy (tipus Roxy-Wi) per veure si hi ha alguna que ens faciliti molt la feina, adaptant-se a les nostres necessitats, i que sigui segura.

2. Implementar una senzilla aplicació web de management de proxy invers (en qualsevol llenguatge de programació com PHP o Python) que carregui la configuració de HAProxy, ens la mostri, i ens permeti afegir dominis i subdominis a la nostra infraestructura.

3. Afegir funcionalitat de WAF (Web Application Firewall) com mod_security. Seria ideal implementar WAF Enteprise en el HAProxy. Cal analitzar casos d’ús (calen certificats HTTPS?)

4. Investigar la gestió de proxy invers amb softwares més avançats amb interfície web, i veure si ens serveix per als nostres propòsits: pfSense Traefik v2 Apache (no té mode TCP pel què no pot redirigir ) Nginx


Para realizar todos estos pasos anteriores, primero deberemos preparar el entorno. Para ello se utilizará un fichero Vagrantfile en el cual a partir de una serie de parametros determinados nos permitira virtualizar varias maquinas a la vez.

El fichero contendrá los parametros necesarios para generar 5 MV's de manera que habrán 3 servidores con apache instalado, 1 proxy inverso con Traefik, y 1 equipo cliente para realizar las comprobaciones.

  • Los ficheros de configuración del servicio Traefik solo se crearán, pero hará falta rellenarlos segun la configuración que se quiera realizar

Contenido del fichero Vagrantfile:


<

Vagrant.configure("2") do |config|

 (1..3).each do |i|
   config.vm.define "node-#{i}" do |node|
     node.vm.box = "ubuntu/focal64"
     node.vm.hostname = "srv#{i}.ieti.local"
     node.vm.box_url = "ubuntu/focal64"
     node.vm.network :private_network, ip: "192.168.2.1{i}"
     node.vm.synced_folder ".", "/home/vagrant", type: "virtualbox"
       node.vm.provider :virtualbox do |v|
         v.customize ["modifyvm", :id, "--memory", "1024"]
         v.customize ["modifyvm", :id, "--cableconnected1", "on"]
         v.customize ["modifyvm", :id, "--uart1", "0x3F8", "4"]
         v.customize ["modifyvm", :id, "--uartmode1", "file", File::NULL]
         v.gui = true      
       end
       config.vm.provision "shell", inline: <<-SHELL
        apt-get update
        apt-get install -y apache2
        sudo ufw allow 'Apache'
        sudo systemctl start apache2
        sudo echo "<html><hI>SRV#{i}</hI></html>" > /var/www/html/index.html 
        sudo systemctl restart apache2
       SHELL 
   end
 end
 #Maquina Proxy Inverso Traefik
 config.vm.define "prxy1" do |prxy1|
   prxy1.vm.box = "ubuntu/focal64"
   prxy1.vm.hostname = 'prxy1'
   prxy1.vm.box_url = "ubuntu/focal64"
   prxy1.vm.network :private_network, ip: "192.168.2.11"
   prxy1.vm.network :private_network, ip: "192.168.1.11"
   prxy1.vm.synced_folder ".", "/home/vagrant", type: "virtualbox"
   prxy1.vm.provider :virtualbox do |v|
     v.customize ["modifyvm", :id, "--memory", "1024"]
     v.customize ["modifyvm", :id, "--cableconnected1", "on"]
     v.customize ["modifyvm", :id, "--uart1", "0x3F8", "4"]
     v.customize ["modifyvm", :id, "--uartmode1", "file", File::NULL]
     v.gui = true
   end
   config.vm.provision "shell", inline: <<-SHELL
    apt-get update
    #Descargamos el source code de traefik, descomprimimos el archivo y damos permisos 
    #de ejecución
    sudo wget 
    https://github.com/traefik/traefik/releases/download/v2.8.7/traefik_v2.8.7_linux_amd64.tar.gz
    sudo tar -xzvf traefik_v2.8.7_linux_amd64.tar.gz
    sudo chmod +x traefik
    #Movemos el binario de traefik a la carpeta bin y le permitimos el "bind" de puertos
    sudo mv traefik /usr/local/bin/traefik
    sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/traefik
    #Creamos el grupo y usuario traefik (especificado en traefik.service)
    sudo groupadd -g 321 traefik
    sudo useradd  -g traefik --no-user-group  --home-dir /var/www --no-create-home --shell 
    /usr/sbin/nologin --system --uid 321 traefik  
    #Creamos la carpeta donde estara la configuración de traefik 
    #(adjuntare un archivo de muestra)
    #y otorgamos dueños y permisos de los archivos
    sudo mkdir /etc/traefik
    sudo mkdir /etc/traefik/acme
    sudo chown -R root:root /etc/traefik
    sudo chown -R traefik:traefik /etc/traefik/acme
    #En este paso, deberemos crear un archivo de configuración en caso de que no lo tengamos
    sudo touch /etc/traefik/trafik.toml
    sudo chown root:root /etc/traefik/traefik.toml
    sudo chmod 644 /etc/traefik/traefik.toml
    #Aqui moveremos el archivo de configuración DEL SERVICIO, en caso de no tenerlo deberemos 
    #crearlo y copiar el texto que haya en el archivo de ejemplo que he adjuntado
    sudo touch /etc/systemd/system/traefik.service
    sudo chown root:root /etc/systemd/system/traefik.service
    sudo chmod 644 /etc/systemd/system/traefik.service
    #Recargamos el servicio y lo iniciamos
    sudo systemctl daemon-reload
    sudo systemctl start traefik.service
    sudo systemctl enable traefik.service
    #Añadimos los nombres de los servidores a /etc/hosts
    sudo echo "192.168.2.10 srv1.ieti.local" >> /etc/hosts
    sudo echo "192.168.2.11" srv2.ieti.local >> /etc/hosts
    sudo echo "192.168.2.12" srv3.ieti.local >> /etc/hosts
   SHELL
 end
 #Maquina cliente
 config.vm.define "cli1" do |cli1|
   cli1.vm.box = "ubuntu/focal64"
   cli1.vm.hostname = 'cli1'
   cli1.vm.box_url = "ubuntu/focal64"
   cli1.vm.network :private_network, ip: "192.168.2.12"
   cli1.vm.synced_folder ".", "/home/vagrant", type: "virtualbox"
   cli1.vm.provider :virtualbox do |v|
     v.customize ["modifyvm", :id, "--memory", "3072"]
     v.customize ["modifyvm", :id, "--cableconnected1", "on"]
     v.customize ["modifyvm", :id, "--uart1", "0x3F8", "4"]
     v.customize ["modifyvm", :id, "--uartmode1", "file", File::NULL]
     v.gui = true
   end
   config.vm.provision "shell", inline: <<-SHELL
    sudo apt-get update
    sudo apt install ubuntu-gnome-desktop
   SHELL
 end

end

>



A continuación se muestra un diagrama sobre el funcionamiento del sistema desde la petición del cliente, que a traves de uno de los dominios disponibles accede al proxy inverso configurado con TraefikV2, el cual segun la carga de procesamiento que tengan los servidores lo redirigirá al servidor con menor carga de datos.

Blank diagram.png


A partir de las maquinas obtenidas a traves del Vagrantfile, hay unos aspectos a tener en cuenta de modificar para que haya un funcionamiento correcto.

1. Editar el fichero /etc/hosts en el Proxy y añadir la IP del servidor seguido de su dominio.

(Ej: 192.168.1.10 srv1.ieti.local)

2. Editar i/o añadir el fichero de configuración de Traefik (traefik.toml/traefik.yaml). Se adjunta un ejemplo:


Definimos el entryPoint (puerto por donde escuchará el proxy)

<

[entryPoints]

 [entryPoints.web]
   address = ":80"

//Tambien se pueden realizar las configuraciones en mas de un fichero, uno para indicar el entryPoint, y otro para indicar el servicio HTTP (Disponible en la documentación al final de la wiki)

[http]
     //Indicamos el host que debe redirigir
    [http.routers]
       [http.routers.my-router]
          rule = "Host('srv1.ieti.local')"
          service = "traefik"
          entryPoints = ["web"]
    [http.services]
      [http.services.traefik.loadBalancer]
        http.services.traefik.loadBalancer.servers
          url = "dom1.ieti.cat"
[serversTransport]
 insecureSkipVerify = true
//Indicamos el fichero de logs
[log]
 filePath = "/var/log/traefik.log"
 //Habilitamos el acceso al dashboard
 [api]
 dashboard = true
 insecure = true

>




3. Editar i/o añadir el fichero de configuración del servicio de Traefik (traefik.service). Se adjunta ejemplo:


< [Unit] Description=traefik proxy

After=network-online.target

Wants=network-online.target systemd-networkd-wait-online.service

[Service] Restart=on-abnormal

//User and group the process will run as. User=traefik Group=traefik

//Always set "-root" to something safe in case it gets forgotten in the traefikfile. ExecStart=/usr/local/bin/traefik --configfile=/etc/traefik/traefik.toml //Limit the number of file descriptors; see `man systemd.exec` for more limit settings. LimitNOFILE=1048576

//Use private /tmp and /var/tmp, which are discarded after traefik stops. PrivateTmp=true

//Use a minimal /dev (May bring additional security if switched to 'true', but it may not work on //Raspberry Pi's or other devices, so it has been disabled in this dist.) PrivateDevices=false

//Hide /home, /root, and /run/user. Nobody will steal your SSH-keys. ProtectHome=true

//Make /usr, /boot, /etc and possibly some more folders read-only. ProtectSystem=full

//… except /etc/ssl/traefik, because we want Letsencrypt-certificates there. // This merely retains r/w access rights, it does not add any new. Must still be writable on the //host! ReadWriteDirectories=/etc/traefik/acme

// The following additional security directives only work with systemd v229 or later. // They further restrict privileges that can be gained by traefik. Uncomment if you like. // Note that you may have to add capabilities required by any plugins in use. CapabilityBoundingSet=CAP_NET_BIND_SERVICE AmbientCapabilities=CAP_NET_BIND_SERVICE NoNewPrivileges=true

[Install] WantedBy=multi-user.target >


Reverse Proxy con Docker

Para realizar un proxy inverso con Docker, se realiza de una manera distinta ya que se integra con el container a partir de una serie de etiquetas definidas


Como se ha mostrado y explicado anteriormente, harian falta ficheros de configuración los cuales se modificarán segun las configuraciones del individuo que haga la instalación, pero en este caso se indican estos parametros en los "labels" del "fichero docker-compose.yml"


Una vez tenemos los ficheros, prepararemos el terminal para ejecutar los siguientes comandos:


//Abrimos el fichero de condiguración de Docker

nano docker-compose.yml

A partir de aqui, generaremos el fichero que al levantarlo, nos generará un servicio con el whoami, tambien podriamos añadir Wordpress o cualquier otro servicio que nos apetezca.

<version: "3.3"

services:

 traefik:
   image: "traefik:v2.6"
   command:
     #- "--log.level=DEBUG"
       //Permite acceso al dashboard de traefik
     - "--api.insecure=true"
       //Habilita la configuración de Docker
     - "--providers.docker=true"
       //No exponer sevicios de Docker por defecto
     - "--providers.docker.exposedbydefault=false"
       //Punto de entrada creado, llamado web
     - "--entrypoints.web.address=:80"
   ports:
     - "80:80"
     - "8080:8080"
   volumes:
     - "/var/run/docker.sock:/var/run/docker.sock:ro"
 whoami:
   image: "traefik/whoami"
   labels:
        //Decimos a traefik que queremos exponer el servicio
     - "traefik.enable=true"
        //Especificamos la regla usada para el acceso al servicio
     - "traefik.http.routers.whoami.rule=Host(`localhost`)"
        //Indicamos que punto de entrada se utilizará
     - "traefik.http.routers.whoami.entrypoints=web">

//Y por ultimo levantamos el contenedor

docker-compose up

Así entonces, segun el servicio que levantemos aplicamos los labels correspondientes para redirigir el trafico y poder acceder via web, como en este caso.


Whoami.png


Paginas de referencia:

Instalación de Traefik Vagrant:

https://gist.github.com/ubergesundheit/7c9d875befc2d7bfd0bf43d8b3862d85#file-traefik-service-L3 https://blog.emka.web.id/2022/09/how-to-install-traefik-in-debian.html


Instalación de Traefik Docker:

https://geekland.eu/instalar-y-configurar-el-proxy-inverso-traefik-en-docker/ https://geekland.eu/anadir-servicios-a-traefik-que-estan-corriendo-en-maquinas-remotas/ https://accesto.com/blog/docker-reverse-proxy-using-traefik/


Documentación Oficial:

https://doc.traefik.io/traefik/getting-started/configuration-overview/#the-static-configuration https://doc.traefik.io/traefik/routing/overview/ https://doc.traefik.io/traefik/routing/entrypoints/ https://doc.traefik.io/traefik/providers/file/