Maniatux's Blog

Welcome to the internet

Linux

Debian 8 + Xen + Virt-manager HOWTO

Rédigé par Xavier - - Aucun commentaire

Xen + libvirt is an interesting choice of toolstack, it makes network-management and guest installation easier and enables graphical remote management of the VMs. However, Debian Wheezy has several issues, I have never been able to boot something using xen + virt-manager, so I strongly recommend Jessie which is pretty stable. In this howto, I use two servers : xen-01 (for Xen + libvirt, headless) and xen-console (for virt-manager, with Xfce desktop). You can use virtual or physical machines but I had issues with VMware because Xen keeps freezing when you try to boot a domU. However, Virtualbox works fine.

Lire la suite de Debian 8 + Xen + Virt-manager HOWTO

Yunohost : mx backup whitelist (vérification spf)

Rédigé par Xavier - - Aucun commentaire

Qu'est-ce que la vérification SPF ?

Un nom domaine (example.com) est enregistré sur un DNS et comporte plusieurs valeurs : A (hôte ipv4), AAAA (hôte ipv6), MX (serveur où les mails doivent être remis), TXT (divers), etc. Le champ TXT permet de définir des arguments relatifs à la messagerie. Dans notre cas, SPF consiste à indiquer quel serveur a le droit d'envoyer du courrier en utilisant ce domaine comme identité. Concrètement on peut définir que seul le serveur 1.2.3.4 a le droit d'envoyer un mail en tant que @example.com.

Une vérification SPF permet donc à un serveur qui reçoit du courrier de vérifier que celui qui envoie est bien ce qu'il prétend être. On évite ainsi pas mal de spam, usurpation d'identité, phishing et autres joyeusetés. Voici étape par étape comment ça fonctionne :

  • Un mail arrive, comme expéditeur il est indiqué machin@example.com
  • Le serveur qui reçoit vérifie ce qui est indiqué en SPF dans l'enregistrement DNS de example.com
  • Ce SPF dit que seuls les serveurs 1.2.3.4 et 5.6.7.8 sont autorisés à envoyer du courrier pour le domaine example.com
  • Le serveur vérifie donc l'IP du serveur expéditeur et rejette le message si cela ne correspond pas aux deux adresses précédentes

Le problème du mx backup

Comme je l'indiquais plus haut, un domaine peut contenir un champ MX qui indique à quel serveur le courrier doit être redirigé. Or on peut avoir plusieurs MX avec un ordre de priorité. Cela présente un intérêt pour assurer la continuité de service si le serveur principal tombe. Un serveur secondaire sera nommé mx backup dans cet article.

J'ai été confronté à un cas spécial. Comme l'ami Etenil j'ai un serveur de messagerie en ligne nous avons donc modifié nos configurations pour faire office de mx backup l'un l'autre. Donc si mon serveur se retrouve offline, les mails entrants seront redirigés vers le serveur de Etenil qui les conservera jusqu'à ce que je revienne online. Un problème s'est posé depuis que j'ai migré mon serveur sur Yunohost. En effet ce dernier fait une vérification SPF quand il reçoit un mail. Et dans le cas où c'est le mx backup qui me transmet un message, voilà ce qui se passe :

  • Mon serveur est passé offline
  • Un expéditeur machin@example.com m'envoie un mail
  • Le mail arrive sur le mx backup (chez etenil) qui le stocke
  • Mon serveur revient online
  • Le mx backup (etenil) me transfère donc le mail
  • Mon serveur fait une vérification SPF et compare avec l'IP du mx backup (etenil)
  • Le message est rejeté car le champ SPF de example.com ne liste pas l'IP du mx backup (ce qui est normal)

La vérification SPF est donc problématique dans le cas où le message n'arrive pas directement mais transite par d'autres mx indépendants de l'expéditeur. Notez que par défaut Postfix ne fait pas de vérification SPF, cela est géré par un plugin. Mais YunoHost le propose par défaut.

La solution

Il faut définir une "spf whitelist" pour indiquer à Postfix de ne pas faire de vérification dans le cas où le serveur expéditeur est mon mx backup. J'ai trouvé la solution en lisant cette page de documentation.

Donc on édite notre /etc/postfix/main.cf puis on recherche la section suivante :

# Requirement for the recipient address
smtpd_recipient_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    reject_non_fqdn_recipient,
    reject_unknown_recipient_domain,
    reject_unauth_destination,
    check_policy_service unix:private/policy-spf
    check_policy_service inet:127.0.0.1:10023
    permit

On va donc y insérer la directive permit relay_addresses mx2.example.com :

# Requirement for the recipient address
smtpd_recipient_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    permit relay_addresses mx2.example.com
    reject_non_fqdn_recipient,
    reject_unknown_recipient_domain,
    reject_unauth_destination,
    check_policy_service unix:private/policy-spf
    check_policy_service inet:127.0.0.1:10023
    permit

Ensuite on recharge Postfix :

# service postfix reload

Et voilà

Mon serveur @home attaqué ?

Rédigé par Xavier - - Aucun commentaire

