{"id":284,"date":"2009-01-14T15:24:50","date_gmt":"2009-01-14T14:24:50","guid":{"rendered":"http:\/\/blog.guiguiabloc.fr\/?p=284"},"modified":"2009-01-30T23:52:51","modified_gmt":"2009-01-30T22:52:51","slug":"switch-applicatif-avec-openbsd-un-alteon-a-la-maison","status":"publish","type":"post","link":"http:\/\/blog.guiguiabloc.fr\/index.php\/2009\/01\/14\/switch-applicatif-avec-openbsd-un-alteon-a-la-maison\/","title":{"rendered":"Switch applicatif avec OpenBSD, un Alt\u00e9on \u00e0 la maison ?&#8230;"},"content":{"rendered":"<p>Dans une infrastructure informatique sensible, la disponiblit\u00e9 des applicatifs est primordiale.<\/p>\n<p>Pour r\u00e9pondre \u00e0 cette exigence, les solutions mises en oeuvre se basent donc sur de la haute-disponibilit\u00e9 et de l&rsquo;\u00e9quilibrage de charge (commun\u00e9ment appel\u00e9 LoadBalancing).<\/p>\n<p>J&rsquo;avais d\u00e9j\u00e0 \u00e9voquer la haute-disponibilit\u00e9 sous Linux dans <a title=\"Cluster Haute-Disponibilit\u00e9 chez OVH, avec IpFailover, Heartbeat et DRBD via IPSEC\" href=\"http:\/\/blog.guiguiabloc.fr\/index.php\/2008\/10\/17\/cluster-haute-disponibilite-chez-ovh-avec-ipfailover-heartbeat-et-drbd-via-ipsec\/\" target=\"_blank\">ce billet<\/a> et abord\u00e9 ce type d&rsquo;architecture dans <a title=\"Haute-Disponibilit\u00e9 de fermes Apache et Tomcat\" href=\"http:\/\/blog.guiguiabloc.fr\/index.php\/2008\/07\/04\/haute-disponibilite-de-fermes-apache-et-tomcat\/\" target=\"_blank\">celui ci<\/a>.<\/p>\n<p>Je vais donc aller un peu plus loin dans ce concept et tenter de mettre en oeuvre un \u00e9quivalent \u00ab\u00a0open-source\u00a0\u00bb d&rsquo;un produit commercial.<\/p>\n<p>Ceux qui d&rsquo;entre vous travaillent ou ont travaill\u00e9 dans ce genre d&rsquo;environnement, doivent avoir de fortes chances d&rsquo;avoir croiser dans les baies des boitiers \u00ab\u00a0Alteons\u00a0\u00bb.<\/p>\n<div id=\"attachment_285\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2009\/01\/alteons.jpg\"><img aria-describedby=\"caption-attachment-285\" loading=\"lazy\" class=\"size-medium wp-image-285\" title=\"alteons\" src=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2009\/01\/alteons-300x225.jpg\" alt=\"(merci \u00e0 Morgan pour les Alt\u00e9ons :-)))\" width=\"300\" height=\"225\" \/><\/a><p id=\"caption-attachment-285\" class=\"wp-caption-text\">(merci \u00e0 Morgan pour les Alt\u00e9ons :-)))<\/p><\/div>\n<p>Alteon WebSytems est une soci\u00e9t\u00e9 am\u00e9ricaine sp\u00e9cialis\u00e9e dans la haute-disponibilit\u00e9 et <a title=\"Rachat Alteon\" href=\"http:\/\/www.nortel.com\/corporate\/news\/newsreleases\/2000c\/10_05_0000660_alteon_closing.html\" target=\"_blank\">rachet\u00e9e par Nortel<\/a> fin 2000.<\/p>\n<p>Les produits s&rsquo;appellent d\u00e9sormais AS (pour Application Switch) et vous trouverez un comparatif des boiboites <a title=\"Comparatif AS\" href=\"http:\/\/products.nortel.com\/go\/product_assoc.jsp?segId=0&amp;parId=0&amp;catId=null&amp;rend_id=20021&amp;contOid=100169591&amp;prod_id=37160&amp;locale=en-US\" target=\"_blank\">ICI<\/a>, mais par facilit\u00e9, le terme \u00ab\u00a0Alteon\u00a0\u00bb est toujours employ\u00e9.<\/p>\n<p>Sachez que chez CISCO \u00e9galement il existe ce genre de solution (ACE).<\/p>\n<p>Je ne rentrerais pas dans les arcanes d&rsquo;un alt\u00e9on mais en voir rapidement le principe et d&rsquo;en construire un \u00e9quivalent chez soi.<\/p>\n<p>Globalement, le principe est le suivant :<\/p>\n<div id=\"attachment_288\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2009\/01\/nd3art13.gif\"><img aria-describedby=\"caption-attachment-288\" loading=\"lazy\" class=\"size-medium wp-image-288\" title=\"nd3art13\" src=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2009\/01\/nd3art13-300x155.gif\" alt=\"(source image IBM)\" width=\"300\" height=\"155\" \/><\/a><p id=\"caption-attachment-288\" class=\"wp-caption-text\">(source image IBM)<\/p><\/div>\n<p>La configuration se fait sur 4 points principaux donc je vais vous d\u00e9tailler la configuration ci-dessous.<\/p>\n<p>Il s&rsquo;agit d&rsquo;une configuration de base pour un loadbalancing en haute-dispo sur 2 serveurs web.<\/p>\n<p>Sp\u00e9cial grand Merci \u00e0 Steven pour son aide sur l&rsquo;Alteon \ud83d\ude00<\/p>\n<p>1 &#8211; Les serveurs r\u00e9els<\/p>\n<p>Il s&rsquo;agit des applications \u00e0 \u00ab\u00a0load balancer\u00a0\u00bb.<\/p>\n<pre lang=\"text\">\/cfg\/slb\/real 1\r\nenable\r\nrip aa.bb.cc.dd     #l'ip du serveur r\u00e9el 1\r\nretry 2     #nombre d'essai avant de consid\u00e9rer le serveur comme down\r\nrestr 2     #nombre d'essai avant de consid\u00e9rer le serveur comme up\r\ninter 15     #intervalle entre 2 checks en secondes\r\nname lenom\r\n\/cfg\/slb\/real 2\r\nenable\r\nrip aa.bb.cc.ee\r\nretry 2\r\nrestr 2\r\ninter 15\r\nname lenom<\/pre>\n<p>2 &#8211; Le groupe<\/p>\n<p>On regroupe ensuite les applications \u00e0 \u00ab\u00a0load balancer\u00a0\u00bb au sein d&rsquo;un m\u00eame groupe. Le groupe comprend les Real Servers ainsi que le \u00ab\u00a0jeu\u00a0\u00bb de test permettant de v\u00e9rifier leur bon \u00e9tat.<\/p>\n<pre lang=\"text\">cfg\/slb\/group 1\r\nhealth http     #service concern\u00e9e, ici http mais peut \u00eatre : link|arp|icmp|tcp|http|httphead|dns|pop3|smtp|\r\nnntp|ftp|imap|sslh|radius-auth|radius-acc|radius-aa|script|udpdns|wsp|wtp|wtls|ldap|snmp|tftp|rtsp|sip|wts|dhcp\r\nviphl disable     #d\u00e9sactive le check VIP li\u00e9 au DSR (Direct Server Return)\r\ncontent \"\/status.html\"     #la page a checker\r\nadd 1     #ajout du serveur r\u00e9el 1 dans le groupe\r\nadd 2     #ajout serveur 2 dans le groupe\r\nname lenomdugroupe<\/pre>\n<p>3 &#8211; Le virtual server<\/p>\n<p>Un Virtual Server se caract\u00e9rise par son adresse virtuelle (VIP), son port d&rsquo;\u00e9coute virtuel (service), le groupe de Real server auquel il est associ\u00e9 et les ports d&rsquo;\u00e9coute des Real Servers<\/p>\n<pre lang=\"text\">\/cfg\/slb\/virt 1\r\nenable\r\nvip 10.1.1.1\r\n\r\n\/cfg\/slb\/virt 1\/service 80\r\ngroup 1\r\nhname lenom\r\nepip ena     #on force la s\u00e9lection par egress ou VLAN<\/pre>\n<p>4 &#8211; le virtual router<\/p>\n<p>Le routeur virtuel qui contient la VIP, le  groupe, l&rsquo;interface physique et la priorit\u00e9 par rapport \u00e0 son \u00ab\u00a0voisin\u00a0\u00bb.<\/p>\n<pre lang=\"text\">\/cfg\/l3\/vrrp\/vr 1 (avec le chiffre \u00e9gale au virt associ\u00e9)\r\nena\r\nvrid n     # le numero du Virtual Routeur\r\nif 1     # l'interface\r\nprio 99     #la priorit\u00e9 (plus le chiffre est haut plus l'at\u00e9on est prioritaire par rapport a l'alt\u00e9on de backup)\r\naddr 10.1.1.1     #la VIP\r\nshare dis     #on d\u00e9sactive l'extension Nortel VRRP<\/pre>\n<p>Un dessin valant toujours mieux qu&rsquo;un long discours \ud83d\ude09 , nous allons imaginer l&rsquo;architecture suivante :<\/p>\n<ul>\n<li>2 Alt\u00e9ons<\/li>\n<li>1 VLAN d\u00e9di\u00e9 aux IP loadbalanc\u00e9es en 10.0.0.0\/24<\/li>\n<li>1 VLAN d\u00e9di\u00e9 aux serveurs Web en 192.168.1.1\/24<\/li>\n<li>2 serveurs Web<\/li>\n<\/ul>\n<p>C&rsquo;est forc\u00e9ment simplifi\u00e9 au maximum mais cela donne une id\u00e9e de ce que nous allons mettre en place.<\/p>\n<p>Avec des \u00ab\u00a0Alt\u00e9ons\u00a0\u00bb, nous aurions donc ce genre de sch\u00e9ma :<\/p>\n<div id=\"attachment_294\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2009\/01\/schemaalteon.jpg\"><img aria-describedby=\"caption-attachment-294\" loading=\"lazy\" class=\"size-medium wp-image-294\" title=\"schemaalteon\" src=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2009\/01\/schemaalteon-300x217.jpg\" alt=\"Sh\u00e9matisation Alteon\" width=\"300\" height=\"217\" \/><\/a><p id=\"caption-attachment-294\" class=\"wp-caption-text\">Sh\u00e9matisation Alteon<\/p><\/div>\n<p>Le but \u00e9tant de reproduire a peu pr\u00e8s la m\u00eame chose chez soi, il y a un syst\u00e8me d&rsquo;exploitation qui contient d\u00e9j\u00e0 tout ce qu&rsquo;il faut pour cela : <a title=\"OpenBSD\" href=\"http:\/\/www.openbsd.org\/fr\/\" target=\"_blank\">OpenBSD<\/a>.<\/p>\n<p>Alors, oui, on pourrait faire la m\u00eame chose avec Linux, en se tapant l&rsquo;installation d&rsquo;<a title=\"ucarp\" href=\"http:\/\/www.ucarp.org\" target=\"_blank\">Ucarp<\/a>, <a title=\"Balance\" href=\"http:\/\/www.inlab.de\/balance.html\" target=\"_blank\">Balance<\/a>, <a title=\"LVS\" href=\"http:\/\/www.linuxvirtualserver.org\/\" target=\"_blank\">LVS<\/a> et\/ou autres joyeuset\u00e9s, mais personnellement, je pr\u00e9f\u00e8re laisser cela a <a title=\"OpenBSD\" href=\"http:\/\/www.openbsd.org\/fr\/\" target=\"_blank\">OpenBSD<\/a> qui peut le faire nativement et qui a fait ses preuves en environnement r\u00e9seau critique.<\/p>\n<p>Apr\u00e8s tout, <a title=\"OpenBSD\" href=\"http:\/\/www.openbsd.org\/fr\/\" target=\"_blank\">OpenBSD<\/a> est amour, avec du poil autour, et c&rsquo;est tout.<\/p>\n<p>Reprenons notre sch\u00e9ma et adaptons le \u00e0 une solution bas\u00e9e sur 2 serveurs sous OpenBSD pour remplacer les \u00ab\u00a0Alt\u00e9ons\u00a0\u00bb :<\/p>\n<div id=\"attachment_295\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2009\/01\/schemapuffy.jpg\"><img aria-describedby=\"caption-attachment-295\" loading=\"lazy\" class=\"size-medium wp-image-295\" title=\"schemapuffy\" src=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2009\/01\/schemapuffy-300x234.jpg\" alt=\"Sch\u00e9matisation OpenBSD\" width=\"300\" height=\"234\" \/><\/a><p id=\"caption-attachment-295\" class=\"wp-caption-text\">Sch\u00e9matisation OpenBSD<\/p><\/div>\n<p>Ne reste qu&rsquo;a configurer tout cela \ud83d\ude00<\/p>\n<ul>\n<li>CARP + VLAN (optionnel)<\/li>\n<\/ul>\n<p>D\u00e9finir une VIP sur nos OpenBSD (une interface CARP sur interface physique ou sur interface VLAN)<\/p>\n<pre lang=\"text\">\/etc\/sysctl.conf\r\n\r\nnet.inet.carp.preempt=1\r\nnet.inet.carp.allow=1\r\n\r\n#ifconfig carp0 create\r\n\r\n#ifconfig carp0 vhid 1 pass motdepasse carpdev em0 advskew 1 10.0.0.1 netmask 255.255.255.0\r\n\r\nPour un VLAN (exemple):\r\ncat \/etc\/hostname.vlan3\r\ninet 10.0.0.3 255.255.255.0 vlan 3 vlandev em0\r\n\r\ncat \/etc\/hosname.carp0\r\ninet 10.0.0.1 255.255.255.0 10.0.0.255 vhid 1 carpdev vlan3 advskew 1 pass motdepasse<\/pre>\n<p>Je ne m&rsquo;attarde pas la dessus, en ayant d\u00e9j\u00e0 parler sur <a title=\"explication CARP\" href=\"http:\/\/blog.guiguiabloc.fr\/index.php\/2008\/03\/21\/anatomie-dune-architecture-4\/\" target=\"_blank\">CE BILLET<\/a>.<\/p>\n<ul>\n<li>PFSYNC<\/li>\n<\/ul>\n<pre lang=\"text\">ifconfig pfsync0 syncpeer \"ip openbsd en face\" syncdev em1\r\nifconfig pfsync0 up<\/pre>\n<ul>\n<li>Partie PF \/ Hoststated<\/li>\n<\/ul>\n<pre lang=\"text\">\/etc\/pf.conf\r\n\r\nrdr-anchor \"hostatetd\/*\"\r\n\r\ntable  persist { 192.168.1.1, 192.168.1.2 }\r\n\r\nrdr on $carp0 from any to $ipcarp port 80 -&gt;  round-robin sticky-address\r\n\r\n# la variable sticky-address signifie que PF maintient la session du client sur le m\u00eame serveur\r\n\r\n\/etc\/hoststated.conf\r\n\r\nreal1=\"192.168.1.1\"\r\nreal2=\"192.168.1.2\"\r\nvip=\"10.0.0.1\" # VIP CARP\r\n\r\ninterval 5 #on v\u00e9rifie l'\u00e9tat des serveurs toutes les 5 secondes\r\n\r\ntable messerveurs {\r\ncheck http \"\/status.html\" code 200\r\ntimeout 300\r\nreal port 80\r\nhost $real1\r\nhost $real2\r\n}\r\n\r\nservice www {\r\nvirtuel ip $vip port 80\r\ntable messerveurs\r\n}<\/pre>\n<p>Petite explication :<\/p>\n<p>On utilise une table \u00ab\u00a0messerveurs\u00a0\u00bb qui contient la liste des serveurs \u00e0 \u00ab\u00a0loadbalancer\u00a0\u00bb.<br \/>\nPF redirige les requ\u00e8tes entrantes sur la VIP (10.0.0.1) alternativement (round-robin) et maintient la session du client sur le m\u00eame serveur (sticky-address).<br \/>\nBien \u00e9videmment, tout cela est optionnel et \u00e0 vous d&rsquo;adapter selon vos applis (man pf \ud83d\ude09 ).<\/p>\n<p>Le d\u00e9mon Hoststated v\u00e9rifie que les serveurs r\u00e9els sont bien vivants en appelant la page status.html sur chacun des serveurs de sa liste.<br \/>\nEn cas de non r\u00e9ponse (code retour http diff\u00e9rent de 200), il consid\u00e9rera le serveur comme down et le retirera de la table \u00ab\u00a0messerveurs\u00a0\u00bb.<\/p>\n<p>C&rsquo;est pas beau tout cela ? \ud83d\ude00<\/p>\n<p>La commande # hoststatectl show vous donnera l&rsquo;\u00e9tat des serveurs et vous pouvez manuellement les sortir ou les remettre dans le pool (# hoststatectl host disable\/enable 192.168.1.x).<\/p>\n<p>Et petit bonus, vous pouvez agir directement sur la couche 7 \ud83d\ude09<\/p>\n<p>Exemple de relais load-balanc\u00e9 HTTPS :<\/p>\n<pre lang=\"text\">protocol monchteuteupeucrypte {\r\nprotocol http\r\nheader append \"$REMOTE_ADDR\" to \"X-Forwarder-For\"\r\nheader append \"$SERVER_ADDR:$SERVER_PORT\" to \"X-Forwarder-By\"\r\nheader change \"Keep-Alive\" to \"$TIMEOUT\"\r\nurl hash \"sessid\"\r\ncookie hash \"sessid\"\r\npath filter \"*command=*\" from \"\/cgi-bin\/index.cgi\"\r\n\r\nssl { sslv2, ciphers \"MEDIUM:HIGH\" }\r\ntcp { nodelay, sack, socket buffer 65536, backlog 128 }\r\n}\r\n\r\nrelay wwwssl {\r\nlisten on $vip port 443 ssl\r\nprotocol monchteuteupeucrypte\r\ntable messerveurs loadbalance\r\n}<\/pre>\n<p>Maintenant que je vous ai titill\u00e9 avec tout cela, je vous invite, outre \u00e0 manger les MAN d&rsquo;OpenBSD, mais aussi \u00e0 lire cet excellent ouvrage :<\/p>\n<p>The Book of PF<br \/>\nA No-Nonsense Guide to the OpenBSD Firewall<br \/>\nPar Peter N.M. Hansteen<\/p>\n<p>Vous le trouverez chez Amazon par exemple :<br \/>\n<a title=\"pf\" href=\"http:\/\/www.amazon.fr\/Book-PF-No-nonsense-Guide-Firewall\/dp\/1593271654\" target=\"_blank\"> http:\/\/www.amazon.fr\/Book-PF-No-nonsense-Guide-Firewall\/dp\/1593271654<\/a><\/p>\n<p><strong>Conclusion<\/strong> :<\/p>\n<p>Loin de moi l&rsquo;id\u00e9e de vous dire qu&rsquo;une architecture comme celle-ci sera tout aussi efficace qu&rsquo;un Switch Applicatif hors de prix, il existe des fonctions sur ces boitiers que l&rsquo;on peut \u00e9videmment reproduire mais qui demanderons du temps&#8230;<\/p>\n<p>Par contre, ce type d&rsquo;architecture n&rsquo;a pas a rougir en Production pour load-balancer des applications se pr\u00e9tant \u00e0 ce jeu.<\/p>\n<p>Amusez vous bien \ud83d\ude09<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dans une infrastructure informatique sensible, la disponiblit\u00e9 des applicatifs est primordiale. Pour r\u00e9pondre \u00e0 cette exigence, les solutions mises en oeuvre se basent donc sur de la haute-disponibilit\u00e9 et de l&rsquo;\u00e9quilibrage de charge (commun\u00e9ment appel\u00e9 LoadBalancing). J&rsquo;avais d\u00e9j\u00e0 \u00e9voquer la &hellip; <a href=\"http:\/\/blog.guiguiabloc.fr\/index.php\/2009\/01\/14\/switch-applicatif-avec-openbsd-un-alteon-a-la-maison\/\">Read More <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[27,6,16],"tags":[94,223],"_links":{"self":[{"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/posts\/284"}],"collection":[{"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/comments?post=284"}],"version-history":[{"count":19,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/posts\/284\/revisions"}],"predecessor-version":[{"id":308,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/posts\/284\/revisions\/308"}],"wp:attachment":[{"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/media?parent=284"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/categories?post=284"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/tags?post=284"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}