Philpep's blog >> Let's gre !
Depuis mon dernier déménagement, je suis dans un immeuble équipé par la fibre Orange. Je me dis naïvement que ça ne peut pas être pire que l'ADSL d'autres fournisseurs plus respectueux de leurs abonnés. Première désillusion, pour toute offre fibre souscrite, il faut qu'un technicien Orange se déplace chez vous, même si tout est déjà installé dans les partie communes et qu'il y a une arrivée fibre dans l'appartement. Après trois semaines d'attente et une demi journée de travail perdue pour recevoir les techniciens qui ne font que brancher le convertisseur fibre/rj45 et la box, je suis enfin branché sur Internet. Bon les techniciens étaient très sympathiques et ils m'ont collé un câble RJ45 entre l'arrivée fibre et mon switch. Premiers tests, ça a l'air de marcher, les sites de test de débit affichent bien 100/10. Ensuite je teste un download sur ftp.fr.freebsd.org et là c'est bien plus lent, le technicien me rétorque que c'est le serveur auquel je me connecte qui ne suis pas le débit et sans réfléchir je le crois. Je me suis ensuite empressé de me débarrasser de la Livebox pour la remplacer par mon routeur, une alix 2D3 qui tourne sur FreeBSD. C'est juste une connexion PPPoE sur le VLAN 835 que j'ai faite avec mpd, pour en savoir plus vous pouvez voir là ou encore ici (linux).
Après un mois d'utilisation, youtube reste atrocement lent et je ne sent pas le facteur 5 par rapport à l'ADSL. Sur le FTP d'oléane (réseau orange), j'ai bien 100 méga réel, mais vers OVH par exemple c'est plus du 20 méga. Et peu importe le port utilisé, en fait Orange bride le débit PAR connexion tcp/udp (dans les deux sens).
# Download vers ovh sur une connexion lftp -c 'pget -n 1 http://proof.ovh.net/files/1Gio.dat -o /dev/null' files/1Gio.dat at 7430050 (0%) 880.4K/s eta:20m [Receiving data] # La même chose mais sur 10 connexions lftp -c 'pget -n 10 http://proof.ovh.net/files/1Gio.dat -o /dev/null' /files/1Gio.dat, got 47842794 of 1073741824 (4%) 4.65M/s eta:4m
Pour bypasser la limitation par connexion l'idée est de faire un tunnel vers mon dédié ovh (kimsufi 2G) et de router tout le trafic à l'intérieur. J'ai commencé par tester l'agrégation de liens tcp/udp avec plusieurs solutions (mes tests étaient entre deux FreeBSD ou entre un mix FreeBSD/Linux)
- OpenVPN sur des tap agrégés (lagg(4)): très peu performant.
- MPD en multilink PPPoTCP/PPPoUDP (merci à olivier pour son aide): ça fonctionne très bien sur 2 liens, mais au delà ça devient très peu performant visiblement à cause d'un bug dans MPD.
- MLVPN, performant mais consomme trop de CPU et débit instable (à suivre).
Finalement la solution la plus simple n'est pas avec tcp/udp, mais avec n'importe quel protocole de niveau 3 puisque la notion de connexion n'a plus de sens :). Dans les solutions les plus simples on a donc ipsec et encore plus simple: un tunnel gre, c'est la solution que j'ai mise en place. J'ai en moyenne 50Méga réel, ce qui doit être les limites du liens Orange/Ovh, visiblement le lien Orange/Online (free) est meilleur.
Le setup est ultra simple, pour faire un tunnel gre entre 1.2.3.4 et 5.6.7.8 en utilisant les IP privées 192.168.254.1/24 et 192.168.254.2/24
# FreeBSD ifconfig gre0 create ifconfig gre0 tunnel 1.2.3.4 5.6.7.8 ifconfig gre0 inet 192.168.254.1 192.168.254.2 netmask 255.255.255.0 # Linux ip tunnel add grehome mode gre remote 1.2.3.4 local 5.6.7.8 ttl 255 ip a add 192.168.254.1/24 dev grehome ip link set grehome up
On répète l'opération de l'autre coté du tunnel en inversant les adresses et voilà le tunnel configuré. Il ne faut pas oublier la config firewall
# pf pass in on gre0 # iptables -A INPUT -i eth0 -p gre -j ACCEPT
Ensuite j'ai simplement routé certaines machines de mon réseau local (192.168.31.0/24) dans le tunnel:
# Il faut une route de retour au bout du tunnel (Coté OVH avec linux) ip route add 192.168.31.0/24 via 192.168.254.2 dev grehome # On forward et on nat iptables -t nat -A POSTROUTING -s 192.168.31.0/24 -o eth0 -j SNAT --to-source 1.2.3.4 iptables -t filter -A FORWARD -s 192.168.31.0/24 -j ACCEPT # N'oubliez pas le net.ipv4.ip_forward=1 :)
Pour fixer le problème de mtu/mss que j'ai eu (voir ici ou là), j'ai simplement fixé la mtu à 1468 sur les interfaces gre et modifié la mss coté OVH à 1420 et je n'ai plus de problèmes, pour tester le problème et sa résolution essayez le site de rue89 par exemple :).
# mtu FreeBSD ifconfig gre0 mtu 1468 # mtu Linux ip link set grehome mtu 1468 # mss Linux iptables -t filter -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1420
Le problème suivant c'est l'IP dynamique obligatoire (à 17€ l'IP fixe je considère que c'est obligatoire). Mon serveur chez ovh gère ma zone dns (philpep.org), donc chez moi sur ma box FreeBSD j'ai un programme qui lance nsupdate pour mettre à jour mon IP (avec un TTL de 5 minutes). Ensuite j'ai un démon coté ovh qui requête régulièrement le serveur DNS et qui remet en place le tunnel gre quand ça change.
Voilà, c'est quand même désobligeant d'avoir à faire ça (même si c'est marrant du point de vue technique), Orange est vraiment un FAI à éviter, mais quand c'est le seul qui propose la fibre chez vous cette technique permet d'avoir un semblant de vrai 100Méga.
Mon chti blog >> Welcome ml150
dsx@ml150>sysctl hw.model hw.ncpu hw.physmem kern.disks hw.model: Intel(R) Xeon(R) CPU 5110 @ 1.60GHz hw.ncpu: 4 hw.physmem: 2125123584 kern.disks: da1 da0 ada1 ada0 dsx@ml150>zpool list NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT zroot 696G 1.84G 694G 0% 1.00x ONLINE - zscsi 278G 2.55G 275G 0% 1.00x ONLINE -
FreeBSD 9.0, ZfsOnRoot, poudriere et pkgng sont de la partie. J'en profite pour remercier bapt pour tout son travail qui rend FreeBSD si beau, si poilu, si soyeux.
Des petits nouveaux ont fait leur appartition:
- zail: jail but zfs
- orke: un blog statique en markdown, awk, shell
- mohawk2: l'utilisation de la libevent2 et une profonde réécriture justifient ce changement de majeur
Installation
J'ai suivi cet excellent article en simplifiant le découpage (étape 6). Parfois on en vient à se demander à quoi peut bien servir un installeur :)
Configuration
Comme d'habitude, je vais user (et abuser) des jails. Une ipv4, un block ipv6/64, une jail par service (ns, smtp, proxy, www), un /etc/pf.conf pour contrôler le tout.
poudriere et pkgng
Après quelques semaines d'utilisation, plus question de me passer de ce duo de choc ! L'un construit les 'packages', l'autre les installe. Le tout est clairement expliqué ici. Pour ma part, je n'ai pas installé l'arbre des ports, j'ai récupéré le tgz de poudriere:
- se logguer en anonymous sur http://fossil.etoilebsd.net/poudriere
- cliquer sur 'Files'
- cliquer sur le lien entre crochets (par exemple [9879991a62])
- cliquer sur le lien 'Tarball'
poudriere étant composé de scripts shell, un simple make install fait l'affaire. Je ne vais pas détailler le contenu de /usr/local/etc/poudriere.conf ni celui de /root/etc/poudriere_ports.conf (qui contient uniquement la liste des packages à générer).
Une fois l'arbre des ports (poudriere ports -c) et la jail (poudriere jails -c -j 90amd64 -v 9.0-RELEASE -a amd64) créés, on peut commencer la construction de nos packages. Le premier sera bien évidemment pkgng :) Il suffit de ne préciser aucune option dans /usr/local/etc/poudriere.d/90amd64-make.conf, d'avoir un /root/etc/poudriere_ports.conf comportant une seule entrée:# cat /root/etc/poudriere_ports.conf ports-mgmt/pkgng # poudriere ports -u # poudriere bulk -f /root/etc/poudriere_ports.conf -j 90amd64 # pkg_add /poudriere_data/packages/90amd64-default/Latest/pkng.tbzNotre hôte est désormais pkgngisé. Garder une copie de /poudriere_data/packages/90amd64-default/Latest/pkng.tbz peut être utile (pour installer pkgng sur une autre machine ou dans une jail par exemple). On peut enfin préciser que tous nos packages seront au format pkng:
# echo 'WITH_PKGNG' >> /usr/local/etc/poudriere.d/90amd64-make.confL'hôte doit se mettre à jour à partir de /poudriere_data/packages/90amd64-default:
# echo 'packagesite: file:///poudriere_data/packages/90amd64-default' >> /usr/local/etc/pkg.confIl est temps de passer aux choses sérieures:
# cat /root/etc/poudriere_ports.conf ports-mgmt/pkg ports-mgmt/poudriere security/sudo sysutils/tmux editors/vim-lite net/rsync dns/nsd dns/dnsmasq devel/libevent2 devel/fossil www/nginx mail/dovecot2 mail/dovecot2-pigeonhole # poudriere ports -u # poudriere bulk -f /root/etc/poudriere_ports.conf -j 90amd64 # pkg update # pkg upgradePour mettre à disposition tous ces beaux packages, il nous faut un serveur http léger, performant, à la syntaxe claire (oui je prosel et alors ?)
# cat /home/dsx/etc/poudriere.mohawk
mime_type {
bz2 application/x-bzip2
gz application/x-gzip
gzip application/x-gzip
tar application/x-tar
tgz application/x-compressed
xz application/x-compressed
zip application/x-compressed
}
vhost default {
listen on lo1
rootdir /poudriere_data/packages/90amd64-default
}
Jails
Je n'étais pas très content de mk_template et mk_jail. Bienvenue à zail (jail but zfs, à prononcer avec un cheveu sur la langue ou un poil dans la main), un script sans prétention mais qui fait le travail:
- création d'un ou plusieur dataset zfs
- détar de base.txz
- configuration minimale
- snapshot du ou des datasets
- clone du ou des datasets
- configuration minimale
# ./zail template -f zail.conf [ snip création template mode debug ] # ./zail template -f zail.conf -D [ snip création du template ] # ./zail jail -f zail.conf -n www [ snip création jail 'ww' basée sur le template zail.conf mode debug ] # ./zail jail -f zail.conf -n www -D [ snip création de la jail ]
- dns: toujours le couple nsd pour bsdsx.fr et dnsmasq pour les jails
- smtp/imap: toujours le couple sendmail/dovecot
- proxy: nginx, what else ?
- www: mohawk, what else ?
Bien sûr, toutes ces jails sont pkgngisées :)
Blog
L'idée m'est venue alors que je codais zail. Du statique, pas (encore) de commentaires, minimaliste. Les plus curieux jetteront un oeil à l'archive. Le principe est assez simple:
- un répertoire racine comprenant tous les fichiers de l'archive
- un sous répertoire 'src', comprenant les sources des billets au format 'markdown'
- un sous répertoire 'document_root', créé par 'orke'
###### YYYYMMDDhhmm tag1 tag2 ... tagn # Titre du billet
Mohawk
Grande nouveauté: la dépendance à libevent2. Ce choix a été motivé par le fait d'être un peu plus portable et de simplifier le code de gestion des évènements (qui n'était pas un modèle du genre dans mohawk 1). Un autre logiciel partage cette dépendance: tmux. Cette nouvelle version amène son lot d'amélioration: listen par vhost, clone de vhost etc. Je ne détaille pas plus, je dois mettre à jour le site web.
Conclusion
J'espère que cette nouvelle machine me rendra autant de bons et loyaux services que ce vénérable kimsufi. Je souhaite 'bon vent, belle mer'.
Update: merci bapt pour toutes les remarques :) J'espère avoir tout fixé.
Update 2: bapt vient de simplifier le téléchargement de poudriere: poudriere current
GCU-Squad! >> [GCUitter] Bim!
Si toi aussi tu veux construire ton château fort avec tes paquets, voici un plan du pont-levis.
http://home.nuug.no/~peter/pf/bsdcan2012/ proposé par twisla
Mon chti blog >> Au revoir kimsufi
D'ici 7 jours, je quitterai mon valeureux kimsufi. Que soient ici remerciés son disque dur, son processeur Celeron et son giga de ram qui, pendant plus de 3 ans, ne m'ont jamais trahi. Petite pensée particulière à la jail devel sans qui mohawk n'aurait pas vu le jour.
La semaine à suivre ne sera pas un modèle de haute disponibilité, d'avance toutes mes excuses. L'aventure continue avec ml150, orke, zail et un nouveau mohawk gonflé à bloc.
