Notes

Déploiement d'applications

  • Base de donnée externe
  • Interactions avec d'autres services
  • services internes

  • Données persistantes

    • Configurations
    • Données de productions
    • Logs
  • Services éphémères

    • sur un Docker Host (VM)
  • Paquets à installer

  • Configuration du service
  • Fichiers de configuration spécifique
  • démarrage/redémarrage du service
  • Gestion des erreurs
  • Gestion des logs et alertes

Hints

{% hint style='danger' %} Important danger: this note needs to be highlighted {% endhint %}

{% hint style='info' %} Important info: this note needs to be highlighted {% endhint %}

{% hint style='tip' %} Important tip: this note needs to be highlighted {% endhint %}

{% hint style='working' %} Important working: this note needs to be highlighted {% endhint %}

Quiz


Here's a quiz about Gitbook

Good Bad
What is Gitbook? (x) ( )

Gitbook is good

What does Gitbook support? - [x] Table-based questions with radio buttons - [x] Table-based questions with checkboxes - [ ] Telepathy - [x] List-based questions with checkboxes - [x] List-based questions with radio buttons - [ ] Moon-on-a-stick

Gitbook supports table and list based quiz questions using either radio buttons or checkboxes.

Gitbook is not telepathic and does not give you the moon on a stick.


test

Scripts adresses IP

Essais

Scripts adresse IP

0_ip_add.sh

#! /bin/bash

#function defaut
# Option par défaut du programme sans paramètre.
# Fonction qui récupère l'adresse IP d'une interface et son masque $ligne.
# Ensuite, elle valorise $ip et $masque en tableau commprenant leurs octets.
# ${ip[0]}=octet_1, ${ip[1]}=octet_2, ${ip[2]}=octet_3, ${ip[3]}=octet_4
defaut ()
{
intf=p4p2
ligne=($(ifconfig $intf | grep "inet " | sed "s/ *inet //g"))
ip=($(echo ${ligne[0]} | sed "s/\./ /g"))
masque=($(echo ${ligne[2]} | sed "s/\./ /g"))
}

#function param
# Fonction qui récupère les paramètres $1 et $2 de la commande.
# Elle place les octets de l'adresse $ip et du $masque.
param ()
{
ip=($(echo $1 | sed "s/\./ /g"))
masque=($(echo $2 | sed "s/\./ /g"))
}

#function calcul_net
# Fonction qui réalise le ET binaire entre l'adresse
# et son masque (numéro de réseau).
calcul_net ()
{
i=0
while [ $i -lt 4 ]; do
    reseau[i]=$(( ${ip[i]} & ${masque[i]} ))
    #i=$i+1
    ((i++))
done
}

# function affichage_calcul
# Fonction qui affiche les résultats
affichage_calcul ()
{
echo -n "adresse : "
echo ${ip[@]} | sed "s/ /\./g"
echo -n "masque : "
echo ${masque[@]} | sed "s/ /\./g"
echo -n "réseau : "
echo ${reseau[@]} | sed "s/ /\./g"
}

# function gestion_param
# Fonction minimale de gestion des paramètres
gestion_param ()
{
    if [ -z $1 ]; then
       defaut
       calcul_net
       affichage_calcul
    else
       param $1 $2
       calcul_net
       affichage_calcul
    fi
}

# Point de départ du script
gestion_param $1 $2

# Suppléments :
# Aide
# Gestion des entrées $ip et $masque :
## Amélioration de la prise en compte des paramètres
## Choix de l'interface à prendre en compte
## Fonction qui gère l'intervalle des ${ip[i]} <0-255>
## Fonction qui valide le masque comme étant une suite homogène de bits à 1 et puis à 0
# Calculs supplémentaires :
## Support du masque CIDR
## Dernière adresse du bloc (broadcast)
## Plage d'adresses valides

Fonction ipCheck.sh

function ipCheck {

   check=$(echo "$1" | grep -E -o "((0|10|[1-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}(0|10|[1-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])")

   if [ -n "$check" ] ; then
        return 0
   else return 1
   fi

}

Fonction ipcalc.sh

