Authentifier Apache vers IMAP

Authentifier Apache vers IMAP

Pour avoir une DB user unique, je suis parti sur ma source d’utilisateur et dans mon cas c’est postfixadmin pour les mails.
Du coup; je me suis amusé à écrire un petit bout perl qui permet à apache de s’auth vers un serveur IMAP.

  • Installer les dépendances
    apt-get install libnet-imap-simple-ssl-perl
    apt-get install libunix-syslog-perl
    apt-get install libapache2-mod-authnz-external
    
  • Protéger les pages Xymon avec l’auth IMAP
     cat /etc/apache2/conf-enabled/xymon.conf
    DefineExternalAuth dovecotpw pipe /etc/apache2/auth/dovecotpw.pl
    
    ScriptAlias /xymon-cgi "/usr/lib/xymon/cgi-bin"
    Directory "/usr/lib/xymon/cgi-bin"
        AllowOverride None
        Options ExecCGI Includes
    
        
    
            AuthType Basic
            AuthName "Xymon Administration"
            Require valid-user
            AuthBasicProvider external
            AuthExternal dovecotpw
    
        
    
  • Ensuite le code perl
     cat /etc/apache2/auth/dovecotpw.pl
    
    #!/usr/bin/perl
    use strict;
    use warnings;
    use Unix::Syslog qw(:macros :subs);
    use Net::IMAP::Simple::SSL;
    
    my $VERSION = '1.0';
    
    my $server = 'imap.distran.org';
    my $port = 993;
    my $use_ssl = 1;
    
    syslog LOG_INFO,"imap-auth: waiting for packet";
    chomp(my $user = );
    chomp(my $password = );
    my $result;
    #print "checking [$user] and [$password]\n";
    syslog(LOG_INFO,"imap-auth: request ('auth', \"$user\", '****')");
    
    # successful authentication
    if (is_valid($user, $password)){
          	$result = 0;
           	syslog(LOG_INFO,"imap-auth: -> +OK");
    } else {
             $result = 1;
    }
    
    closelog;
    exit $result;
    
    sub is_valid
    {
    	my ($user, $password) = @_;
    	my $is_valid = 0;
    
    	# Create the object
    	my $imap = Net::IMAP::Simple->new($server,
    		(
    			port => $port,
    			use_ssl => $use_ssl
    		) ) ||
    
    	die "Unable to connect to IMAP: $Net::IMAP::Simple::errstr\n";
    
    	$imap->starttls;
         	if ( $imap->login("$user", $password) ) {
    		$is_valid = 1;
           	         syslog(LOG_INFO,"imap-auth: -> +OK imap server says you're cool. Welcome.");
    	} else {
           	         syslog(LOG_INFO,"imap-auth: -> -ERR imap server has a problem with you: $! $_ $/ " . $imap->errstr);
    	}
    
    	$imap->quit;
    
    	return ($is_valid);
    }
    
    
  • Check des logs
     tail /var/log/syslog
    
    Nov 24 13:01:05 xymon-server01 perl: imap-auth: waiting for packet
    Nov 24 13:01:05 xymon-server01 perl: imap-auth: request ('auth', "user@domain.com", '****')
    Nov 24 13:01:05 xymon-server01 perl: imap-auth: -> +OK imap server says you're cool. Welcome.
    Nov 24 13:01:05 xymon-server01 perl: imap-auth: -> +OK
    
    
  • Si le serveur IMAP est local sur la meme machine
     cat /etc/apache2/auth/dovecotpw.sh
    #!/bin/bash
    read DCUSER
    read DCPASS
    /usr/bin/doveadm auth ${DCUSER} ${DCPASS}
    exit $?
    
  • Réseau virtuel de VM unifié entre plusieurs serveurs physiques KVM connectés par Internet avec openvpn et 802.1q

    Ayant 2 serveurs SOYOUSTART (OVH), et n’ayant pas de patte LAN pour les faire communiquer ensemble, j’ai du recourir à openvpn pour faire dialoguer les VM du serveur A avec les VM du serveur B.

     

    • conf server
     cat /etc/openvpn/server.conf
    local IP_PUB_SERVER
    port PORT_SERVER
    proto tcp
    dev tap0
    ca ca.crt
    cert server.crt
    key server.key
    dh dh4096.pem
    server-bridge 192.168.11.1 255.255.255.0 192.168.11.100 192.168.11.200
    client-to-client
    duplicate-cn
    keepalive 10 120
    tls-auth /etc/openvpn/ta.key 0 # This file is secret
    comp-lzo
    max-clients 4
    user nobody
    group nogroup
    persist-key
    persist-tun
    status openvpn-status.log
    log-append openvpn.log
    verb 3
    mode server
    tls-server
    script-security 2
    up "/etc/openvpn/up.sh"
    down "/etc/openvpn/down.sh"
    
    
    • conf client

     

     cat /etc/openvpn/client.conf
    client
    dev tap1
    proto tcp
    remote IP_SERVER PORT_SERVER
    resolv-retry infinite
    nobind
    persist-key
    persist-tun
    ca ca.crt
    cert clientPrincipal.crt
    key clientPrincipal.key
    ns-cert-type server
    tls-auth ta.key 1
    comp-lzo
    verb 3
    log-append openvpnclient.log
    script-security 2
    up "/etc/openvpn/upclient.sh"
    down "/etc/openvpn/downclient.sh"
    keepalive 30 120
    float
    status openvpn-status.log
    
    
    • Démarrer le serveur et le client VPN:

     

     
    server A # systemctl start openvpn@server
    server B # systemctl start openvpn@client
    
    • Créer l’interface br1_lan_hyp
      cat /etc/sysconfig/network-scripts/ifcfg-br1_lan_hyp
    DEVICE=br1_lan_hyp
    TYPE=Bridge
    IPADDR=192.168.11.1
    NETMASK=255.255.255.0
    ONBOOT=yes
    BOOTPROTO=static
    NM_CONTROLLED=no
    
    • Créer le bridge
     /sbin/brctl addbr br1_lan_hyp
    
    ifconfig br1_lan_hyp 192.168.11.1 netmask 255.255.255.0
    
    

    Ajouter l’interface VPN tap0 dans le bridge

     /sbin/ifconfig br1_lan_hyp promisc
    /sbin/ifconfig tap0 up promisc
    /sbin/brctl addif br1_lan_hyp tap0
    
    
    • Faire la meme chose sur le 2eme serveur en prenant 11.2

     

    • Ajouter le module 802.1q en créant le fichier suivant:
     cat /etc/modules-load.d/8021q.conf
    8021q
    
    
    • Ajouter des vlan

    dans cet exemple; j’ajoute VLAN10 avec l’ip 10.1 et VLAN20 avec l’ip 20.1

     vconfig add tap1 10
    vconfig add tap1 20 brctl addbr br10 brctl addbr br20 brctl addif br10 tap1.10 brctl addif br20 tap1.20 ifconfig tap1.10 promisc ifconfig tap1.20 promisc ifconfig tap1.10 up ifconfig tap1.20 up ifconfig br10 192.168.10.1 ifconfig br20 192.168.20.1
    • Effectuer la meme manipulation sur le node2.

     

    • Automatiser la mise en bridge de tout ca dans up.sh et upclient.sh

    pour le Premier serveur:

      cat /etc/openvpn/up.sh
    #!/bin/bash
    
    # CONF LAN NORMAL (GLUSTERFS)
    /sbin/ifconfig br1_lan_hyp promisc
    /sbin/ifconfig tap0 up promisc
    /sbin/brctl addif br1_lan_hyp tap0
    
    # CONF VLAN (VM)
    vconfig add tap0 10
    vconfig add tap0 20
    brctl addbr br10
    brctl addbr br20
    brctl addif br10 tap0.10
    brctl addif br20 tap0.20
    ifconfig tap0.10 promisc
    ifconfig tap0.20 promisc
    ifconfig tap0.10 up
    ifconfig tap0.20 up
    ifconfig br10 192.168.10.1
    ifconfig br20 192.168.20.1
    
    exit 0
    
    

     

    • Pour le 2eme serveur:

     

     cat upclient.sh
    #!/bin/bash
    /sbin/ifconfig br1_lan_hyp promisc
    /sbin/ifconfig tap1 up promisc
    /sbin/brctl addif br1_lan_hyp tap1
    /sbin/ifconfig tap1 0
    
    sleep 4
    
    vconfig add tap1 10
    vconfig add tap1 20
    brctl addbr br10
    brctl addbr br20
    brctl addif br10 tap1.10
    brctl addif br20 tap1.20
    ifconfig tap1.10 promisc
    ifconfig tap1.20 promisc
    ifconfig tap1.10 up
    ifconfig tap1.20 up
    ifconfig br10 192.168.10.2
    ifconfig br20 192.168.20.2
    
    exit 0
    
    

     

    • Dans la conf des VM, ajouter br10 ou br20 pour le bridge
    • Vérifier que les bridges contiennent bien les interfaces tap.X et vnetX:
     brctl show br10
    bridge name bridge id STP enabled interfaces
    br10 8000.9e56d684d75c no 
    tap0.10
    vnet2
    vnet3
    vnet5
    vnet7
    vnet8
    vnet9
    

     

    • Pour finir; une VM PFSENSE (FreeBSD) qui effectue le routage, FW, NAT pour les VMs.

    PFSENSE a une patte sur chaque réseau :

     

    • br0 pour le WAN
    • br1 pour le LAN hyperviseur
    • br10 pour  VLAN10; LAN étanche pour VMs
    • br20 pour VLAN20, LAN étanche pour VMS

    Et ca tourne nikel.

     

    GlusterFS et SplitBrain

    SPLIT BRAIN sur un volume GlusterFS

     

    Hier, tout fonctionnait et la je me rends compte d’un split brain suite au reboot des nodes pour de la maintenance:

    root@devnix-virt-master02 nets]# gluster volume heal ovirt info split-brain
    Brick devnix-virt-master01:/gluster/ovirt/
    /d44ee4b0-8d36-467a-9610-c682a618b698/dom_md/ids
    Number of entries in split-brain: 1
    
    Brick devnix-virt-master02:/gluster/ovirt/
    /d44ee4b0-8d36-467a-9610-c682a618b698/dom_md/ids
    Number of entries in split-brain: 1
    

    Les commandes magiques

    • Dire a Gluster d’utiliser le fichier le plus gros

    gluster volume heal ovirt split-brain bigger-file /gluster/ovirt/d44ee4b0-8d36-467a-9610-c682a618b698/dom_md/ids

    – Dans mon cas; les 2 fichiers étaient de taille identiques, j’ai choisi le plus récent (en faisant un ls -l dessus sur chaque node)

    gluster volume heal ovirt split-brain source-brick ovirt02:/gluster/ovirt /d44ee4b0-8d36-467a-9610-c682a618b698/dom_md/ids

     

    Et relancer un heal:

     

    gluster volume heal ovirt info
    gluster volume heal ovirt info split-brain

     

     

    GlusterFS Volume pour oVirt

    GLUSTERFS VOLUME pour oVirt

    • Installation des packages
    yum install glusterfs-server
    
    • Démarrer le service
    # service glusterd start
    Redirecting to /bin/systemctl start glusterd.service
    
    • Check des nodes associés
    oot@tripax-seed gluster]# gluster pool list
    UUID Hostname State
    1cf105ab-ff82-4fb3-99a2-a7caffd2ef8e localhost Connected
    

    – Associationd d’un node:

    [root@tripax-seed glusterfs]# gluster peer probe gluster1
    peer probe: success.
    

    – Vérification de l’association

    [root@tripax-seed glusterfs]# gluster pool list
    UUID Hostname State
    37de18a4-05a4-4450-9c1e-0f52683f5d0b gluster1 Connected
    428629d6-7632-4b2e-b34a-6cd24679e6df localhost Connected
    

    – Création d’un volume répliqué sur 2 nodes

    [root@devnix-virt-master01 glusterfs]# gluster volume create ovirt replica 2 gluster1:/gluster/ovirt ns379759.ip-5-196-70.eu:/gluster/ovirt force
    volume create: ovirt: success: please start the volume to access data
    

    – Activation du volume

    [root@devnix-virt-master01 glusterfs]# gluster volume start ovirt
    volume start: ovirt: success
    

    – Désactivation du nfs qui génère beaucoup de log inutile

    [root@devnix-virt-master01 ovirt]# gluster volume set ovirt nfs.disable true
    volume set: success
    

    – Mise en place des autorisations par IP pour éviter de laisser tout le monde en accès

    [root@devnix-virt-master01 ovirt]# gluster volume set ovirt auth.allow 5.196.70.56,94.23.2.63,127.0.0.1
    volume set: success
    

    – Réduction du timeout à 10 sec pour le controle d’un node down

    [root@devnix-virt-master01 ovirt]# gluster volume set ovirt network.ping-timeout 10
    volume set: success
    
    • Configuration propre à oVirt
    
    [root@devnix-virt-master01 ~]# gluster volume set ovirt storage.owner-uid 36
    volume set: success
    [root@devnix-virt-master01 ~]# gluster volume set ovirt storage.owner-gid 36
    volume set: success
    
    [root@devnix-virt-master01 ~]# gluster volume set ovirt server.allow-insecure on
    volume set: success
    
    
    • Test en local
    
    mount -t glusterfs localhost:/ovirt /mnt
    
    

     

     

     

    MLVPN – Aggregation de liens (ADSL, 3G, 4G, etc)

    MLVPN

    Pour un besoin, il fallait agréger plusieurs liens ensemble pour avoir un plus gros tuyau.

    Voici une manière avec MLVPN.

    Il faut 2 parties, pour faire fonctionner cette aggrégation.

    Dans cet article on utilisera 1 client (RASPBERRY) et 1 serveur (Centos7).

    Sur le raspberry, nous avons:

    • eth0 : LAN : 192.168.0.179
    • wlan0 : Clef 3g  : 192.168.8.100
    • wlan1 : Clef 3g : 192.168.1.102

    A la fin, nous aurons une nouvelle interface mlvpn0 dans laquelle le traffic sera envoyer entre les 2 liens. c’est une répartition des paquets et non des connexions.

    Cela veut dire qu’une seule connexion (ex: un upload d’un gros fichier) sera répartie sur les 2 liens.

    Partie SERVER – CENTOS 7

    Je n’avais qu’une Kimsufi avec Centos7 dispo pour cette POC, d’ou l’absence de Freebsd mais le concept reste le même.

    Avant tout, installer les dépendances:

    
    yum install libsodium-devel.x86_64 -y
    
    yum install libev-devel.x86_64 -y
    
    

     

    Puis récupérer le code source MLVPN et le compiler

    
    git clone https://github.com/zehome/MLVPN.git
    
    cd MLVPN/
    
    ./autogen.sh
    
    ./configure
    
    make
    
    make install
    
    mkdir /etc/mlvpn
    
    useradd -s /bin/true mlvpn
    
    

     

    Créer le fichier de configuration et le script de status

    
    vi /etc/mlvpn/mlvpn0.conf
    
    [general]
    statuscommand = "/etc/mlvpn/mlvpn0_updown.sh"
    tuntap = "tun"
    loglevel = 2
    mode = "server"
    interface_name = "mlvpn0"
    timeout = 30
    password = "xxxxxx"
    cleartext_data = 1
    
    [wlan0]
    bindport = 5080
    bindhost = "0.0.0.0"
    
    [wlan1]
    bindport = 5081
    bindhost = "0.0.0.0"
    
     
    
    vi /etc/mlvpn/mlvpn0_updown.sh
    
    #!/bin/bash
    
    error=0; trap "error=$((error|1))" ERR
    tuntap_intf="$1"
    newstatus="$2"
    rtun="$3"
    [ -z "$newstatus" ] && exit 1
    (
    if [ "$newstatus" = "tuntap_up" ]; then
     echo "$tuntap_intf setup"
     /sbin/ifconfig $tuntap_intf 10.42.42.1 netmask 255.255.255.252 mtu 1400 up
     # NAT thru our server (eth0 is our output interface on the server)
     # mlvpn0 link
     /sbin/iptables -t nat -A POSTROUTING -o eth0 -s 10.42.42.0/30 -j MASQUERADE
     # LAN 192.168.0.0/24 from "client"
     /sbin/route add -net 192.168.0.0/24 gw 10.42.42.2
     /sbin/iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.0/24 -j MASQUERADE
    elif [ "$newstatus" = "tuntap_down" ]; then
     /sbin/route del -net 192.168.0.0/24 gw 10.42.42.2
     /sbin/iptables -t nat -D POSTROUTING -o eth0 -s 10.42.42.0/30 -j MASQUERADE
     /sbin/iptables -t nat -D POSTROUTING -o eth0 -s 192.168.0.0/24 -j MASQUERADE
    fi
    ) >> /var/log/mlvpn_commands.log 2>&1
    exit $errors
    
     
    
    chmod 700 /etc/mlvpn/mlvpn0_updown.sh; chown mlvpn:root /etc/mlvpn/mlvpn0_updown.sh
    
    

     

    Il faut aussi modifier le FW pour autoriser le forward du traffic et le traffic entant sur les 2 ports configurés précédemment:

    
    iptables -A POSTROUTING -s 10.42.42.0/30 -o eth0 -j MASQUERADE
    
    iptables -A INPUT -s IP_RASPBERRY/32 -i eth0 -p udp -m udp --dport 5081 -j ACCEPT
    iptables -A INPUT -s IP_RASPBERRY/32 -i eth0 -p udp -m udp --dport 5080 -j ACCEPT
    
    iptables-save > /etc/sysconfig/iptables
    
    

    Démarrer mlvpn

     

    
    mlvpn -v  --user mlvpn -c /etc/mlvpn/mlvpn0.conf
    
    

    On check les ports sont bien en écoute:

    
    # netstat -nupl |grep ml
    udp 0 0 0.0.0.0:5080 0.0.0.0:* 29260/mlvpn: mlvpn@
    udp 0 0 0.0.0.0:5081 0.0.0.0:* 29260/mlvpn: mlvpn@
    
    

    A ce stade, l’interface mlvpn0 est UP:

    
    # ifconfig mlvpn0
    mlvpn0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1400
     inet 10.42.42.1 netmask 255.255.255.252 destination 10.42.42.1
     unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 500 (UNSPEC)
     RX packets 975 bytes 62792 (61.3 KiB)
     RX errors 0 dropped 0 overruns 0 frame 0
     TX packets 999 bytes 1342862 (1.2 MiB)
     TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
    
    

    Reste à voir la partie client.

     

    PARTIE CLIENT   – RASPBERRY

    Il faut installer les dépendances sur le raspberry:

    sudo apt-get install build-essential make autoconf libev-dev git
    

    La lib sodium n’étant pas disponible dans les packages debian, il faut la compiler:

    wget --no-check-certificate https://download.libsodium.org/libsodium/releases/libsodium-1.0.3.tar.gz
    tar -zxvf libsodium-1.0.3.tar.gz
    cd libsodium-1.0.3/
    ./configure
    make
    make check
    sudo make install
    ldconfig
    

    Puis compiler mlvpn comme précédemment :

    git clone https://github.com/zehome/MLVPN.git
    cd MLVPN
    ./autogen.sh
    ./configure
    make
    make install
    mkdir /etc/mlvpn
    useradd -s /bin/true mlvpn
    

    La configuration réseau du raspberry est:

    iface eth0 inet dhcp
    
    auto wlan0
    iface wlan0 inet static
    address 192.168.8.100
    netmask 255.255.255.0
    wpa-ssid "xxxxx"
    wpa-psk "xxxxxx"
    
    auto wlan1
    iface wlan1 inet static
    address 192.168.1.102
    netmask 255.255.255.0
    wpa-ssid "xxxxx"
    wpa-psk "xxxxxx"
    

    On obtient cet ifconfig:

    wlan0 Link encap:Ethernet HWaddr 80:1f:02:af:24:34
     inet adr:192.168.8.100 Bcast:192.168.8.255 Masque:255.255.255.0
     UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
     RX packets:3859 errors:0 dropped:2 overruns:0 frame:0
     TX packets:3409 errors:0 dropped:1 overruns:0 carrier:0
     collisions:0 lg file transmission:1000
     RX bytes:1306343 (1.2 MiB) TX bytes:403217 (393.7 KiB)
    
    wlan1 Link encap:Ethernet HWaddr a0:f3:c1:2e:2b:9c
     inet adr:192.168.1.102 Bcast:192.168.1.255 Masque:255.255.255.0
     UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
     RX packets:6515 errors:0 dropped:33 overruns:0 frame:0
     TX packets:3462 errors:0 dropped:0 overruns:0 carrier:0
     collisions:0 lg file transmission:1000
     RX bytes:2092309 (1.9 MiB) TX bytes:412679 (403.0 KiB)
    

    Il faut modifier la table de routage pour forcer le traffic en provenance des réseaux wifi (192.168.8.0/24 et 192.168.1.0/24) à passer par leurs interfaces respectives wlan0 et wlan1.

    vi /etc/iproute2/rt_tables
    
    Ajouter á la fin:
    
    101 wlan0
    102 wlan1
    

    Ensuite il faut ajouter les tables de routage suivante:

    ip route add 192.168.8.0/24 dev wlan0 scope link table wlan0
    ip route add default via 192.168.8.1 dev wlan0 table wlan0
    
    ip route add 192.168.1.0/24 dev wlan1 scope link table wlan1
    ip route add default via 192.168.1.1 dev wlan1 table wlan1
    
    ip rule add from 192.168.1.0/24 table wlan1
    ip rule add from 192.168.8.0/24 table wlan0
    

    On vérifie:

    root@raspberrypi:~# ip rule show
    0: from all lookup local
    32764: from 192.168.8.0/24 lookup wlan0
    32765: from 192.168.1.0/24 lookup wlan1
    32766: from all lookup main
    32767: from all lookup default
    
    root@raspberrypi:~# ip route show
    default via 192.168.0.254 dev eth0
    188.165.12.106 via 10.42.42.2 dev mlvpn0 scope link
    192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.179
    192.168.1.0/24 dev wlan1 proto kernel scope link src 192.168.1.102
    192.168.8.0/24 dev wlan0 proto kernel scope link src 192.168.8.100
    

    On peut tester un ping en forçant la provenance depuis l’ip des clefs 3g:

    root@raspberrypi:~# ping www.google.fr -I192.168.8.100
    PING www.google.fr (216.58.211.67) from 192.168.8.100 : 56(84) bytes of data.
    64 bytes from par03s14-in-f3.1e100.net (216.58.211.67): icmp_req=1 ttl=51 time=116 ms
    64 bytes from par03s14-in-f3.1e100.net (216.58.211.67): icmp_req=2 ttl=51 time=139 ms
    ^C
    --- www.google.fr ping statistics ---
    2 packets transmitted, 2 received, 0% packet loss, time 1001ms
    
    root@raspberrypi:~# ping www.google.fr -I192.168.1.102
    PING www.google.fr (216.58.211.67) from 192.168.1.102 : 56(84) bytes of data.
    64 bytes from par03s14-in-f3.1e100.net (216.58.211.67): icmp_req=1 ttl=55 time=28.6 ms
    64 bytes from par03s14-in-f3.1e100.net (216.58.211.67): icmp_req=2 ttl=55 time=218 ms
    64 bytes from par03s14-in-f3.1e100.net (216.58.211.67): icmp_req=3 ttl=55 time=140 ms
    ^C
    --- www.google.fr ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 2001ms
    

    Ca ping bien, on peut continuer.

    On créé la config mlvpn:

    Ne pas oublier de remplacer IP_SERVER par l’IP de votre serveur.

    vi /etc/mlvpn/mlvpn0.conf
    
    [general]
    statuscommand = "/etc/mlvpn/mlvpn0_updown.sh"
    tuntap = "tun"
    loglevel = 4
    mode = "client"
    protocol = "udp"
    interface_name = "mlvpn0"
    timeout = 30
    password = "xxxxx"
    cleartext_data = 1
    
    [wlan0]
    bindhost = "192.168.8.100"
    remotehost = "IP_SERVER"
    remoteport = 5080
    
    [wlan1]
    bindhost = "192.168.1.102"
    remotehost = "IP_SERVER"
    remoteport = 5081
    

    Maintenant on démarre mlvpn:

    mlvpn   --user mlvpn -c /etc/mlvpn/mlvpn0.conf
    

    Dans les logs /var/log/syslog:

    Aug 21 09:38:07 raspberrypi ifplugd(mlvpn0)[3123]: ifplugd 0.28 initializing.
    Aug 21 09:38:07 raspberrypi ifplugd(mlvpn0)[3123]: Using interface mlvpn0/00:00:00:00:00:00 with driver <tun> (version: 1.6)
    Aug 21 09:38:07 raspberrypi ifplugd(mlvpn0)[3123]: Using detection mode: SIOCETHTOOL
    Aug 21 09:38:07 raspberrypi ifplugd(mlvpn0)[3123]: Initialization complete, link beat detected.
    Aug 21 09:38:07 raspberrypi ifplugd(mlvpn0)[3123]: Executing '/etc/ifplugd/ifplugd.action mlvpn0 up'.
    Aug 21 09:38:07 raspberrypi ifplugd(mlvpn0)[3123]: client: Ignoring unknown interface mlvpn0=mlvpn0.
    Aug 21 09:38:07 raspberrypi ifplugd(mlvpn0)[3123]: Program executed successfully.
    

    Le tunnel doit être up:

    root@raspberrypi:~# ifconfig mlvpn0
    mlvpn0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
     inet adr:10.42.42.2 P-t-P:10.42.42.2 Masque:255.255.255.252
     UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1400 Metric:1
     RX packets:999 errors:0 dropped:0 overruns:0 frame:0
     TX packets:976 errors:0 dropped:0 overruns:0 carrier:0
     collisions:0 lg file transmission:500
     RX bytes:1342862 (1.2 MiB) TX bytes:62844 (61.3 KiB)
    

    On ping l’autre bout du tunnel:

    root@raspberrypi:~# ping 10.42.42.1
    PING 10.42.42.1 (10.42.42.1) 56(84) bytes of data.
    64 bytes from 10.42.42.1: icmp_req=1 ttl=64 time=288 ms
    64 bytes from 10.42.42.1: icmp_req=2 ttl=64 time=193 ms
    64 bytes from 10.42.42.1: icmp_req=3 ttl=64 time=133 ms
    ^C
    --- 10.42.42.1 ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 2002ms
    rtt min/avg/max/mdev = 133.227/205.107/288.171/63.750 ms
    

    Nous avons aussi de nouvelles routes pour l’interface mlvpn0:

    root@raspberrypi:~# ip route show
    default via 192.168.0.254 dev eth0
    10.42.42.0/30 dev mlvpn0 proto kernel scope link src 10.42.42.2
    188.165.12.106 via 10.42.42.2 dev mlvpn0 scope link
    192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.179
    192.168.1.0/24 dev wlan1 proto kernel scope link src 192.168.1.102
    192.168.8.0/24 dev wlan0 proto kernel scope link src 192.168.8.100
    

    Pour forcer du traffic passant par ce nouveau tunnel, il faudra créér une route :

    root@raspberrypi:~# ip route add 8.8.8.8 via 10.42.42.2
    
    root@raspberrypi:~# traceroute -I 8.8.8.8
    traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
     1 10.42.42.1 (10.42.42.1) 135.070 ms * *
     2 * * *
     3 gra-g2-a9.fr.eu (178.33.103.227) 134.922 ms * *
     4 * * *
    
    root@raspberrypi:~# dig +short @8.8.8.8 www.test.com
    69.172.200.235
    
    root@raspberrypi:~# ping 8.8.8.8
    PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
    64 bytes from 8.8.8.8: icmp_req=1 ttl=58 time=250 ms
    64 bytes from 8.8.8.8: icmp_req=2 ttl=58 time=93.4 ms
    64 bytes from 8.8.8.8: icmp_req=3 ttl=58 time=193 ms
    64 bytes from 8.8.8.8: icmp_req=4 ttl=58 time=58.7 ms
    64 bytes from 8.8.8.8: icmp_req=5 ttl=58 time=64.2 ms
    
    

    Pour joindre 8.8.8.8, le traceroute indique bien le passage par le tunnel mlvpn0 (10.42.42.1).

    Tout est fonctionnel.

    openvpn centos 7

    OPenVPN

     

    PARTIE SERVER

     

    • yum -y install epel-repository
    • yum -y install openvpn easy-rsa iptables-services
    • cp -r /usr/share/easy-rsa/ /etc/openvpn/
    • cd /etc/openvpn/easy-rsa/2.*/
      vim vars => KEY_SIZE=4096
    • source ./vars
    • ./clean-all
    • ./build-ca
    • ./build-key-server server
    • ./build-dh (ULTRA LONG)
    • ./build-key client1
    • ./build-key client2
    • etc
    • cd /etc/openvpn/easy-rsa/2.0/
    • cp -r keys/ /etc/openvpn/
    • cd /etc/openvpn/
    • vim server.conf
    port 1194
    proto udp
    proto udp6
    dev tun
    ca /etc/openvpn/keys/ca.crt
    cert /etc/openvpn/keys/server.crt
    key /etc/openvpn/keys/server.key
    dh /etc/openvpn/keys/dh4096.pem
    ;tls-auth /etc/openvpn/certs/ta.key 0
    server 192.168.45.0 255.255.255.0
    server-ipv6 2001:db8:0:123::/64
    
    ifconfig-pool-persist ipp.txt
    push "redirect-gateway def1 bypass-dhcp"
    push "dhcp-option DNS 192.168.45.1"
    push "dhcp-option DNS 8.8.4.4"
    
    keepalive 1800 4000
    
    cipher DES-EDE3-CBC # Triple-DES
    comp-lzo
    
    max-clients 10
    duplicate-cn
    
    user nobody
    group nobody
    
    persist-key
    persist-tun
    
    ;log-append openvpn.log
    status openvpn-status.log
    verb 5
    mute 20
    

    Ajouter une règle iptable pour laisser passer le traffic VPN:

    iptables -A POSTROUTING -s 192.168.45.0/24 -o eth0 -j MASQUERADE
    iptables-save > /etc/sysconfig/iptables
    

    Démarrer le vpn

    systemctl start openvpn@server
    

    PARTIE CLIENT

    Installer le client openvpn
    
    Créer un fichier openvpn.ovpn
    
    client
    dev tun
    proto udp
    remote 192.168.1.104 1194
    resolv-retry infinite 
    nobind 
    persist-key 
    persist-tun 
    mute-replay-warnings 
    ca ca.crt 
    cert client.crt 
    key client.key 
    ns-cert-type server 
    comp-lzo 
    <ca>___COPIER_COLLER_LE_FICHIER CA.CRT___</ca> 
    <key>___COPIER_COLLER_LE_FICHIER CLIENT.CRT___</key> 
    <cert>___COPIER_COLLER_LE_FICHIER CLIENT.CRT___</cert>
    

    Double cliquer sur le fichier ovpn.

    Mysql m’a “tuer” ! Maia aussi !

    Tout part d’une notification du monitoring xymon à propos de portaudit concernant une vulnérabilité sur mysql56-server.

    Capture d’écran 2015-07-21 à 16.30.02

     

    S’en suit la procédure standard de mise à jour:

    root@distran:~ # portmaster mysql56-server

    Tout se déroule correctement jusqu’au moment ou je décide de vérifier l’accès á la base de données.
    Et la c’est le FAIL. Il me dit qu’il trouve pas la socket.

    Le premier réflèxe est d’aller jeter un oeil au log de mysql:

    20:06:09 UTC – mysqld got signal 11 ;
    This could be because you hit a bug. It is also possible that this binary
    or one of the libraries it was linked against is corrupt, improperly built,
    or misconfigured. This error can also be caused by malfunctioning hardware.
    We will try our best to scrape up some info that will hopefully help
    diagnose the problem, but since we have already crashed,
    something is definitely wrong and this may fail.
    Et mysql crash en boucle avec ce message sans plus de détail.
    Mes mails reposant sur postfixadmin et donc la base de données, je décide de ne pas perdre de temps et de reínstaller les bases avec les dumps nocturnes.
    La perte de données est faible voir nulle car ce sont des bases de données pour les mails et je n’ajoute pas de nouveaux utilisateurs chaque jour.
    Néanmoins, dans le cas d’une base critique fréquemment mise á jour, j’aurais utilisé les bin-log.
    Techniquement, je conserve un backup de la base broken et je recommence from scratch:
    # mv /var/db/mysql /var/db/mysql.old
    # mkdir /var/db/mysql ; chown mysql: /var/db/mysql
    # /usr/local/etc/rc.d/mysql start
    
    
    Puis utilisation des dump noctures:
    # echo « create database mysql » | mysql
    
    Je relance mysql et la rebelle tout crash en continue avec le même message que plus haut.. Youpi ! vive les backup qui marchent pas ! 🙂
    Je décide de rebuild tout sauf la db mysql et de recréer les utilisateurs via les grant d’origine á la main en récupérant les l/p dans les fichiers de conf postfixadmin et maia.
    # echo « create database postfix » | mysql
    # echo « create database maia » | mysql
    # zcat postfix_xxxxx.sql.gz | mysql  postfix;
    # cat maia_xxxxx.sql.gz | mysql maia
    # mysql
    mysql> grant all privileges to postfix.* blabla
    mysql> grant all privileges to maia.* blabla
    
    A ce point, on se dit “ouf” c’est fini.
    Et même pas, dans les logs maillog apparait ce joli message:
    Jul 19 22:31:35 distran maiad[15376]: (15376-03) TROUBLE in check_mail: Take Action! FAILED: DBD::mysql::st execute failed: Column ‘autolearn_status’ cannot be null at /usr/local/sbin/maiad line 4410, <GEN18> line 159.
    Jul 19 22:31:35 distran maiad[15376]: (15376-03) PRESERVING EVIDENCE in /var/maiad/tmp/maia-20150719T223135-15376
    Jul 19 22:31:35 distran postfix/smtp[16349]: C2D1E895191: to=<nicolas@lienard.name>, orig_to=<root@distran.org>, relay=127.0.0.1[127.0.0.1]:10024, delay=0.9, delays=0.27/0.01/0/0.62, dsn=4.5.0, status=deferred (host 127.0.0.1[127.0.0.1] said: 451 4.5.0 Error in processing, id=15376-03, Take Action! FAILED: DBD::mysql::st execute failed: Column ‘autolearn_status’ cannot be null at /usr/local/sbin/maiad line 4410, <GEN18> line 159. (in reply to end of DATA command))
     Humm, je me fais tué une 2eme fois par maia.
    il est tard, et je veux en finir. je google rapidement mais ne trouve rien sur ce bug.
    Je jete un oeil sur
     /usr/local/sbin/maiad a la ligne 4410
    UPDATE maia_mail SET score = ?, autolearn_status = ? WHERE id = ?
    
    Ok donc il y a un souci lors des updates sql de maia avec le champs autolearn_status qui ne peut plus être “null”.
    Je regarde la description de la table en question:
    mysql> desc maia_mail;
    
    +------------------+------------------+------+-----+-------------+----------------+
    | Field            | Type             | Null | Key | Default     | Extra          |
    +------------------+------------------+------+-----+-------------+----------------+
    | id               | int(10) unsigned | NO   | PRI | NULL        | auto_increment |
    | received_date    | datetime         | NO   | MUL | NULL        |                |
    | size             | int(10) unsigned | NO   |     | NULL        |                |
    | sender_email     | varbinary(255)   | NO   | MUL | NULL        |                |
    | envelope_to      | blob             | NO   |     | NULL        |                |
    | subject          | varchar(255)     | NO   | MUL | NULL        |                |
    | contents         | longblob         | NO   |     | NULL        |                |
    | score            | float            | YES  | MUL | NULL        |                |
    | autolearn_status | varchar(15)      | NO   |     | unavailable |                |
    +------------------+------------------+------+-----+-------------+————————+
    
    Le paramètre NULL est effectivement à “No”. Comment cela pouvait-il fonctionner auparavant ??
    Je regarde á l’intérieur et il y a bien des rows á null donc ca marchait comment avant ? 🙂
    Pour en finir. j’altère la table:
    mysql> alter table   maia_mail MODIFY autolearn_status varchar(15)
    
    Le résultat:
    mysql> desc maia_mail;
    
    +------------------+------------------+------+-----+-------------+----------------+
    | Field            | Type             | Null | Key | Default     | Extra          |
    +------------------+------------------+------+-----+-------------+----------------+
    | id               | int(10) unsigned | NO   | PRI | NULL        | auto_increment |
    | received_date    | datetime         | NO   | MUL | NULL        |                |
    | size             | int(10) unsigned | NO   |     | NULL        |                |
    | sender_email     | varbinary(255)   | NO   | MUL | NULL        |                |
    | envelope_to      | blob             | NO   |     | NULL        |                |
    | subject          | varchar(255)     | NO   | MUL | NULL        |                |
    | contents         | longblob         | NO   |     | NULL        |                |
    | score            | float            | YES  | MUL | NULL        |                |
    | autolearn_status | varchar(15)      | YES  |     | unavailable |                |
    +------------------+------------------+------+-----+-------------+————————+
    
    Et tout refonctionne ! OUF !

    FreeBSD – Howto install VirtualBox

    Installation de VirtualBOX sous FreeBSD 8 en ligne de commande.

    Je voulais créer un petit lab composé de CentOS sur ma FreeBSD. C’est chose faite:

    – Première étape : installer le port virtualbox-ose:

    virtualbox-ose-4.0.12 A general-purpose full virtualizer for x86 hardware

    
    lupus# cd /usr/ports/emulators/virtualbox-ose
    lupus# make install clean
    
    

    – Il faut cocher en plus: – QT4 – GUESTADDITIONS – X11 – VDE – VNC

    – Ensuite création d’une VM:

    lupus# VBoxManage createvm --name centos-pam --register
    Virtual machine 'centos-pam' is created and registered.
    UUID: cdb74972-15fa-4fcb-aec9-9540964abd44
    Settings file: '/root/VirtualBox VMs/centos-pam/centos-pam.vbox'
    

    – Création d’un disk de 10Gb

    
    lupus# VBoxManage createhd --filename VirtualBox\ VMs/centos-pam/pam.vdi --size 10000
    0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
    Disk image created. UUID: 18aaa295-22a7-4f38-a400-3cb51ed50e94
    
    

    – Déclaration d’un controlleur SATA

    lupus# VBoxManage storagectl centos-pam  --name "SATA Controller" --add sata --controller IntelAHCI
    

    – Affectation de l’image vdi au controlleur SATA:

    lupus# VBoxManage storageattach  centos-pam --storagectl "SATA Controller" --port 0 --device 0 --type hdd --medium VirtualBox\ VMs/centos-pam/pam.vdi
    

    – Pour installer l’OS guest, il nous faut déclarer un lecteur CD

    lupus# VBoxManage storagectl centos-pam  --name "IDE Controller" --add ide
    

    – Affectation de l’image ISO CentOS à ce nouveau contrôleur:

    lupus# VBoxManage storageattach centos-pam --storagectl "IDE Controller" --port 0 --device 0 --type dvddrive --medium /usr/jails/CentOS-6.0-i386-minimal.iso
    

    – Définiton de l’ordre du boot

    lupus# VBoxManage modifyvm centos-pam --boot1 dvd --boot2 disk --boot3 none --boot4 none
    

    – Il nous faut un peu de RAM

    lupus# VBoxManage modifyvm centos-pam --memory 1024 --vram 128
    

    – Ne pas oublier la carte réseau, sinon l’intérêt est limité. La première carte (eth0) est pour avoir Internet (NAT). La 2eme (eth1) est pour faire communiquer les VM ensemble (si on créer plusieurs VM). eth0 aura automatiquement une IP via le DHCP de VirtualBox. eth1 devra se voir attribuer une ip manuellement (192.168.200.1 par exemple). Cette partie se fait sur l’OS guest directement.

    lupus# VBoxManage modifyvm centos-pam --nic1 nat --nictype1 82540EM
    lupus# VBoxManage modifyvm centos-pam --nic2 intnet
    

    – Afin d’avoir accès depuis l’host vers la VM, on peut faire une redirection de port (rediriger le port local 22 de la VM vers l’OS sur le port 22224).

    lupus# VBoxManage modifyvm centos-pam --natpf1 "guestssh,tcp,,22224,,22"
    

    – Démarrer la VM en activant VNC (-n) et choisir le port (-m 5901) afin de prendre le contrôle de la console par ce biais.

    VBoxHeadless -n -m 5901 --startvm centos-pam
    

    – Maintenant, il suffit depuis son pc a la maison de faire un tunnel SSH :

    ssh -L 5903:lupus:5903 nico@lupus
    

    – Depuis mon pc a la maison, je démarre une session VNC sur localhost:5903 et la console apparait permettant ainsi de procéder à l’installation de l’OS.

    – Quand l’installation est terminée, il faut enlever l’image ISO

    lupus# VBoxManage storageattach centos-pam --storagectl "IDE Controller" --port 0 --device 0 --type dvddrive --medium none
    

    – Si jamais on souhaite enlever un NAT existant:

    lupus# VBoxManage modifyvm centos-pam --natpf1 delete guestssh
    

    – Une VM tout seule, c’est pas marrant, autant en avoir 2 mais sans se refaire l’installation from scratch.
    Pour cela : CLONER l’image disque (la VM source doit être éteinte).

    lupus# VBoxManage createvm --name centos-sensei --register
    lupus# VBoxManage clonehd /usr/jails/VirtualBox\ VMs/centos-pam/pam.vdi /usr/jails/VirtualBox\ VMs/centos-sensei/sensei.vdi --format VDI
    lupus# VBoxManage storagectl centos-sensei --name "SATA Controller" --add sata --controller IntelAHCI
    lupus# VBoxManage storageattach centos-sensei --storagectl "SATA Controller" --port 0 --device 0 --type hdd --medium /usr/jails/VirtualBox\ VMs/centos-sensei/sensei.vdi
    

    – On peut lister les VM créées:

    lupus# VBoxManage list vms
    "centos-pam" {cdb74972-15fa-4fcb-aec9-9540964abd44}
    "centos-sensei" {3d030271-3a63-4c9b-a3b1-9a70c2b1e12a}
    

    – On peut maintenant y aller en SSH

    lupus# ssh -p 22224 localhost uname -a
    root@localhost's password:
    Linux centos-pam 2.6.18-274.7.1.el5 #1 SMP Thu Oct 20 16:20:37 EDT 2011 i686 i686 i386 GNU/Linux
    

    Bon LAB !

    Freebsd – Howto ZFS + Deduplication + Compression

    Installation de ZFS et tests des fameuses fonctionnalités de déduplication et de compression.

    Voici un test sur un axe en raid 5 séparé de la partie système d’un serveur HP DL380 G2,. L’OS fraîchement installé est un Freebsd 8.2-RELEASE.

    “dmesg” informe de l’existence des volumes da0 et da1. da0 est le système. Nous nous attarderons sur da1 qui n’est pas utilisé.

    tripaxcolt2# dmesg | egrep "^da"
    da0 at ciss1 bus 0 scbus1 target 0 lun 0
    da0: <COMPAQ RAID 1(1VOLUME OK> Fixed Direct Access SCSI-0 device
    da0: 135.168MB/s transfers
    da0: Command Queueing enabled
    da0: 34727MB (71122560 512 byte sectors: 255H 32S/T 8716C)
    da1 at ciss1 bus 0 scbus1 target 1 lun 0
    da1: <COMPAQ RAID 5 VOLUME OK> Fixed Direct Access SCSI-0 device
    da1: 135.168MB/s transfers
    da1: Command Queueing enabled
    da1: 104183MB (213367680 512 byte sectors: 255H 32S/T 26148C)
    

    – Création d’une slice Freebsd de 102Gb.

    tripaxcolt2#  gpart show da1
             34  213367613  da1  GPT  (102G)
             34  213367613       - free -  (102G)
    
    tripaxcolt2# gpart add -t freebsd da1
    da1s1 added
    tripaxcolt2# gpart show da1
             34  213367613  da1  GPT  (102G)
             34  213367613    1  freebsd  (102G)
    
    tripaxcolt2# gpart create -s BSD da1s1
    da1s1 created
    
    tripaxcolt2#  gpart show da1
             34  213367613  da1  GPT  (102G)
             34  213367613    1  freebsd  (102G)
    
    

    – Chargement des kernel modules nécessaires à ZFS:

    tripaxcolt2# kldload opensolaris
    tripaxcolt2# kldload zfs
    tripaxcolt2#
    
    

    – Création du pool “data”:

    tripaxcolt2# zpool create data /dev/da1s1
    tripaxcolt2#
    
    

    – On peut voir que le montage est effectué instantanément:

    tripaxcolt2# mount
    /dev/da0s1a on / (ufs, local)
    devfs on /dev (devfs, local, multilabel)
    /dev/da0s1e on /tmp (ufs, local, soft-updates)
    /dev/da0s1f on /usr (ufs, local, soft-updates)
    /dev/da0s1d on /var (ufs, local, soft-updates)
    data on /data (zfs, local)
    
    tripaxcolt2# df -h /data
    data 99G 21K 99G 0% /data
    
    

    zpool status nous informera du status de notre pool nouvellement créé:

    
    tripaxcolt2# zpool status data
     pool: data
     state: ONLINE
     scrub: none requested
     config:
    
    NAME STATE READ WRITE CKSUM
     data ONLINE 0 0 0z
     da1s1 ONLINE 0 0 0
    
    errors: No known data errors
    
    

    – zpool list nous donne la liste des pools (ici, un seul).

    
    tripaxcolt2# zpool list
     NAME SIZE USED AVAIL CAP HEALTH ALTROOT
     data 101G 75K 101G 0% ONLINE -
    
    

    – Il faut que le montage se fasse automatiquement au boot. Pour cela, il faut définir le mountpoint à ZFS.

    tripaxcolt2# echo 'zfs_enable="YES"' >> /etc/rc.conf
    tripaxcolt2# echo 'zfs_load="YES"' >> /boot/loader.conf
    tripaxcolt2# umount /data
    tripaxcolt2# zfs set mountpoint=/data data
    tripaxcolt2# zpool export data
    
     tripaxcolt2# zpool import data
     tripaxcolt2# zfs mount -a
     tripaxcolt2# df -h
     Filesystem Size Used Avail Capacity Mounted on
     /dev/da0s1a 989M 172M 738M 19% /
     devfs 1.0K 1.0K 0B 100% /dev
     /dev/da0s1e 989M 12K 910M 0% /tmp
     /dev/da0s1f 20G 151M 18G 1% /usr
     /dev/da0s1d 7.2G 304K 6.7G 0% /var
     data 99G 21K 99G 0% /data
    

    – Vérifions si nous avons la déduplication active:

    
    tripaxcolt2# zpool get all data
     NAME PROPERTY VALUE SOURCE
     data size 101G -
     data used 85.5K -
     data available 101G -
     data capacity 0% -
     data altroot - default
     data health ONLINE -
     data guid 2284095815770433086 default
     data version 15 default <------------- v15
     data bootfs - default
     data delegation on default
     data autoreplace off default
     data cachefile - default
     data failmode wait default
     data listsnapshots off default
     

    On voit que nous sommes en ZFS version 15, une version n’offrant pas de déduplication ni de compression.

    En effet, il faut être en v28, et cette version a été margée que sous FreeBSD 8.2-STABLE et Freebsd 9-BETA.

    Or ici, c’est une Freebsd 8.2-RELEASE. C’est parti pour une upgrade kernel/userland

    
    upgrade kernel -> 8.2-STABLE (cf /usr/src/Makefile)
    
    

    – Après le reboot final, nous sommes  à jour:

    
    # tripaxcolt2# uname -a
    FreeBSD tripaxcolt2 8.2-STABLE FreeBSD 8.2-STABLE #0: Tue Aug 23 13:40:45 CEST 2011     root@tripaxcolt2:/usr/obj/usr/src/sys/GENERIC  i386&lt;/pre&gt;
    

    – Updatons le pool zfs

    
    tripaxcolt2# zpool upgrade
     This system is currently running ZFS pool version 28.
    
    The following pools are out of date, and can be upgraded. After being
     upgraded, these pools will no longer be accessible by older software versions.
    
    VER POOL
     --- ------------
     15 data
    
    Use 'zpool upgrade -v' for a list of available versions and their associated
     features.
    
    tripaxcolt2# zpool upgrade data
     This system is currently running ZFS pool version 28.
     Successfully upgraded 'data' from version 15 to version 28
    
    tripaxcolt2# zfs upgrade data
     1 filesystems upgraded
    
    

    – Ces 2 commands (zpool upgrade & zfs upgrade) sont suffisantes pour passer de la v15 à v28.

    Petite vérification :

    
    tripaxcolt2# zpool get all data
     NAME PROPERTY VALUE SOURCE
     data size 101G -
     data capacity 0% -
     data altroot - default
     data health ONLINE -
     data guid 2284095815770433086 default
     data version 28 default <---------- v28
     data bootfs - default
     data delegation on default
     data autoreplace off default
     data cachefile - default
     data failmode wait default
     data listsnapshots off default
     data autoexpand off default
     data dedupditto 0 default
     data dedupratio 1.00x -
     data free 101G -
     data allocated 83.5K -
     data readonly off -
    
    

    – Maintenant passons aux tests avec dd (avec /dev/zero) :

    
    tripaxcolt2# dd if=/dev/zero of=/data/test1 count=100 bs=10M
     100+0 records in
     100+0 records out
     1048576000 bytes transferred in 90.750924 secs (11554439 bytes/sec)
    
    tripaxcolt2# df -h /data
     Filesystem Size Used Avail Capacity Mounted on
     data 99G 1G 98G 1% /data
    
    tripaxcolt2# dd if=/dev/zero of=/data/test2 count=100 bs=10M
     100+0 records in
     100+0 records out
     1048576000 bytes transferred in 87.764387 secs (11947625 bytes/sec)
    
    tripaxcolt2# df -h /data
     Filesystem Size Used Avail Capacity Mounted on
     data 99G 2G 97G 2% /data
    
    

    –> on voit que la compression n’est pas active, et oui il faut l’activer manuellement, idem pour la déduplication.

    – Activation de la déduplication et de la compression:

    
    tripaxcolt2# zfs set dedup=on data
    tripaxcolt2# zfs set compression=on data
    tripaxcolt2#
    

    – Refaisons le même test avec dd (toujours avec /dev/zero) pour tester la compression:

    
    tripaxcolt2# rm test*
    tripaxcolt2# ls -la
    total 4
    drwxr-xr-x 2 root wheel 2 Aug 23 17:54 .
    drwxr-xr-x 21 root wheel 512 Aug 23 17:28 ..
    
    tripaxcolt2# dd if=/dev/zero of=test1 count=100 bs=10M
     100+0 records in
     100+0 records out
     1048576000 bytes transferred in 11.337030 secs (92491244 bytes/sec)
     tripaxcolt2# df -h /data
     Filesystem Size Used Avail Capacity Mounted on
     data 99G 31k 99G 0% /data
    
    tripaxcolt2# ls -la
     total 4
     drwxr-xr-x 2 root wheel 3 Aug 23 17:54 .
     drwxr-xr-x 21 root wheel 512 Aug 23 17:28 ..
     -rw-r--r-- 1 root wheel 1048576000 Aug 23 17:54 test1
     tripaxcolt2# du -sh test1
     512B test1
    
    tripaxcolt2# dd if=/dev/zero of=test2 count=100 bs=10M
     100+0 records in
     100+0 records out
     1048576000 bytes transferred in 11.778770 secs (89022538 bytes/sec)
     tripaxcolt2#
    
    tripaxcolt2# df -h /data
     Filesystem Size Used Avail Capacity Mounted on
     data 99G 31k 99G 0% /data
     tripaxcolt2#
    
    tripaxcolt2# du -sh test*
     512B test1
     512B test2
     tripaxcolt2# du -sh /data/
     2.5k /data/
    
    

    –> on a donc 2 fichiers de 1Go chacun et pourtant cela prend que 2.5Ko.

    La compression est un succès !

    – Passons à la déduplication.

    Nous allons utiliser dd avec /dev/random pour ne pas exploiter la compression mais uniquement la déduplication.

    
    tripaxcolt2# dd if=/dev/random of=test2 count=100 bs=10M
    100+0 records in
    100+0 records out
    1048576000 bytes transferred in 122.076469 secs (8589501 bytes/sec)
    tripaxcolt2# df -h /data
    Filesystem Size Used Avail Capacity Mounted on
    data 99G 1G 98G 1% /data
    
    tripaxcolt2# du -sh *
     512B test1
     1G test2
    
    

    – Nous avons un fichier “test2” de 1Go. Pour tester la déduplication, il suffit de copier ce fichier vers un nouveau (avec “cp”):

    
    tripaxcolt2# cp test2 test3 <--- 1ere copie
    tripaxcolt2# du -sh *
    512B test1
    1G test2 <--- original
    1G test3 <--- 1ere copie
    tripaxcolt2# df -h /data
    Filesystem Size Used Avail Capacity Mounted on
    data 100G 2G 98G 2% /data <---- Passage de 99G à 100G
    tripaxcolt2# cp test3 test4 <---- 2eme copie
    tripaxcolt2# du -sh *
    512B test1
    1G test2 <--- original
    1G test3 <--- 1ere copie
    1G test4 <--- 2eme copie
    tripaxcolt2# df -h /data
    Filesystem Size Used Avail Capacity Mounted on
    data 101G 3G 98G 3% /data <---- Passage de 100G à 101G
    
    tripaxcolt2# cp test4 test5 <---- 3eme copie
    tripaxcolt2# du -sh *
     512B test1
     1G test2 <--- original
     1G test3 <--- 1ere copie
     1G test4 <--- 2eme copie
     1G test5 <--- 3eme copie
    tripaxcolt2# df -h /data
    Filesystem Size Used Avail Capacity Mounted on
    data 102G 3.9G 98G 4% /data <---- Passage de 101G à 102G
    
    

    => On voit que la taille du disque total a augmenté, passant de 99Go à 102Go après les 3 copies du fichier de 1Go. Succès !

    – Quelques statistiques:

    
    tripaxcolt2# zdb -DD data
     DDT-sha256-zap-duplicate: 8000 entries, size 268 on disk, 142 in core
    
    DDT histogram (aggregated over all DDTs):
    
    bucket allocated referenced
     ______ ______________________________ ______________________________
     refcnt blocks LSIZE PSIZE DSIZE blocks LSIZE PSIZE DSIZE
     ------ ------ ----- ----- ----- ------ ----- ----- -----
     4 7.81K 1000M 1000M 1000M 31.2K 3.91G 3.91G 3.91G
     Total 7.81K 1000M 1000M 1000M 31.2K 3.91G 3.91G 3.91G
    
    dedup = 4.00, compress = 1.00, copies = 1.00, dedup * compress / copies = 4.00
    
    tripaxcolt2# zpool list
    NAME   SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
    data   101G  1006M   100G     0%  4.00x  ONLINE  -