samedi 31 octobre 2020

Haproxy en mode http

 

Haproxy peut être utilisé en mode http, avec prise en charge des acl(s), ou en mode tcp (pass-through). Mon article ne présente que le mode http.

Maquette

  • Le reverse-proxy dispose de l'adresse 192.168.16.30 dans mon exemple. J'utilise une Debian 10.
  • Le serveur web qui héberge www.foo.net : 192.168.16.101 (il n'y a pas de load-balancing)
  • Le serveur web qui héberge www.bar.net : 192.168.16.102 (il n'y a pas de load-balancing)
  • Le décalage de 2 espaces est obligatoire (ce n'est pas pour faire joli)
  • Des règles NAT sur 80 et 443 dirigent le trafic WAN vers le reverse-proxy (iptables ou pfsense)

Configuration rapide, en http

  • Fichier /etc/haproxy/haproxy.cfg
global
  log /dev/log    local0
  log /dev/log    local1 notice
  chroot /var/lib/haproxy
  stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
  stats timeout 30s
  user haproxy
  group haproxy
  daemon

  # Default SSL material locations
  ca-base /etc/ssl/certs
  crt-base /etc/ssl/private

  # Default ciphers to use on SSL-enabled listening sockets.
  # For more information, see ciphers(1SSL). This list is from:
  #  https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
  # An alternative list with additional directives can be obtained from
  #  https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=haproxy
  ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
  ssl-default-bind-options no-sslv3

defaults
  log global
  mode http
  option httplog
  option dontlognull
    timeout connect 5000
    timeout client  50000
    timeout server  50000
  errorfile 400 /etc/haproxy/errors/400.http
  errorfile 403 /etc/haproxy/errors/403.http
  errorfile 408 /etc/haproxy/errors/408.http
  errorfile 500 /etc/haproxy/errors/500.http
  errorfile 502 /etc/haproxy/errors/502.http
  errorfile 503 /etc/haproxy/errors/503.http
  errorfile 504 /etc/haproxy/errors/504.http

frontend http
  mode http
  bind 192.168.16.30:80
  default_backend b1

backend b1
  server s101 192.168.16.101:80

Utilisation d'acl(s)

  • Dans la partie "frontend" il est possible de relier les backend(s) en fonction de règles acl(s) précises
  • Dans la partie "backend" il serait possible de gérer la haute disponibilité (je ne le fait pas dans mon article)
  • Les parties "global" et "defaults" restent identiques.
frontend http
  mode http
  bind 192.168.16.30:80
 
  acl foo hdr(host) -i www.foo.net
  use_backend b1 if foo

  acl bar hdr(host) -i www.bar.net
  use_backend b2 if bar

backend b1
  server s101 192.168.16.101:80

backend b2
  server s102 192.168.16.102:80

Https

  • Pour créer des certificats SSL auto-signés j'utilise le script suivant : lgmSsl
  • Il faut créer un nouveau dossier /etc/haproxy/ssl et déposer le(s) certificat(s) au format pem.
  • Haproxy retrouve automatiquement le certificat qui est lié à un site, le nom doit donc être correctement choisi. Dans notre cas : www.foo.net.pem
frontend http
  mode http
  bind 192.168.16.30:80

  acl foo hdr(host) -i www.foo.net
  use_backend b1 if foo

frontend https
  mode http
  bind 192.168.16.30:443 ssl crt /etc/haproxy/ssl/

  acl foo hdr(host) -i www.foo.net
  use_backend b1 if foo

backend b1
  server s101 192.168.16.101:80

Forward IP

  • Pour que le proxy transmette l'adresse IP de la machine qui est à l'origine d'une requête web, il faut paramétrer le revers-proxy et le serveur http 
  • Configuration sur Haproxy, on active "forwardfor" :
frontend http
  mode http
  bind 192.168.16.30:80
  option httplog
  option forwardfor except 127.0.0.1

  acl foo hdr(host) -i www.foo.net
  use_backend b1 if foo

backend b1
  server s101 192.168.16.101:80
  • Sur le serveur web avec apache 2.4,  créez un fichier /etc/apache2/conf-available/remoteip.conf :
RemoteIPHeader X-Forwarded-for
RemoteIPInternalProxy 192.168.16.30
  • Activez la nouvelle configuration : a2enmod remoteip , puis a2enconf remoteip
  • Dans /etc/apache2/apache2.conf, modifier la ligne LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined par :
LogFormat "%a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
  • Relancez apache2.

lundi 12 octobre 2020

LXC 3.0 sur Debian 10

Pourquoi revenir à LXC ? J'ai utilisé avec bonheur LXD 2.0 sur Ubuntu 16.04, mais depuis la version 4.0 il est obligatoire d'utiliser "snap" pour l'installation. J'ai alors eu de gros problèmes de compatibilité entre les conteneurs crées sur "apt" et leur mise en oeuvre avec  […]

Lire la suite

vendredi 15 mai 2020

LXD 4.0 sur Ubuntu 20.04

Installation avec la commande : apt install lxd En réalité, la commande apt execute un "snap". Il n'y a pas de version classique. Première initialisation Would you like to use LXD clustering : no Do you want to configure a new storage pool : yes Name of the new storage pool : default Name  […]

Lire la suite

lundi 11 mai 2020

Systemd (systemctl)

Systemd (commande "systemctl") est un système d'initialisation qui a été spécifiquement conçu comme alternative à SysVinit ( commandes "/etc/init.d" et "service"). Ce service est activé par défaut, à partir des distributions suivantes : Debian 8 Ubuntu 16.04 CentOs 7  […]

Lire la suite

vendredi 3 avril 2020

Première utilisation d'OpenNebula

Utilisation d'OpenNebula en tant que front-end pour un cloud privé. Les noeuds fonctionnent avec LXD. Nebula-1.webm  […]

Lire la suite

mardi 31 mars 2020

Installation d'une maquette OpenNebula

Objectif OpenNebula est une solution de cloud privé, complète et assez simple à mettre en oeuvre La maquette disposera de 4 machines virtuelles : Un routeur DebHub16 ou Pfsense, pour que chaque élève soit isolé Un front-end OpenNebula basé sur Debian 10 64 bits : mémoire 1 Go, disque de 20 Go, 1  […]

Lire la suite

samedi 28 mars 2020

Downgrade du réseau sur Ubuntu 16.04 et plus

Voici deux manipulations qui permettent de revenir à la configuration réseau de l'Ubuntu 14.04 Predictable Network Interface Device Names Vous ne voulez plus des interfaces réseau du style "eno1", "enp0s1" et revenir à "eth0" Dans le fichier /etc/default/grub, à la  […]

Lire la suite

dimanche 24 novembre 2019

La commande netstat

La commande Netstat permet de lister tous les ports ouverts sur une machine Options utiles -p  Affiche le nom du programme -t  Tous les ports TCP en mode "ETABLISHED" ou "WAIT" -u  Tous les ports UDP en mode "ETABLISHED" ou "WAIT" -a  Voir aussi les ports en  […]

Lire la suite

mardi 29 octobre 2019

Quick reference OpenSuse 15

Configuration réseau Configuration d'une carte réseau Les fichiers sont dans le dossier "/etc/sysconfig/network" Sur un serveur en mode CLI, le réseau doit être géré par "Wicked". En GUI, il doit être géré par "NetworManager". Il est possible de changer de mode avec  […]

Lire la suite

Quick reference CentOs 8

Configuration réseau Configuration d'une carte réseau Les fichiers sont dans le dossier "/etc/sysconfig/network-scripts" Il y a un fichier de configuration par carte réseau. Pour la carte "enp0s3" par exemple, il faut utiliser le fichier "ifcfg-enp0s3" Exemple d'adresse  […]

Lire la suite

dimanche 25 août 2019

Clé live-usb MX

La distribution MX linux 18.3 est basée sur Debian9 et permet de réaliser facilement un live-usb avec persistance des données Installation Il faut commencer par charger l'image ISO de MX linux 18.3, et installez celle-ci sur un live-cd. Une alternative est de partir directement d'une clé MX déja  […]

Lire la suite

mercredi 21 août 2019

Mise en oeuvre d'un serveur CentOs 7 ou 8 (64 bits)

Installation CentOs7 J'utilise le CD d'installation "CentOS-7-x86_64-NetInstall-1908.iso L'installateur fonctionne graphiquement, la souris est "presque" fonctionnelle. Dans certains cas il faut utiliser les touches "tab" "enter" et "echap" ! La carte  […]

Lire la suite

lundi 24 juin 2019

LXD 3.0 sur Ubuntu 18.04

Objectif Réaliser une installation de LXD, avec prise en charge de limites : Taille de la mémoire Taille du disque dur Nombre de processeurs Utilisation des profiles "default" (bridge lxdbr0) et "mac" (macvlan) Machine physique Ubuntu 18.04 64 bits est installé sur un disque  […]

Lire la suite

samedi 22 juin 2019

LXD sur un réseau local

Objectif L'utilisation de LXD derrière un bridge "lxdbr0" impose d'utiliser des règles de NAT. Une seule adresse réseau est visible (celle de l'hôte), et bien sur à cause du DNAT, chaque port ne peux être dirigé que vers un seul conteneur. J'ai donc cherché une autre solution, pour que  […]

Lire la suite

mardi 9 avril 2019

Remplacement d'Ansible et sshd sur Cygwin

Critique d'Ansible, après 1 an d'utilisation Ansible est un système qui fonctionne correctement dans le cadre de l'administration système. Les machines cibles sont généralement assez rapides pour que tout se passe sans timeout ! En ce qui concerne l'accès aux machines virtuelles des élèves, sur des  […]

Lire la suite

dimanche 7 octobre 2018

Mise en place d'une configuration de proxy automatique

Principe Le serveur DHCP distribue un nom de domaine par défaut. Le serveur DNS dispose d'un enregistrement "wpad" qui pointe vers un serveur web. Un fichier "wpad.dat" doit être situé à la racine. Les navigateurs sont configurés en "détection automatique des paramètres  […]

Lire la suite

mardi 7 août 2018

Utiliser Ansible avec un serveur Windows

Ansible communique avec Windows grace au protocole winrm, il n'est pas possible d'utiliser SSH. Winrm est apparu avec la version 3.0 de powershell. C'est la version qui est installé par défaut sur Windows 2012 et/ou Windows 8.0 Installation sur le serveur Ansible (Linux) apt-get install python-pip  […]

Lire la suite

vendredi 6 juillet 2018

Retour d'experience sur Ansible en production

Introduction Les scripts YAML d'Ansible peuvent avoir leur interêt, mais je trouve que l'utilisation de scripts Bash est préférable (c'est un avis personnel) : La vitesse Bash+Ansible est la même que Ansible+YAML En Bash je dispose des boucles et de tests Créer des scripts d'installation en Bash,  […]

Lire la suite

jeudi 21 juin 2018

Utilisation du système de gestion de configuration Ansible

Installation Le serveur ansible sera nommé (ans) et la machine à piloter (foo). Sur ans (Ubuntu 18.04) : apt-get install ansible Sur ans, création d'une paire de clés : ssh-keygen A créer dans /root/.ssh/ansible Pas de Passphrase Sur ans, dans /etc/ansible/ansible.cfg : remote_port = 22  […]

Lire la suite

mercredi 20 juin 2018

Backup d'un conteneur LXD

Pour réaliser le backup d'une machine LXD, je propose la méthode suivante : Arrêt du conteneur foo Déplacement dans le dossier /var/lib/lxd/containers/foo Archivage avec TAR. Les compressions gzip, bzip2 et xz fonctionnent Démarrage du conteneur foo Voici un script qui utilise cette méthode de  […]

Lire la suite

lundi 18 juin 2018

Optimisation d'un serveur LAMP

Php5 Dans /etc/php5/apache2/php.ini : Post_max_size = 64M Upload_max_filesize = 64M Apache2 Dans /etc/apache2/mods-enabled/mpm-prefork.conf : StartServers                         2 (à la place de 5) MinSpareServers                  2 (à la place de 5) MaxSpareServers                 5 (à la place de  […]

Lire la suite

lundi 28 mai 2018

Création d'une base de donnée Mysql

Eventuellement, pour vider une ancienne base : drop database foo; Puis : create database foo; create user 'fooUser'@'localhost' identified by 'unMotDePasse'; grant all on foo.* to 'fooUser'@'localhost'; flush privileges; Créer un pseudo-root pour MariaDb create user 'admin'@'localhost' identified  […]

Lire la suite

samedi 19 mai 2018

Eviter d'être considéré comme un spammeur

Si on utilise un serveur SMTP personnel, il arrive souvent que les mails envoyés soient considérés comme des spams. Voici quelques astuces pour éviter cela : Outil J'utilise un site qui permet de déterminer ce qui ne fonctionne pas. Ce site propose gratuitement d'effectuer 3 tests par jour :  […]

Lire la suite

Création de switchs virtuels sur Linux

Vde.png

Il est possible d'utiliser des switchs virtuels administrables sur Linux. Ces switchs peuvent ensuite être interfacés avec Virtualbox. Les switchs VDE permettent d'utiliser les VLANS Installation Sur Ubuntu : apt-get install vde2 Pour créer un switch et sa console d'administration : vde_switch -d -s  […]

Lire la suite

Nom des distributions Debian et Ubuntu LTS

Debian 6    Squeeze 7    Wheezy 8    Jessie 9    Stretch 10    Buster Ubuntu 8.04     Hardy 10.04   Lucid 12.04   Precise 14.04   Trusty 16.04   Xenial 18.04   Artful  […]

Lire la suite

Utiliser un raspberry comme serveur de virtualisation

Il est possible d'utiliser un Raspberry pi 2 ou 3 comme machine hôte pour plusieurs machines "virtuelles". Le processeur ARM ne dispose pas de la fonction VTx, il est impossible d'utiliser KVM. Par contre il est possible d'utiliser l'isolation LXC ou LXD. Si on garde la distribution  […]

Lire la suite

vendredi 18 mai 2018

LXD 2.0 sur Ubuntu 16.04 en mode bridge (lxdbr0)

Introduction LXD est une amélioration de LXC réalisé par Canonical. LXD est un cousin de Docker, les deux logiciels reposent sur LXC, l'utilisation est toutefois totalement différente. LXD est pré-installé sur les machines Ubuntu 16.04, 32 et 64 bits. Si vous voulez utiliser LXD, utilisez Ubuntu !  […]

Lire la suite

Finalisation de la configuration d'une machine Ubuntu 16.04 et plus

A la fin de l'installation d'un serveur ubuntu 16.04, 32 ou 64 bits il faut : Débrayer la mise à jour automatique qui a tendance à bloquer les commandes "apt-get update" et "apt-get upgrade" : Dans le fichier /usr/lib/apt/apt.systemd.daily, modifier la ligne AutoAptEnable=1, pour  […]

Lire la suite