function ipCalc {

if [[ $1 = 255* ]] ; then echo "Le 1 er argument est l'adresse ip et le 2 ème le masque"
elif (( $# == 2 )) && ipCheck $1 && ipCheck $2 ; then

local inet=($(echo $1|sed "s/\./ /g"))
local netmask=($(echo $2|sed "s/\./ /g"))
local tmpIpNetwork=()
local tmpMaximiseMask=()
local tmpBroadcast=()
local tmpNbBitHosts=""
local nbBitHosts=""
local tmpExponent=""
local tmpExponent=""

for (( i=0;i<4;i++ )) ; do
   if (( ${netmask[i]} == 0 )) ; then tmpNbBitHosts="00000000"
   elif (( ${netmask[i]} == 255 )) ; then tmpNbBitHosts="11111111"
   else tmpNbBitHosts=$(echo "obase=2;${netmask[i]}" | bc)
   fi
   nbBitHosts=$nbBitHosts$tmpNbBitHosts

   tmpIpNetwork[i]=$(( ${inet[i]} & ${netmask[i]} ))
   tmpMaximiseMask[i]=$(( ${netmask[i]} ^ 255 ))
   tmpBroadcast[i]=$(( ${tmpIpNetwork[i]} | ${tmpMaximiseMask[i]} ))
done

#tmpExponent="${nbBitHosts//[^0]}"
tmpExponent="$( echo $nbBitHosts | sed "s/[^0]//g" )"
exponent="${#tmpExponent}"


local ipNetwork=$(echo ${tmpIpNetwork[@]} | sed "s/ /\./g")
local ipBroadcast=$(echo ${tmpBroadcast[@]} | sed "s/ /\./g")

echo "L'adresse ip est : "$1
echo "Le masque de sous réseau est : "$2
echo "L'adresse du réseau : "$ipNetwork
echo "L'adresse de broadcast : "$ipBroadcast
echo "Le nombre de hôtes possible est de : " $(( 2**$exponent ))


else echo "Les 2 arguments ne sont pas des adresses ip valides"

fi

}

Limiter les ressources du noyau

Cpulimit

Cpulimit permet de limiter l'utilisation du ou des processeurs par un processus déjà lancé ou qui le sera. Il suffit de connaitre le nom ou le PID du processus à limiter, et de préciser le pourcentage d'utilisation maximal du processeur (à multiplier par le nombre de processeurs de l'ordinateur).

Exemple où xx est une valeur exprimée en pourcentage.

cpulimit --exe NomDuProcessusALimiter --limit xx
cpulimit --pid nnnn --limit xx

Pour les processeurs multi-core, il faut multiplier votre pourcentage par le nombre de cores. Ainsi, pour limiter à 20% l'utilisation d'un quadriprocesseur, mettez 20x4=80 après l'argument -l.

Cgroups

Partage de temps processeur en cas de concurrence.

Les Cgroups (control groups) sont un mécanisme de regroupement de tâches (processus) instancié par le noyau dont on peut définir des limites sur leur usage des ressources CPU, RAM, I/O, réseau.

cpu cgroup provides a mechanism to control cpu allocation to various processes. Each cpu cgroup contains a tuneable called cpu.shares. This tuneable allows user to limit the amount of CPU available to all processes within that cgroup.

apt-get install cgroup-bin

Sur le CPU on peut contrôller :

(a) CPU time for processes using cpu cgroup (b) CPU on which processes will run in case of multi-core system using cpuset cgroup

Briefly explain various cgroup related Linux tools (a) cgcreate – create cgroup (b) cgdelete – remove cgroup © cgclassify – Move a process to cgroup (d) cgexec – run the task in given control groups

Exercice Cgroups sur le CPU

La commande md5sum /dev/urandom charge à 100 % les CPU. Par défaut, tout autre processus dispose d'une valeur share de 1024. 1024.

Si on attribue un share de 1024, 50 % sont réservés au cgroup et ses processus.

cgcreate -g cpu:/A
cgset -r cpu.shares=1024 A
cgexec -g cpu:A md5sum /dev/urandom &
ps aux | grep md5sum | awk '{ print $2 "\t"  $3 }'
cgcreate -g cpu:/B
cgset -r cpu.shares=1024 B
cgexec -g cpu:B md5sum /dev/urandom &
ps aux | grep md5sum | awk '{ print $2 "\t"  $3 }'

Share relatif : R

Rapport A/B formule A*R(B-A)

20 % soit ⅕, soit 1*1024/(5-1) = 256

Sur une machine à 1 CPU (sur une machine 2 CPU, il faudra lancer deux processus de charge dans le cgroup)

cgcreate -g cpu:/cpu20
cgset -r cpu.shares=256 cpu20
cgexec -g cpu:cpu20 md5sum /dev/urandom &
md5sum /dev/urandom &
jobs
sleep 10
ps aux | grep md5sum | awk '{ print $2 "\t"  $3 }'
pkill md5sum

33 % : ⅓, soit 1*1024/(3-1) = 512

cgcreate -g cpu:/cpu33
cgset -r cpu.shares=512 cpu33
cgexec -g cpu:cpu33 md5sum /dev/urandom &
md5sum /dev/urandom &
jobs
sleep 5
ps aux | grep md5sum | awk '{ print $2 "\t"  $3 }'
pkill md5sum

66% : ⅔, soit 2*1024/(3-2) = 2048

cgcreate -g cpu:/cpu66
cgset -r cpu.shares=2048 cpu66
cgexec -g cpu:cpu66 md5sum /dev/urandom &
md5sum /dev/urandom &
jobs
sleep 5
ps aux | grep md5sum | awk '{ print $2 "\t"  $3 }'
pkill md5sum

80% : ⅘, soit 4*1024/(5-4) = 4096

cgcreate -g cpu:/cpu80
cgset -r cpu.shares=4096 cpu80
cgexec -g cpu:cpu80 md5sum /dev/urandom &
md5sum /dev/urandom &
jobs
sleep 5
ps aux | grep md5sum | awk '{ print $2 "\t"  $3 }'
pkill md5sum

90 % : 9/10, soit 9*1024/(10-9) = 9216

cgcreate -g cpu:/cpu90
cgset -r cpu.shares=9216 cpu90
cgexec -g cpu:cpu90 md5sum /dev/urandom &
md5sum /dev/urandom &
jobs
sleep 10
ps aux | grep md5sum | awk '{ print $2 "\t"  $3 }'
pkill md5sum

Liens

https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html-single/Resource_Management_Guide/index.html#chap-Using_Control_Groups

https://www.cloudsigma.com/manage-docker-resources-with-cgroups/

https://www.digitalocean.com/community/tutorials/how-to-limit-resources-using-cgroups-on-centos-6

https://sthbrx.github.io/blog/2016/07/27/get-off-my-lawn-separating-docker-workloads-using-cgroups/

http://blog.scoutapp.com/articles/2014/11/04/restricting-process-cpu-usage-using-nice-cpulimit-and-cgroups

https://www.devinhoward.ca/technology/2015/feb/implementing-cgroups-ubuntu-or-debian

https://oakbytes.wordpress.com/2012/09/02/cgroup-cpu-allocation-cpu-shares-examples/

Background

Sur le CPU on peut contrôller :

(a) CPU time for processes using cpu cgroup (b) CPU on which processes will run in case of multi-core system using cpuset cgroup

Briefly explain cpu cgroup?

cpu cgroup provides a mechanism to control cpu allocation to various processes. Each cpu cgroup contains a tuneable called cpu.shares. This tuneable allows user to limit the amount of CPU available to all processes within that cgroup.

Briefly explain various cgroup related Linux tools (a) cgcreate – create cgroup (b) cgdelete – remove cgroup © cgclassify – Move a process to cgroup (d) cgexec – run the task in given control groups

How to install cgroup tools?

sudo apt-get install cgroup-bin

3. Introduction pratique

# openssl version
OpenSSL 1.0.2h  3 May 2016
# openssl list-standard-commands
asn1parse
ca
ciphers
cms
crl
crl2pkcs7
dgst
dh
dhparam
dsa
dsaparam
ec
ecparam
enc
engine
errstr
gendh
gendsa
genpkey
genrsa
nseq
ocsp
passwd
pkcs12
pkcs7
pkcs8
pkey
pkeyparam
pkeyutl
prime
rand
req
rsa
rsautl
s_client
s_server
s_time
sess_id
smime
speed
spkac
srp
ts
verify
version
x509

Notes réseau

  • Topologie
  • Monter un réseau isolé lan
  • Monter une vm lan + wan (nat ou pont)
  • Configuration des interfaces
  • Configuration du routeur
  • Configuration du routage
  • Configuration du pare-feu
  • Services d'infrastructure
  • Router Advertisements
  • Service DHCP
  • Service DNS
  • Service DHCP/DNS dynamique
  • Service NTP
  • DHCPv6

## Documentation et notes pour mémoire services de passerelle

### Solution Routeur virtuel (libvirtd) interne sans DHCP

Editer un fichier lab.xml

<network>
  <name>lab</name>
  <forward mode='nat'>
    <nat>
      <port start='1024' end='65535'/>
    </nat>
  </forward>
  <bridge name='virbr1' stp='on' delay='0'/>
  <domain name='lab'/>
  <ip address='192.168.22.254' netmask='255.255.255.0'>
  </ip>
</network>

Créer et démarrer le switch

# virsh net-define lab.xml
Network lab defined from lab.xml

# virsh net-autostart lab
Network lab marked as autostarted

# virsh net-start lab
Network lab started

# virsh net-list
 Name                 State      Autostart     Persistent
----------------------------------------------------------
 default              active     yes           yes
 lab                  active     yes           yes

### Solution KVM avec un routeur Centos/Debian Firewalld

En considérant que le bridge virbr3 existe et est un réseau isolé.

Créationd'un réseau isolé

#!/bin/bash
# Create an isolated bridge

bridge="virbr3"
name=lan
path=/tmp
cat << EOF > $path/$name.xml
<network>
  <name>$name</name>
  <bridge name='$bridge' stp='on' delay='0'/>
</network>
EOF

virsh net-destroy $name
virsh net-create $path/$name.xml
#virsh net-autostart $name

Attacher une interface à un domaine KVM

#!/bin/bash

guest=$1
type=bridge
source=virbr3
virsh detach-interface $guest $type --live --persistent
virsh attach-interface $guest --type $type --source $source --live --persistent
#
#mac="00:16:3e:1b:f7:47"
#virsh attach-interface $guest --type $type --source $source --mac $mac --live
#
#
##Create an xml file with the definition of your network interface, similar to this example. For example, create a file called hot_net.xml:
#<interface type='bridge'>
#    <source bridge='virbr0'/>
#    <model type='virtio'/>
#</interface>
##Hot plug the interface to the guest with the virsh command. For example, run the following command:
#virsh attach-device guest hot_net.xml

Pare-feu Firewalld

Gist à adapter https://gist.github.com/goffinet/0d2604d09e333d1842b7323d4cb536d8

Todo : adaptation debian 8

#!/bin/bash
1_interfaces-ipv4 () {
hostnamectl set-hostname router
nmcli c mod eth0 ipv4.addresses 192.168.168.1/24
nmcli c mod eth0 ipv4.method manual
nmcli c mod eth0 connection.zone internal
nmcli c up  eth0
}
2_routing () {
sysctl -w net.ipv4.ip_forward=1
sysctl -p
}
3_firewall () {
systemctl enable firewalld
systemctl start firewalld
firewall-cmd --zone=internal --add-service=dns --permanent
firewall-cmd --zone=internal --add-service=dhcp --permanent
firewall-cmd --zone=internal --add-source=192.168.168.0/24 --permanent
firewall-cmd --zone=public --add-masquerade --permanent
firewall-cmd --reload
}
4_dhcp-dns () {
yum -y install dnsmasq*
echo "dhcp-range=192.168.168.50,192.168.168.150,255.255.255.0,12h" > /etc/dnsmasq.d/eth0.conf
echo "dhcp-option=3,192.168.168.1" >> /etc/dnsmasq.d/eth0.conf
systemctl enable dnsmasq
systemctl start dnsmasq
}

1_interfaces-ipv4
2_routing
3_firewall
4_dhcp-dns

### Solution KVM avec OpenWRT

#!/bin/bash
##Router Firewall with two interfaces
## WAN interface is default KVM bridge virbr0
##Create an isloted bridge named LAN on virbr3 with this xml file :
#<network>
#  <name>lan</name>
#  <bridge name='virbr3' stp='on' delay='0'/>
#</network>
##Enable the bridge :
#virsh net-create lan.xml
#virsh net-start lan
#virsh net-autostart lan
#
name=$1
url=https://downloads.openwrt.org/chaos_calmer/15.05/x86/kvm_guest/openwrt-15.05-x86-kvm_guest-combined-ext4.img.gz
destination=/var/lib/libvirt/images/
if [ $# -lt 1 ]; then
echo "Please provide the VM name" ; exit
else
wget $url$image -O $destination$name.img.gz
gunzip $destination$name.img.gz
virt-install --name=$name \
--ram=128 --vcpus=1 \
--os-type=linux \
--disk path=$destination$name.img,bus=ide \
--network bridge=virbr3,model=virtio \
--network bridge=virbr0,model=virtio \
--import  \
--noautoconsole
fi

### Solution Routeur Centos en VM avec iptables

#### Commutateur virtuel "WAN" ponté au réseau physique

  1. Création d'une interface type bridge (par exemple virbr2) sur l'hôte avec des paramètres IP correspondant à ce qui est attendu de l'interface physique native.
  2. L'interface physique eth0 ou autre physique est dénuée de ses paramètres IP et est liée à l'interface bridge
  3. Création d'un commutateur virtuel "WAN" (<forward mode='bridge'>) lié à l'interface virbr2.

1) cat /etc/sysconfig/network-scripts/ifcfg-virbr2

DEVICE="virbr2"
TYPE=BRIDGE
ONBOOT=yes
BOOTPROTO="dhcp"
DEFROUTE="yes"
PEERDNS="yes"
PEERROUTES="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_PEERDNS="yes"
IPV6_PEERROUTES="yes"
IPV6_FAILURE_FATAL="no"

2) cat /etc/sysconfig/network-scripts/ifcfg-p4p1

DEVICE="p4p1"
HWADDR="00:0A:F7:2B:A1:3E"
TYPE="Ethernet"
#BOOTPROTO="dhcp"
#DEFROUTE="yes"
#PEERDNS="yes"
#PEERROUTES="yes"
#IPV4_FAILURE_FATAL="no"
#IPV6INIT="yes"
#IPV6_AUTOCONF="yes"
#IPV6_DEFROUTE="yes"
#IPV6_PEERDNS="yes"
#IPV6_PEERROUTES="yes"
#IPV6_FAILURE_FATAL="no"
#NAME="p4p2"
ONBOOT="yes"
BRIDGE="virbr2"

3) Définition du commutateur virtuel WAN

<network>
  <name>WAN</name>
  <uuid>fc15da74-e864-426e-91e2-04d3444045e1</uuid>
  <forward mode='bridge'/>
  <bridge name='virbr2'/>
</network>

#### Commutateur virtuel "LAN"

<network>
  <name>LAN</name>
  <bridge name='virbr3' stp='on' delay='0'/>
</network>

#### Configuration de GW01

##### Interfaces

...
...

##### routage IP

echo "net.ipv4.ip_forward=1" > /etc/sysctl.conf

##### iptables

Désactivation de firewalld, activation de iptables-services

yum install -y iptables-services
systemctl mask firewalld
systemctl enable iptables
systemctl enable ip6tables
systemctl enable iptables
systemctl start ip6tables

Règles iptables

iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t filter -A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t filter -A FORWARD -i eth1 -o eth0 -j ACCEPT
iptables -t filter -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.22.0/24 -o eth0 -j MASQUERADE
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables-save > /etc/sysconfig/iptables

##### Proxy Squid

Voir Squid

  • Concept proxy
  • Liste des logiciels proxy open source

### Notes sur l’installation d'une passerelle OpenWrt en VirtualBox

Sous VirtualBox (Windows)

  1. Prendre la dernière version d’OpenWrt format x86 :
wget http://downloads.openwrt.org/barrier_breaker/14.07/x86/generic/openwrt-x86-generic-combined-ext4.img.gz
  1. Extraire l’image gzip :
gunzip openwrt-x86-generic-combined-ext4.img.gz
  1. Pour VirtualBox sous Windows, convertir l’image raw en image VDI:
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" convertfromraw --format VDI openwrt-x86-generic-combined-ext4.img openwrt-x86-generic-combined-ext4.vdi
  1. Ajouter une nouvelle VM Linux 2.6 avec l’image attachée
  2. NIC 1 : Host Only (LAN) 191.168.1.1/24 par défaut
  3. NIC 2 : Bridged (WAN)

  4. Démarrer la VM et configurer un mot de passe pour root

  5. En SSH configurer l’interface WAN :

uci set network.wan=interface
uci set network.wan.ifname=eth1
uci set network.wan.proto=dhcp
uci commit
ifup wan
  1. Installer l’interface graphique :
opkg update
opkg install luci-ssl
  1. Démarrer le service Web uniquement en HTTPS
vi /etc/config/uhttpd
# list listen_http '0.0.0.0:80'
# list listen_http '[::]:80'
/etc/init.d/uhttpd reload

Sous Libvirt/KVM :

wget https://downloads.openwrt.org/chaos_calmer/15.05/x86/kvm_guest/openwrt-15.05-x86-kvm_guest-combined-ext4.img.gz -O /var/lib/libvirt/images/
gunzip /var/lib/libvirt/images/openwrt-15.05-x86-kvm_guest-combined-ext4.img.gz
virt-install --name=openwrt \
--ram=256 --vcpus=1 \
--os-type=linux \
--disk path=/var/lib/libvirt/images/openwrt-15.05-x86-kvm_guest-combined-ext4.img,bus=ide \
--network bridge=virbr3,model=virtio \
--network bridge=virbr0,model=virtio \
--import

Commentaires