Depuis quelques jours, le soir, je rencontre de grosses difficultés de connexion à internet. En effet j'ai des pings à 6000ms avec 50% de pertes de paquets. J'ai remarqué que le fait d'éteindre mon serveur @home permettait de résoudre le problème, ce qui est un peu étrange car j'imagine mal comment on peut mettre à genoux une connexion de 100Mbps. Plus étrange encore, le fait de désactiver les services nginx et postfix permettait également de résoudre les problèmes. En revanche la lecture des logs de ces services et ceux du système n'indiquait rien d'anormal.

Je m'orientais donc soit vers un ddos, soit un bug de lxc car la version proposée sur Debian est obsolète et on peut très bien imaginer des problèmes avec le bridge menant à des tempêtes de broadcast ou autres joyeusetés du genre. Désespéré, j'ai upgradé mon serveur en Jessie. Exit le kernel 3.2 et bonjour au 3.16, exit lxc 0.8 et bonjour lxc1.0. Suite à cela j'ai remarqué un retour à la normale et même une hausse de la réactivité du serveur. Je pensais donc le problème résolu.

Mais ce soir, rebelotte. Ping à 6000ms, 50% de pertes de paquets, et encore une fois le fait de couper mon serveur faisait disparaitre le problème. Cette fois j'ai donc fait tourner une analyse wireshark sur l'interface réseau du serveur.

Capture du trafic avec wireshark

Côté serveur (remote)

Installer tcpdump :

# apt-get install tcpdump

Côté PC portable

Installer Wireshark puis exécuter les commandes suivantes :

# mkfifo /tmp/wshark
# ssh root@192.168.0.1 "tcpdump -s 0 -U -n -w - -i eth0 not port 22" > /tmp/wshark

Puis, dans un autre onglet :

 # wireshark -k -i /tmp/wshark

Wireshark doit s'ouvrir et commencer à afficher le traffic du serveur :

Analyse des résultats

J'ai donc observé que pour deux IP, les trames suivantes inondaient le serveur :

3	0.023193000	5.39.90.132	192.168.0.2	TCP	66	[TCP Port numbers reused] 80→25 [SYN] Seq=0 Win=8192 Len=0 MSS=1460 WS=256 SACK_PERM=1

Sans connaître tous les détails il semble que ce soit donc bien une attaque. Apparemment c'est du SYN flood.

Actions

A l'aide d'iptables, j'ai bloqué les deux adresses IP en cause :

# iptables -I FORWARD -s 5.39.90.132 -j DROP
# iptables -I FORWARD -s 37.187.112.166 -j DROP

Note : j'utilise FORWARD car j'ajoute cette règle sur l'hôte alors que les paquets sont à destination d'un container LXC qui dispose d'une autre adresse IP. INPUT doit être mis à la place si ce n'est pas le cas, ou dans le doute, les deux.

Miracle, après avoir bloqué ces deux IP, ma connexion à internet est revenue à la normale.

Ma deuxième action fut d'exécuter un whois sur ces deux IP pour en apprendre un peu plus. Elles appartiennent à des serveurs dédiés OVH, j'ai donc rempli le formulaire abuse sur leur site pour leur signaler que ces serveurs ont un comportement étrange.

Conclusion

Mon interprétation est la suivante : deux serveurs m'ont inondé de requêtes, qui arrivent sur nginx et postfix puisqu'elles sont destinées aux ports 25/80/443 d'après Wireshark. Si mon container LXC est éteint, elles finissent dans le vide. En revanche s'il est allumé, elles aboutissent et se multiplient jusqu'à saturer la BBox (le routeur en amont), ce qui provoque les ralentissements. Wireshark m'a beaucoup aidé à diagnostiquer ce problème, c'est maintenant mon meilleur ami.

iptables a pour instruction de "droper" (DROP) les paquets en provenance de ces deux adresses, ce qui revient donc à reproduire le comportement du serveur éteint. Le signalement à OVH permettra, j'espère, de faire couper ces deux serveurs probablement compromis.

En 4 ans d'auto-hébergement c'est la première fois que je suis confronté à un tel problème. On en revient aux raisons qui m'ont poussé à externaliser le blog maniatux.fr sur un VPS OVH, à savoir que si des attaques doivent avoir lieu, autant que ce ne soi pas chez moi. Mais il me reste un serveur @home que je pensais suffisamment "discret" pour ne pas se faire attaquer. J'espère que cela ne se reproduira pas à l'avenir...

Un jour avec GNOME3

Rédigé par Xavier - - Aucun commentaire

Avant j'étais un gnomiste convaincu. Je trouvais KDE trop bordélique et Xfce trop castré (expression de Cyrille Borne qui convient plutôt bien). Et puis GNOME3 est arrivé, ce fut le drame. Il n'avait de Gnome que le nom, car avec cette nouvelle version arrivait aussi une presentation du bureau et une ergonomie totalement nouvelle cassant totalement mes habitudes et mes réflexes.

