Ubuntu et kernel Generic chez OVH ?

Pour des raisons technique, il m’a fallu utiliser des ubuntu sur des serveurs de la gamme HOSTING d’0VH.
Le Hic c’est que par default; c’est un kernel OVH et entre nous, je préfère une installation sur un noyau générique 🙂

La procédure qui suit fonctionne pour Ubuntu 14.04, Ubuntu 15.04 et ubuntu 15.15 (j’ai testé les 3).

Pour installer le kernel generic de Linux; c’était la galère notamment avec les pilotes de la carte réseau INTEL 10 Gigabit ixgbe.

Voici la démarche:

  • Installer le kernel générique
    apt-get install -y linux-image-generic linux-headers-generic
    
  • Déplacer le positionnement du noyau OVH en dernière position pour que le nouveau générique soit en premier au boot
    mv /etc/grub.d/06_OVHkernel /etc/grub.d/25_OVHkernel
    update-grub
    

    NE PAS REBOOTER MAINTENANT SINON FAUDRA PASSER EN MODE CONSOLE

  • Installer les pilotes de la carte réseau ixgbe (4.3.13 au moment de ce post) linké sur les nouveaux headers du kernel generic fraichement installé
    apt-get install -y make gcc
    BUILD_KERNEL=$(sed -n -e '/vmlinuz-.*-generic/p' /boot/grub/grub.cfg | sed -e 's/.*vmlinuz-\(.*-generic\) .*/\1/' | head -n 1)
    cd /usr/local/src
    wget https://downloadmirror.intel.com/14687/eng/ixgbe-4.3.13.tar.gz
    tar xzvf ixgbe-4.3.13.tar.gz
    cd ixgbe-4.3.13/src
    make CFLAGS_EXTRA="-DIXGBE_NO_LRO" BUILD_KERNEL="$BUILD_KERNEL" install
    
  • ne pas oublier l’update-initramfs sinon au prochain boot faudra faire un rmmod puis modprobe; pas très glorieux
    update-initramfs -tuk $BUILD_KERNEL
    

    Voila on peut maintenant rebooter; on sera sur un nouveau noyau GENERIC et la carte réseau fonctionnera !

    # uname -a
    Linux dnxovh-hy001 3.13.0-77-generic #121-Ubuntu SMP Wed Jan 20 10:50:42 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
    # lsmod |grep ix
    ixgbe                 293872  0
    vxlan                  37619  1 ixgbe
    dca                    15130  1 ixgbe
    ptp                    18933  1 ixgbe
    
  • 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.

    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 !

    Linux – Quick & Dirty Howto for OpenVPN

    Quick & Dirty HowtoConfiguration de la partie Serveur:
    
    apt-get install openvpn openssl
    cp -R /usr/share/doc/openvpn/examples/easy-rsa /etc/openvpn/
    cd /etc/openvpn/easy-rsa/2.0
    vi vars
    (change KEY_COUNTRY)
    ../vars
    ./clean-all
    ./build-ca
    ./build-key-server server
    ./build-key client1
    ./build-dh
    cd /etc/openvpn/easy-rsa/2.0/keys
    cp ca.crt ca.key dh1024.pem server.crt server.key /etc/openvpn
    cd /etc/openvpn
    vi openvpn.conf
    

    Contenu d'openvpn.conf

    port 1194
    proto tcp
    dev tun
    ca ca.crt
    cert server.crt
    key server.key
    dh dh1024.pem
    server 172.16.0.0 255.255.255.0
    ifconfig-pool-persist ipp.txt
    keepalive 10 120
    comp-lzo
    user nobody
    group users
    persist-key
    persist-tun
    status openvpn-status.log
    verb 3
    client-to-client
    
    

    Démarrer le service:

    /etc/init.d/openvpn start
    

    Configuration de la partie Client:

    - récupérer les fichiers:

    ca.crt client1.crt client1.key
    

    - Créer un profil client:

    client
    dev tun
    proto tcp
    remote ip-or-hostname-of-your-openvpn-server 1194
    resolv-retry infinite
    nobind
    persist-key
    persist-tun
    ca ca.crt
    cert client1.crt
    key client1.key
    comp-lzo
    verb 3
    

    Si on veut rediriger TOUT le trafic vers le VPN, voici une config:

    remote ip-or-hostname-of-your-openvpn-server 1194 udp
    pull
    comp-lzo adaptive
    ca ca.crt
    redirect-gateway def1
    dev tun
    cert client1.cert
    key client1.key
    tls-client
    nobind
    dhcp-option DNS ip-du-serveur-dns
    

    Et c'est parti !

    Crash Mysql -> Recovery

    Ca n’a pas loupé, le dernier post au sujet de la sauvegarde de MySQL est plus que d’actualité.

    En effet, hier, suite à une maj de mysql-server:

     # portupgrade mysql-server

    MySQL était alors plantée avec le message suivant:

    110817 21:02:23 mysqld_safe Starting mysqld daemon with databases from /var/db/mysql
    110817 21:02:23 InnoDB: The InnoDB memory heap is disabled
    110817 21:02:23 InnoDB: Mutexes and rw_locks use GCC atomic builtins
    110817 21:02:23 InnoDB: Compressed tables use zlib 1.2.3
    110817 21:02:23 InnoDB: Initializing buffer pool, size = 256.0M
    110817 21:02:23 InnoDB: Completed initialization of buffer pool
    InnoDB: Error: log file ./ib_logfile0 is of different size 0 5242880 bytes
    InnoDB: than specified in the .cnf file 0 67108864 bytes!
    110817 21:02:23 [ERROR] Plugin 'InnoDB' init function returned error.
    110817 21:02:23 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
    110817 21:02:23 [ERROR] Unknown/unsupported storage engine: InnoDB
    110817 21:02:23 [ERROR] Aborting
    
    110817 21:02:23 [Note] /usr/local/libexec/mysqld: Shutdown complete
    
    110817 21:02:23 mysqld_safe mysqld from pid file /var/db/mysql/tripaxland4thot.pid ended
    

    Etant donné que le service est en production et que les bases sont relativement petites, la restauration fut immédiate:

    # rm -rf /var/db/mysql/*
    # ls -la /root/_archives/mysql/db.all.201108*
    -rw-r--r--  1 root  wheel  3627458 Aug 15 01:01 /root/_archives/mysql/db.all.20110815.sql.gz
    -rw-r--r--  1 root  wheel  3639055 Aug 16 01:01 /root/_archives/mysql/db.all.20110816.sql.gz
    -rw-r--r--  1 root  wheel  3651217 Aug 17 01:01 /root/_archives/mysql/db.all.20110817.sql.gz
    # zcat /root/_archives/mysql/db.all.20110817.sql.gz | mysql
    # /usr/local/etc/rc.d/mysql start
    

    Et tout refonctionne 🙂

    Script pour sauvegarder un serveur MySQL sous Linux ou FreeBSD

    Avoir une base de données MySQL c’est bien, la sauvegarder c’est mieux.

    Voici un petit script permettant de s’éviter des nuits de sueur après un crash de sa DB.

    Le délai de conservation est de 90 jours.

    #!/bin/sh
    
    DUMP=/usr/local/bin/mysqldump
    MYSQL=/usr/local/bin/mysql
    OPTS="--opt"
    DATE=`date "+%Y%m%d"`
    ARCH_DIR=/root/_archives/mysql
    DAYS=90
    
    if [ ! -d $ARCH_DIR ]
    then
            echo "error: no archive directory. Please create it or change it."
            exit 1
    fi
    
    $DUMP $OPTS  --all-databases | gzip > $ARCH_DIR/db.all.$DATE.sql.gz
    
    if [ $? -ne 0 ]
    then
            echo "error: check log"
            exit 2
    fi
    
    echo "show databases" | $MYSQL -N | while read db
    do
            $DUMP $OPTS $db | gzip > $ARCH_DIR/db.$db.$DATE.sql.gz
    done
    
    find $ARCH_DIR -type f -name "db.*" -mtime +$DAYS -exec rm {} \;
    
    exit 0
    

    Ce script est à exécuter en crontab pour avoir une sauvegarde journalière par exemple:

    tripaxland4thot# crontab -l
    # Daily MySQL DUMP
    1 1 * * * /root/_tools/dump_mysql.sh  > /tmp/dump_mysql.log 2>&1