Quoi de plus énervant que de devoir tout réapprendre, perdre du temps sur des choses simples, se retrouver bloqué parce que des fonctions basiques n'ont pas été implémentées volontairement ? Bref, j'ai toujours rejeté GNOME3, au point d'adopter KDE en 2012/2013 puis Xfce en 2014, deux environnements que je pensais ne jamais utiliser.

Et puis j'ai décidé d'essayer à nouveau GNOME3, en demandant des conseils à Etenil pour ne pas me retrouver bloqué sur des broutilles. J'ai donc établi une liste de distributions intéressantes pour moi qui proposent cet environnement : Debian, CentOS, OpenSuse, Manjaro, Fedora (il y en a d'autres mais je ne les ai pas retenues car j'ai mes raisons). Debian a été rapidement éliminée car trop vieille pour du desktop, CentOS également pour son manque de paquets, OpenSuse car je ne suis pas fan de Yast, il reste donc Manjaro et Fedora. Je suis parti sur Manjaro car c'est la distribution que j'utilise actuellement (en Xfce) mais Fedora sera ma solution de repli.

Manjaro GNOME est une variante communautaire pour les fans de cet environnement. Si j'ai retenu cette distribution c'est pour AUR et la présence de nombreux logiciels/drivers préinstallés qui tendent à rendre le système le plus fonctionnel possible. Sur ce point, c'est une déception car visiblement la variante GNOME n'est pas à la hauteur de Xfce (qui est la version officielle). Par exemple Empathy le logiciel de discussion instantanée est préinstallé, mais il ne fonctionne pas car aucun backend telepathy n'est installé. En clair lorsque vous tentez d'ajouter un compte de messagerie, la liste des protocoles est vide et la fenêtre ne peut pas être fermée ce qui oblige à faire un xkill. Une erreur grossière, un bug à mon sens qui fait tâche sur cette distribution. Problème similaire pour l'accès aux partages Samba, les paquets ne sont pas préinstallés. Et pour courronner le tout, les mises à jour sont un vrai calvaire. Il faut toujours consulter les rapports de bug ou les forum car elles ne parviennent jamais à s'installer du premier coup. En bref j'ai du batailler pour faire fonctionner cette Manjaro-GNOME.

Parlons maintenant de l'environnement GNOME3 : pas de liste des fenêtres ouvertes, pas de systray, rien que ça c'est déroutant. Il faut à la place invoquer les "Activités" soit en balayant le curseur en haut à gauche de l'écran, soit avec la touche Windows du clavier. Cela affiche alors les fenêtres ouvertes mais surtout cela permet d'appeller un bureau supplémentaire pour travailler. GNOME3 encourage l'utilisation des bureaux virtuels et décourage les multiples fenêtres. Je dois avouer que c'est un choix intéressant mais déroutant voir agaçant au début. Concernant l'absence de Systray, il y a mon sens encore un vide. Faire glisser le curseur vers le bas affiche une espèce de centre de notifications mais qui est à mon sens bien loin d'être fonctionnel. Par exemple lorsqu'on utilise Empathy, étant donné qu'il n'y a ni liste des fenêtres ni systray, on ne sait pas si on est connecté ou si on a reçu un nouveau message. C'est à l'utilisateur d'aller regarder ce qui se passe. Et c'est plutôt ennuyeux.

Les applications optimisées pour GNOME3 voient leur barre de titre simplifiée car leur menu est déporté dans la barre du haut, un peu à la manière de OSX mais cela est plutôt bien réussi. En revanche quand l'application n'est pas optimisée, sa barre de menus + barre de titres est beaucoup trop grosse à mon sens et la perte d'espace sur l'écran est importante, surtout quand on a une faible résolution (1366x768 rentre dans cette catégorie à mon sens!).

Au bout d'une journée sur GNOME3 j'ai à peu près compris comment l'utiliser, mais mon constat est toujours le même : trop de mouvements de souris, de raccourcis clavier, pour faire des choses qui sont plus simples sous Xfce. Beaucoup de choses jugées obsolètes ou inutiles par Gnome sont loin de l'être et rendent l'utilisation de l'environnement plus lente et plus complexe.

J'ai prévu de rester quelques temps sous GNOME3 et peut-être même tester la Fedora, pour ne pas rester sur un échec et peut-être changer d'avis. Mais il y a encore beaucoup d'obstacles à franchir.

Debian : Configurer le réseau ipv4 d'un container LXC

Rédigé par Xavier - - Aucun commentaire

A rajouter dans le /var/lib/lxc/mycontainer/config :

# networking
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = lxcbr0
lxc.network.ipv4 = 192.168.0.3/24
lxc.network.ipv4.gateway = 192.168.0.254

lxcbr0 est à remplacer par le nom du bridge sur l'hôte.

Puis ensuite supprimer ou renommer le /var/lib/lxc/mycontainer/rootfs/etc/network/interfaces. Alternativement il est possible de juste commenter les lignes qui se rapportent à eth0.

Cette manipulation ne "verrouille" pas le container sur 192.168.0.3, il est toujours possible à l'aide de DHCP d'obtenir une autre adresse...