From 556d1a50b1aae2eacff12fb1766d96135d1b4226 Mon Sep 17 00:00:00 2001 From: Pierre Coimbra Date: Fri, 21 Feb 2020 00:53:02 +0100 Subject: [PATCH] =?UTF-8?q?Partie=20R=C3=A9seau?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 +- presentation_projet.md | 14 +-- reseau/README.md | 7 ++ reseau/introduction_ovs.md | 10 +++ reseau/{infra_reseau.md => mise_en_place.md} | 88 +++++-------------- reseau/schema_global.png | Bin 70264 -> 0 bytes reseau/topologie_globale.md | 23 +++-- reseau/topologie_reseau_physique.md | 9 ++ reseau/topologie_reseau_virtuel.md | 46 ++++++++++ 9 files changed, 116 insertions(+), 89 deletions(-) create mode 100644 reseau/introduction_ovs.md rename reseau/{infra_reseau.md => mise_en_place.md} (55%) delete mode 100644 reseau/schema_global.png create mode 100644 reseau/topologie_reseau_physique.md create mode 100644 reseau/topologie_reseau_virtuel.md diff --git a/README.md b/README.md index de2c505..1958588 100644 --- a/README.md +++ b/README.md @@ -28,10 +28,10 @@ charge de former leur successeurs. 5. [Haute Disponibilitée](#) 6. [Gestion de l'authentification](#) 3. [Réseau](reseau) - 1. [Introduction à OpenvSwitch](#) - 2. [Topologie du réseau matériel](#) - 3. [Topologie du réseau virtuel](#) - 4. [Mise en place du réseau](#) + 1. [Introduction à OpenvSwitch](reseau/introduction_ovs.md) + 2. [Topologie du réseau matériel](reseau/topologie_reseau_physique.md) + 3. [Topologie du réseau virtuel](reseau/topologie_reseau_virtuel.md) + 4. [Mise en place du réseau](reseau/mise_en_place.md) 4. [Applicatif](applicatif) 1. [Répartition des services dans les zones](#) 2. [Zone WAN](#) diff --git a/presentation_projet.md b/presentation_projet.md index e5b5208..4394829 100644 --- a/presentation_projet.md +++ b/presentation_projet.md @@ -2,9 +2,9 @@ ### Infrastructure matérielle -Du côté infrastructure, nous disposons d'un rack 1U avec deux PC à l'intérieur possédant chacun 24Go de DDR3-ECC et un Xeon x5670 6 Coeurs cadencé à 2.93 GHz. Côté stockage, nous allons mettre en place un RAID1 ZFS avec deux disque par PC (les données du premier disque seront copiées sur le second) ainsi le stockage sera répliqué pour éviter toute perte de données. +Du côté infrastructure, nous disposons d'un rack 1U avec deux PC à l'intérieur possédant chacun 24Go de DDR3-ECC et un Xeon x5670 6 Coeurs cadencé à 2.93 GHz. Côté stockage, nous allons mettre en place un RAID1 ZFS avec deux disque par PC (les données du premier disque seront aussi présente sur le second) ainsi le stockage sera répliqué pour éviter toute perte de données. -Les 2 nodes du serveurs, que nous appellerons Alpha et Beta, auront Proxmox comme hyperviseur et seront en cluster grâce à Proxmox. Pour plus de détails sur Proxmox ce référer à la partie Proxmox. +Les 2 nodes du serveurs, que nous appellerons Alpha et Beta, auront Proxmox comme hyperviseur et seront en cluster grâce à Proxmox. ### Infrastructure logicielle @@ -13,7 +13,7 @@ Les containers/VMs sensibles seront répliqués entre les deux nodes L'infrastructure réseau du club s'articulerait de la manière suivante (sur chaque node) : - OPNSense qui servira de Firewall de routeur. -- HAProxy qui servira de loadbalanceur entre les reverses proxy +- HAProxy qui servira de loadbalanceur entre les reverses proxy. - NGINX qui fera office de reverse proxy entre HAProxy et les serveurs web autre que ceux des environnements CTF. - Uniquement sur Beta, un reverse proxy NGINX qui servira de reverse proxy entre HAProxy et l'environnement CTF. @@ -36,7 +36,7 @@ L'objectif est de remplacer la banque de challenge du club stockée actuellement L'infrastructure CTF du club s'organisera de la manière suivante : - Un premier CTFd avec tous les challenges actuels du club utilisés pour les OpenCTF. -- Un autre CTFd que nous utiliserons pour les sessions en externe comme par exemple pour la session 0 ou il n'y a ni classement ni challenge récurrent. +- Un autre CTFd que nous utiliserons pour les sessions en externe comme par exemple pour la session 0. - Une VM avec différents environnements Docker temporaires pour les challenges système. - Une VM avec différents environnements Docker pour les challenges Web. @@ -44,6 +44,6 @@ L'infrastructure CTF du club s'organisera de la manière suivante : Pour la gestion en interne du serveur, nous nous organiserions de la manière suivante, -- Seulement deux personnes du bureau auront un accès total au serveur pour éviter tout problème d'administration. Les accès seront logés et les comptes nominatifs. -- Pour ce qui est de l'accès aux services web, tous les membres actifs du club y auront accès, mais seul le responsable technique et les personnes s'occupant du serveur auront les droits d'administration. -- Pour ce qui est de l'accès aux services CTF, seulement les responsables événements, technique et serveur y auront accès en tant qu'administrateurs, toutes les personnes participant à l'événement auront un accès à l'interface utilisateur du CTF, les accès à cette interface seront loggés. +- Seulement deux personnes du bureau auront le rôle d'administrateur système soit un accès total au serveur. Limiter le nombre d'administrateur système permet d'éviter tout problème d'administration. +- Le responsable technique aura le rôle du webmestre c'est à dire qu'il pourra intervenir sur les services comme le site web, le cloud... Cependant il ne pourra pas toucher à l'infrastructure réseau. +- Pour ce qui est de l'accès aux services web, tous les membres actifs du club y auront accès. diff --git a/reseau/README.md b/reseau/README.md index 25d09b6..8f4c267 100644 --- a/reseau/README.md +++ b/reseau/README.md @@ -1 +1,8 @@ # Réseau +Vous trouverez ici toute la documentation relative à l'infrastructure réseau. + +# Table des matières +1. [Introduction à OpenvSwitch](introduction_ovs.md) +2. [Topologie du réseau matériel](topologie_reseau_physique.md) +3. [Topologie du réseau virtuel](topologie_reseau_virtuel.md) +4. [Mise en place du réseau](mise_en_place.md) diff --git a/reseau/introduction_ovs.md b/reseau/introduction_ovs.md new file mode 100644 index 0000000..18b9cf4 --- /dev/null +++ b/reseau/introduction_ovs.md @@ -0,0 +1,10 @@ +# Introduction à OpenvSwitch + +Pour l'infrastructure réseau nous utiliserons OpenvSwitch. + +OpenvSwitch est une alternative aux bridges Linux classique. Il permet de créer des switchs (L2/L3) virtuel au seins de Proxmox qui peuvent communiquer entre eux via un lien trunk et qui gèrent très bien les VLANs. + +Explication rapide du fonctionnement global d'OpenvSwitch, +- OVS Bridge, c'est comme un switch, mais en virtualisé sur lequel on peu branché des CT et VM sur des VLANs et qui peux communiquer avec un autre Bridge via un tunnel GRE. Pour notre usage le bridge n'aura pas d'IP sur l'hôte. +- OVS Bond, permet d'attacher un groupe d'interface physique à un Bridge OVS ie. un groupe d'interface réseau à un switch virtuel. +- OVS IntPort, pas possible de bridge des VMs ou des CT dessus, il permet à l'hôte de se brancher au Bridge et d'avoir une IP et éventuellement une VLAN. diff --git a/reseau/infra_reseau.md b/reseau/mise_en_place.md similarity index 55% rename from reseau/infra_reseau.md rename to reseau/mise_en_place.md index a50d4b5..7df14a5 100644 --- a/reseau/infra_reseau.md +++ b/reseau/mise_en_place.md @@ -1,67 +1,11 @@ -# Réseau - -Chacune des nodes possède 4 interfaces réseau, pour des questions de redondance et de débit nous allons mettre 2 de ces interfaces en bond pour le réseau interne et la communication entre les deux serveurs. - -- eth0 sur une interface simple utilisé uniquement par OPNSense via wan -- eth2 formera le bridge OVS admin -- eth1 et eth3 formerons le bond OVS bond0 sur le bridge OVS interne - -Pour la gestion des bonds, vlans... nous utiliserons openvswitch - -Explication rapide du fonctionnement global d'OpenvSwitch, - -- OVS Bridge, c'est comme un switch, mais en virtualisé sur lequel on peu branché des CT et VM sur des VLANs et qui peux communiquer avec un autre Bridge via un tunnel VXLAN ou un tunnel GRE. Pour notre usage le bridge n'aura pas d'IP sur l'hôte. -- OVS Bond, permet d'attache un groupe d'interface physique à un Bridge OVS ie. un groupe d'interface réseau à un switch virtuel. -- OVS IntPort, pas possible de bridge des VMs ou des CT dessus, il permet à l'hôte de se brancher au Bridge pour avoir une IP et éventuellement une VLAN. - - -Pour chacune des zones (KRKN ou CTF) il y a deux types de VM/CT, - -- Ceux qui sont directement accessible depuis internet derrière OPNSense c'est les services frontend. -- Ceux qui sont accessible uniquement à travers une frontend c'est les services backend. - -## Les switchs virtuel - -- Un switch physique sur lequel sera branché les quatres interfaces des nodes et l'entité de quorum. -- Un switch Administation pour toute les tâches d'administration avec comme lien extérieur eth2 -- Un switch Interne qui devra gérer, avec des VLANs, l'accès (filtré) à internet des services qui ne sont pas directement derrière le FW (Nextcloud, Git, Serveur Web...) en séparant le tout en plusieurs zones et les services qui sont directement derrière le FW (HAProxy, Proxy des services, Mail et DNS). Avec comme lien extérieur un bond entre eth1 et eth3. - -## Communication des switchs entre les nodes - -Tout les hyperviseurs auront une pâte sur le VLAN 100 sur chaque switch pour le protocole GRE qui permet l'échange entre les switchs virtuel de chaque nodes. - -## Services Frontend - -Concrètement les containers concernés auront des ports d'entrée DNAT vers eux ce qui signifie qu'ils seront accessible depuis internet à travers le firewall. C'est le cas de HAProxy, des Mails, du serveur DNS et du Proxy des services. - -Tout ces CT auront obligatoirement une pâte sur la VLAN 10 et une VLAN backend du switch Interne. - -## Services Backend - -Les containers ou VMs concerné ne seront pas accessible depuis internet cependant certain seront accessible par l'intermédiaire de HAProxy (entre autres). - -Cette parti sera découpé en plusieures zones, -- ROUTE sur la VLAN 20 qui contiendra les reverses proxy public, -- KRKN sur la VLAN 30 qui contiendra tout les services de la partie krhacken, -- CTF sur la VLAN 40 qui contiendra le reverse proxy CTF et les environnement CTF, -- EXT sur la VLAN 50 qui contiendra les environnement de test. - -## Partie Internet - -Tout les containers et les VM Backend auront accès à internet via le proxy interne (en frontend). Pour cela ils auront tous une pâte sur la VLAN 80 du switch interne. - -## Partie Administration - -- Chaque hyperviseur ainsi que l'entité de Quorum aura une pâte sur la VLAN 10 du switch Administration pour le fonctionnement de Corosync. -- Toutes les VM, tout les CT, les hyperviseurs et l'entité de Quorum auront une pâte sur la VLAN 20 du switch Administration pour les tâches d'administration via le VPN ou localement en cas d'urgence. -- Chaque hyperviseur aura une pâte sur la VLAN 30 su switch Administration pour pfSync (HA du Firewall). - +# Mise en place du Réseau +Nous allons ici détaillé la configuration du réseau physique et virtuel. Il est préférable de lire la documentation sur leur topologie au préalable. ## Map des IPs principales. - +Voilà les IPs attribuées aux services principaux qu'il faut impérativement respecter. ### FrontEnd (Juste après le FW) - Firewall Alpha : 10.0.0.1 -- Firewall Bêta : 10.0.0.2 +- Firewall Beta : 10.0.0.2 - Firewall VIP : 10.0.0.3 - HAProxy Alpha : 10.0.0.4 - HAProxy Beta : 10.0.0.5 @@ -69,14 +13,13 @@ Tout les containers et les VM Backend auront accès à internet via le proxy int - Proxy Interne : 10.0.0.7 - Mail : 10.0.0.10 -### ROUTE (Juste après la frontend) +### PROXY (Juste après la frontend) - HAProxy Alpha : 10.0.1.1 - HAProxy Beta : 10.0.1.2 - Nginx Public Alpha : 10.0.1.3 - Nginx Public Beta : 10.0.1.4 - -### KRKN +### INT - LDAP Alpha : 10.0.2.1 - LDAP Bêta : 10.0.2.2 - LDAP VIP : 10.0.2.3 @@ -84,7 +27,6 @@ Tout les containers et les VM Backend auront accès à internet via le proxy int - Nginx Public Beta : 10.0.2.5 - [...] Voir DNS - ### CTF : - HAProxy Alpha : 10.0.3.1 - HAProxy Beta : 10.0.3.2 @@ -119,6 +61,20 @@ Tout les containers et les VM Backend auront accès à internet via le proxy int - [...] Voir DNS +# Réseau physique + +La configuration et les branchement à faire sur le switch sera détaillé plus tard. + +# Réseau virtuel +Cette partie consiste à mettre en place OpenvSwitch sur les deux nodes. + +## Installation +Commune aux deux nodes +``` +apt-get update +apt-get install openvswitch-switch +``` + ## Configuration de OpenvSwitch ### Pour Alpha (/etc/network/interfaces) @@ -168,7 +124,7 @@ iface interne inet manual up ovs-vsctl --may-exist add-port interne gre1 -- set interface gre1 type=gre options:remote_ip='10.0.4.2' down ovs-vsctl --if-exists del-port interne gre1 - + #Admin Task allow-admin admintask iface admintask inet static @@ -262,7 +218,7 @@ iface interne inet manual up ovs-vsctl --may-exist add-port interne gre1 -- set interface gre1 type=gre options:remote_ip='10.0.4.1' down ovs-vsctl --if-exists del-port interne gre1 - + #Admin Task allow-admin coro iface coro inet static diff --git a/reseau/schema_global.png b/reseau/schema_global.png deleted file mode 100644 index a4d7e63b542a2a2c2b8663b84661dc0dea0f6e18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70264 zcmZ^JbyQT{8!nwv(hVXFf=V|EQqrA6cQ-?WNJvS8bW080LpRbeba!{x#ZU46)?MrV z!K}qO`|SO^&zt+*J6KLe3=M?{1quoZO+s8m0SXGP3TlPPV?M!y;+3?7+f9S*A}L^6nVWlb6a(|rZqJL>j=t5 ztzM8_9y?@IFXGotoLC{Jp$-fMyD+4sT^VQ`Mn5<&qT^&%Rzh^E{V|5_Nf!yfT;?sB z+{+|ye%x?ESvbb=f7A-~@z7kDJUzW5Nw*Px0Iqw5c`*v=pD|xS1WmpG^b-Z&u5_j~ zEswEuw?`cBZ~C@J5KdomUR?FH9|{YYOgLOL)RVo(8b}MNZ+!@flp*=THy2?<7LeAl zYfl~~=6Um;(47C2kT2I}p{LJI;AXu+&}(sXn^rNjy7yDF;$*c;ojz#=!} z*EXlgcNlL0H!02*K!of~S{lkX1#188uXW`u522SYsjdah8Rz&A2c`JDOIu>k>!2w0 z_c{zcC}3qTD6jX@^i>*Z!(-u`jIAkWC}0JsH9wE)BTZ|SnG^jO!toxeGMsiKuzZCT zY|XHi8z57z|9Mtl6grE zWX9YE0z;6XVVyGp(Ky`TfpsdG;BIy>oI;`sXFH+G3g@`V_ApL1+fX-7vAQr~WYX1N zS60!sI^Um1pm&}#+thZRx4QgToMO8oL7Qg3W0v>WGecY0%>N(^xudmkexGyN7g1z4 z9(&@1%)%wnM@U$))$1ycKxe8rn7U)YW+cPyo-~5fn_#G5J$KSaKp#4*$@3s~@X#~o z9m5&F^YnA;lIS2g|0uda^7EG8#yhHtI`s#qfek)Gu59{kcm(@v{J@F(acMaH;x4~C zlG~~GeSKCD0xHVU;R&CX_sgBlJmUmpWF5{(s8&<=G|o8OW!H|U=45SX_sL`ccJ{`H zv=Mk87&+dvU?fV=uH$wk$N9I|hH2-`)}?~`T+ywxWjN3g0al?BNE}lArZ9&?N4u3V z=-(u8r+BTDAalVVq>pQ(C*6pe!?(DK_uH9XAoj7SY)B}Oxp&$5I2uE$**`!e%ie2n zqe=49Gvn`s$L#{031U*yP^0z>4ubV@7pS<9(FJ6sa^hAsfnP4rDcP7O`ln z57eIz3yl-DRY9J0*m#i*K^NugPeNv(^p86Lt3TXD%f!8DPI`z-~}sUwzy!TLJELqiri^*l=E@wiCj z(9MHP$IfBZ2eVS&9}U^=m!qX76YJ6Y88=gnRfYGVI-}WNoyoLZj?Ak&`8GB9sq=i; zZSzJc`e{(i%7xeQhhiMz%V3t2O(X zOStF@X(_vzI1YZWUQ{mX2NrjKHe5>7+TsdXBJ1!*NV=_sE`+L@Rim7!^$Yj*`b^l? zy6ea2Y{JL8>HCXM3~P%jRQgM;3xsrZ(U6h>n{j<}fAg$XGTXe|Y_h5EJPb@|hS|^@ z=FlzQDko>cK3Mquh!l>IkSJQm<u_PJf;ukZGg4ke45)&Ve z&h`k@Bewb|cDJjL{{hxTR>^Rh!8u=L#mFnDOG`>>q3|8TfUe%#=_6!5(cvCfCrr5M zZI_b`UOIOrZL)N2Fs4fwA+H0mSBQb7Qe=s#Jn<*q)bW@ za*ZZsJj+N7Hc_gtI^q*L3%ZLUGT3^_d0eR%byd2=D!oi>NO~B$EtNY^wX|~5A&5~W zk=r}cr#UKHom6T@O!3h9mbRiG_BZM1en!VJ^2LED;xxA9<9cQk?|taAeB8?p^v5SY zotdi0jNQ1Y%cjaQR6U*VD8Hu`uwe=gG(Nbmu?mGyY6}wEI@UbBt^EJWxA7n ziXKS{<8@Mun#U3~jiF#q|4~1sFcF&;f^7%UrH~>kN_OzpkcC1_rCi%<%tkGBG*_5_ z5)M5Enjx%(5_BLGSQgk19r@T;Fa!{cpjp=Tq-}7wTm=OTgw#mUd!LDY@=G|dqcOisD=2d9+8IwUW}D~ZTKe*5+X9Zc>26`tUJbT za@kM(51)OlGpV$K-A0yWid}dcFDPmeLQg8bvFP5@`?j7C##_v~RfsnoX1w8Jvh>NpN6|0j`2{JQnX< z2rOlB@4lBu8(ZWLoGe|jdaro#qNy){NOS(Y9@qtG$(_s`LTy^1p|dU zFH6yL#g)%i?N7vWj(4)Uj=1GWjT-OK6olW@QpbH^Mrpz(@!HbN4Jc5j!0uy`xanN6 z6HZNS*EKLKs}bUwM9etY(yPI5=syr*Mv)9@&+35oSR&%)&f87L7N%+x@~m$`)x6A? zIIU0NT4`Y0j!eL!cc@ZYwkhWzKjZ(BQfS~@h8Aoyj$KLCCI_IzR3y0<`g-|})t!R> z7a{Zu^$(8ULM&i6Gy)V;N>QjEgmQxUD2~cq8*-p2-!O#u!$z0xwcrLm$ckiAoTBSM zvxzllm43x8%RDdz!CGU%;lPQY`C%&H3Conf6mq-5;al+AT1wcu#?>8(;jnj1|1<+v z1BFw{8CHY5l`$a{K)i#L&(>LX_fiZ`<8>s~bg{dO5WA<)+>m||KqAf_x%pdVv%9k( zd5=@m-9@A>5dBILDVWS!b4YR$$wwD%m}+i&ZpUJDnt&)OAh4Z49s3(qke>AGmh9K^ zaJ%YQb!;t8LOoxIDxn6^($i;9G7!~&?v*lv{cYNWt~RYuXTVyv#~%cJpwE4{rrtrP z6MaVCdDXTNR6vK>LrIOFK$CG18djx63XlGZJqfxv5JHM^cnIlz@Y;}uRy{rASAn`q z>^C{A|1}%Lg=+hXc+60PUq8&gppt+A^TG9%BNCIufNvT<=i4{>Ukd%k>39$gaeu|+ z&u59gKGM_hAmC`RQIgmWcI?V=)OqzT@yC}a1jJ)T_cy@m^os2>t^6qj(P|ZIYWZb9 z@jJp-p;PN3gstI4QgWGF%moOfQoflzsmlwI3NBx;zv2yl8vCRnQbvAHAtQ%%L|Z9J zASkhfY#TdEQ@&-0ue&MI8~`nt`2rSyb_;_6r3oH)P@H9)N@SQfxWi)i8&Sec2O+GL zrX{yA0nG+|FaUZgfmbD?*bpkz^uCJ^Yh4Rd< z1a%-hPf~AbK^RTpD<*u+aSU_D?P^8eM-?mRRXXdXwvkm?q^a1=*KWj2?{fmv+t;s8 zA`2B*{VjZLQS0X_+VUhMPc*OV({}OqykeLeWycRf9LuV?=oNoD8|o609h2y=3p4Gv zx4CgQSlx(k2pgp7H38ScTh<6yt*|h-mt^unFdW`5%jIXRz>(&l#NaL#`DodWse}du z9rKx%HL(KdIQHo%C_S?!vqFjO(Gz{tK2ly|kwmqA42Vuh$8LcLiPm`SlG@?$BcPo& z`6=`mjl{F}d{We^Aw^T4R&;E0R(B^LL4LWk+{1I+`|iza#uh$h-_x=2MdDyx_i5My zmr!=UdZ_Al{^USZ~ z^`hwF$^H!A4pKZKN`#MYc#}&vVAUGez-gNl?&Xnoe$)q`)F5nD^pS=1P6cB6i_I@q zqO@7*KR#0hppHWud0 z9?pFIh1Z{(9}5@BJO9q~Lx?Gx{N;}gXjkZ=l%IsbAN&39Z869BZYeF=U=nO_mA zB{_Hhhh*GGV?$i@yT}oR{`TQwlXUY0SY^jW8C{>Rl#1yof#EmwYEUR9xj|F#DRS#< z`YS{j)MC9z9LECrp5femcxLo2fk9#oHMr~2`B8dVqob~?xD=X< z;>TlQ)tz$h^U@piVz&42oiH(!h$n*#2@K#_sphZ)FuuH^gQD<<-BPiefn?mdm7e0T(5LL&0ZGUXJyGiimvi4l3H{NcQ4WL(nklRHc7G zgT>>^`Lr7)Pt{~Juz;q-jGN|CK)08Vu`-M~Gy)wOt?_Gm)LOVoc@DJK!Wu*KOPdpU z$e3)djH50oqglYXf6}<3rT?%pcBU+Cxj8G?eNpz0Q!E9N_ z>%M~PR#EP^ulwiU5{!QTxPn&NXVKp)kP{%;JIZIb%H*J<`$GMoB*8i2J1^ESWn+v@ z$FJUnrgLruB*E|AKQp0uUuVwDQLr-wjoWg!zva)!M!ArrT7JzpTyU>II3>62o(&n+ z(RnanzNQj6M0kDk*3d?E1lCK5%c`!dHk*jBuoT>Mkfn|jFCM8VOsmCJpFn<%+_ zn!QQz_f#FR%tsJgo`p|Ty$;&#Y=gGTWZ>qF`cWc1mwsQSq)0H#sgfCP@)iVL1H*&z z#Y}1HmCd}n|9G%6%fQ?#=TaV`8*5KPhOZvfuV1zlrx38r_flN{(ypoy!u=X94uvB3 z_KeC3ZESR@Y$VPR55Dra@eGQiceqCBMP|_8tZet7Va2>{YC-~^C(U4XqK_W`>}p#F zACW`$Gso2x6l?B0 zK23AdOJ@1?Lo3JZzvBO?R#Ti-ifSRGF#afJM-i@N0wLvb#;8t{OGZcCbhfpW z5PUH~J4uPj^SvrljDqk7-;vlCkt$|$A5%Vh-uf^MVPkij*v1BP-YtQzllEnXGf89* zV8DsBIH_AQFR{Q6z&B^X`uQ|(1zrmf4Nwpnx4rNP$@m+=L0HL``_&@lMQmSJ5{S7u z7E+>jjoGhl0EBv~_+gXC-R2K;rmN|THZzRw!#;?1IAj}QU&?z8s;d#}y_*M=Eu0l&K!s8X8 z29>c@8xl9YcD6D%&)1;OTud)Ez$X1$qq?OYTi^UdR&nR$No_sqPh@VRZp@*QPlpeS zzy5@pv#DEV(GY$kUwm1j&+B5bp|wcvJiO2Ifnz}u0#4NI?QXvHSvBn!QI6tnFgKVr zl&{;7 z(8zs&lrQG1I7>6>Xi7{S@Xnv_nh&mgv)EGgYU##TiB!mbwno6`Duft zbXB2sE-r%VggDP6>##st)f}RE)vuRgEmk6fflX*$-cpEB;H){0A8kxMh^_uk)HPpv zC*(s_yb_iXXgh;`&IAS@_Yh8?U22diX0V=jR&m88{Y@FBQ!Mu}TE2-$+r1aX-SPt& z@15wbzA!U#@OPyBQgYBO7@5WIg}?c>EZ;tCQ~H2&CQLTxaC*6%DcSr6AOoK7ud_L_4))moCE*AG=1X z6yfeV;7LO94#Z)BAw>R4j!)miMDsb7Q7xkZ8rm0H;uS4tLA)1nl;M#%tT}*SG_GH8 zR`Ky+@1chL?hzb`F~bCdIp*O=jP>TjK+Ahi)RWuRm5h<&pS3w(9Xvib6RewL8g0}s z8V2EFmHj}r8SQJ2oIrB26iSR>!@qgK%M=!r7u>L_XPpIWX*E%NZzCzU*hznLgBJ2e z>?Onf=C`Kp05-<)l@U&U4?NT=l%LL?jQ&zd6;+0G-~(x#={?QiC3uS-N3R|&t1VuO zCApS26a^=clv_N+8zlEaw9Xw{QiN<3pVG~D3m|hX<_)#`atYU??c)FJ>P< z%1M0u_}totf};EG`JG?9U5KO;peQ9;fbJ}Z^-C^=DJX=?95+OcavY_YCqYXvL*ir9 z$_iaA9?6|r5l=1G?#>bek{>yROt?(Q8-GWy&X5}3U)vBE?U$K8^Fl(I*^rZyq`MJ) zrXlr>1R6Zs(&;3nc;VAen*Jyek2d}NjxE50%vCVUrVq-qMrbl=R?~qz4?`%VUUCi! zF|ftdw|tU+VSajHw%H`<{vL`!&OQX=q5A#Pi35VZl$Zz<8Wai?94fs4^wSe$TXA&< zC@56y-+$0hNy!9H4-p+Dq(u?eVBj&{GtfmhJZX{wN9@&RPbo%jlXF!50 z3JR;vked%n94W}J4?(!|+m)o8hjI%(44tH$2IKWWFsZDYCl@06s;K@|EV(naqD*W9HM?wj*v-%`^prrhBF5 zoHos;-__jLQKwknD>CL9maHfdJTJs7gjqNopVme72VM&WOmTIyQAOB%?S2i>YYS&* zMC>k;yz+6JzaL-*!D&SPhWKYC0=0Cbl`p>UOYxtd2r|2Nrqum*$S*bv!{FcGS|$FT9xU{M_0HFssKZ+j5tgcYPF-`9(LtrlP z$MxqaZDEw%^;4W@%u4d|x{I|NASo^jZeZ55s}9<^E@B&!l6c7+R?mG40I_`Skk>`U z;DdteLEYvB{bcoRuYkx*oz;wKR+yH%`)v@U72kOC%qo;6;;gsmfu-px^IJ{-pdL9# z^GPh|g)7hD$ppx2qB9p&E;K8VO&?W`3WjSiOSA)Ri;OO;<+b9NJ^^u z@ge^FX7k`{rtn`Yk&73apn#~Gq~IdZ(R|+Gjr@tBI~@D5;%*NF&Yfth*FX%2-(|(=4VjF9ke;y@l=|UjL{+)x!xaa)DG^;WMpWl4 ztD0QLrSrE-xN@GWQ{~edhZh@0ZY!4`Jf;`%V`o-D-`8uP!r*74_+uH)cTV?9*lN-< zFjTq@)2=+RFRS;BS9eXEf+rVGH29g-L7nD9QdRr0J6yxnS5;w)?N4NY_xPG*;wEis ztR9GN?l~eBza5{d)IYA=s(*U&4f|KaL^j=1Ww2h3lAh7q!Lc_|BJh71(uMMczU|N) z?#hjp72rEw=z{F-JURCjZ);yvO%MeR*}_!J0kuws$`-%?oH# zYJMLn0RSqAlQmip?JCo|^CX3+fQQBYK-5nN`Hd`|Qq*E8*wXrYX zhZOeF@YWP}!=fDDJ@A>Nx*3-z*z&74RSgMXyrm2A>^(0HNr$pet% z{9;WoAwK0XBajRQB+YyoP}M!zdLZ9yeVKY$>fX1AIMHM~RmT*BEvusH?g@#v0pIVX zmY!a@_c9e(@&>L;Ez~?dTsF_wJMDgWXJdJp6T8a1Hy4{4Z$2A6nX52gynnheusg7G zIIwoV3V1x<42dUgek}HU;5+8)y`@*@ggkNO%ZF0=nd$MB-bwRMbqfo~ZW_DI&bPl2 zg^H0?7qj1c`dk?5akAkm-mNhFvCXCxY8TC5*FP-!e90f<>-F7R6&Ysoq9SzXP~akkP_{z@#cv^!1YBS zZHV;4BX&X4m`X?BGXo!BVkW79;gu1 z#M8)8wSX@$r4Q1%>77|0*cYg*Ru>@uC0RXiGTY>Oa#@TKniw|GJbG_ABs|&*8F)no zRR!!wqdZLW&?&Hzh0H=2C+>Fvk3butDMXX~>3pXUM2~#}P1yxd>_MJJKP~xFfQ&Tq zeLI%>b>cEDpnN8-Xi~87VEj47eEOu@LJ^nJ<{f+vn2H9NGe^L`-0LrY)HMXG-CIZ; zvs@n=JVnRN1-vQe{!M>+SoVR-#xj;|Jk!#;i2)tx)6L7xvO2WSQAW39 z#>e~q*BEQK%?JMT_{WXM?>x2lbV}XZ5YvjZ1>_Pf#fo>2-P^+@O1gKKL4g?Moncl# z_-QA8+lfW7NsfmAtFjrues)Y&a2{l(vbj9x-Rn>q{$v7%>MalMYTJvcOjY!R9reqw zry3PX-aF4ZvlEYiEoj}n>`FD4;at2dJ@VY6>}|mvm=ZZm)i{V3$r>(S_bbUujF2bgUoG z`S`pazB3tP_n=wyIom1d9t|(QU{fn@64CFj(CUG&3XabMij~loOEmKLIAA)tec5j=VnX8^=Ec#Du!~zrhwB|P|ancWWy&l!6 zFS^uaxhymr2jXZGK?>@YAD@Ct2nB2M5WU&)&!fN^Nac7K@L&1ik37!KWA@H=8MOxL zD}3DwzYY@!KKd@+WwE`h33E2yd)C@*1yq5iGVOaY%O&!|rm1e$EH4GvTsvFG0H3f2 zn|$t7&Z9;~zE+wZvtMCw*Ce@F+45szR%e~qnuQ$D1h2K1?CixjHrX%0n&y5`7hCXl z&FZ0Et-1Li?Snx5bzJNe;bLzstjQX})S&L@Q{=^%{9QUD}m)_L{@aaWX)kB-- zn?ZuaUYa>?j|wJ&_n)$&P%3=Ey?ay+$0j9aJhja~-BU3RdyAZWXBLdlxn_9~h+Ku$ ziS;9_gUhdwcRM-pr7Ces;e?+49bZCG=8jt3zA2x7%=O&)xJ(Xmp0%n8t`+f-+zOA13zx&6v6}gsz?TWyPkno*EnK|^S8VifBjUS(d0HIMuA4rGJ-yk zM$xhWb#ZqfIc2{;rNay*#~)-2rH$pz;A?!D$nD4w`W*deShrdZsGMm~K0Fs<@90>K zp9(RE+g7K@(D91}A0@)SRT~f8GLFoGd70w!C@qrJn?8zN^h-&Ut0-B20$o>v5rx(Ix{4p7(@wZkL zf`xam)mb*cv0Z%gB80WsJ)K7L77XGT6i~78DB+8ROKWkqo!TcRL`X(}-?6c<#RxPBmK~eD8;#yEKJ63f5 zZ8yv@d!#V?BlaiW*?FK9)BNA*$eyO#uEQIL`#YV&YdMs;Ggqe*j?xD5T}IJ0CHQAZ z|F6wuqQLq7cxmHK*4@FdQsljk#PnK5gu; zy9kBAA?fFA>C55%MJ=Azl3=E&t)oNDru_t~p*tVzuiWD_tku<)YyVUg!YIcOJGUAk zn2PGdZUH$n>qa9_m<0ab4Q^)Iu|1Px|FlVCoQ#j}`m50vaU@3EYSN+!^k_Lpu z1>+}dDxo}oUqivzLF>@2dHtgeg>Lwr-3Mq*>FB@ZB}G5XSx4W=MApGyX<3tC#)^;d z4{F`nhDIvO8&m}rD;*s4pVgpC_vB4qGrQhClVjmaU9l^5aKbLg%1L7mz|lhuJ^;2C}47%4HCd!7y_YqLzv@@8WFoTB`K(ahMT*N&r$*fqLQTCu|7>~v$kYWPy1labWzap;jM;1p6q=8xi-iOBYy$EHpg00txMZ_a>1jTUm!8I zS(a!1_9n%Fjl;1Ho2oD;OWwn{Piw<@+=)lzC-Zx!+{~wvP0+WcN;8WirOM@DMkPbk z+(hc95^#D)!dfR_{(qdDO0I}P#e8bFC$8I*F$4*R8|+*zafW5HFFfSiH^N)ICbf$9izw z={Ktv=^%dPFTAjmRsFg9#yVH?;J_hz0)JPV=i-rm5wb(;l(a#6!JV63Dzn6)GL$`E zd0%3h244n@*>f730dO!C!~F90fXQ4Jnm*IHozIujDSMh>yp$&Y z8B#u-u77d_@odF$ll$5A$HkCB>w*OSe&TLR?oKP9P+iS5&F#VO{6A(~$Z3x{kxNxE z_h#pJ`T09KT;tN|$TIB~W6QeK^W(H!nL7r9Y~35A+*xYCl8|ldF$*2Wm^eo5;!20K zS-o}(lS8=$#;Qm9fyWX@u!ef?LjFa?ri!e_?wz^lm))`6oQ<bQ}=maD4?2zHOLieCal6eotEN zW})wXuH3*G1ya#CcypO&>VAUz>&N))F6%tLRMn!+`kf%N^dWz1%0cvu4T#_Q+`3`X zs)W74s|HdQWF z6a~(D(mk1F_F!J-UQ#)}Bv5^f#|Z-JRY@mZ@5C9hFoCT%PvTZ$R;w5L)DPd^&$@|l(GXz&OFqojI=G`p?ubpWZ4nMZ?m;LZ9m&rh>Wc*TMx*Kv}845URY7w>V=Ynx@k zFz|56K(X!jB?3@0yB29<@kfa4&7U1^UwP$?a!AV37s~+)KZx8m2%0vTG(&|tiz(LC zj5M@WMKyeQv=FZKkKK!HLxZkafMs9`brMu@UHdlkUbxrKcD*Im2yM>hyczGaoByZ_ z&X#Lzbz(m$&tf5yRM?nN-z65QL)468#>|;`SocI6v+ZR5o`1}>ZccQ&Kk$q}uP#mP zTosuy{^5gu1-y(v&Pj7dWgyTxtgAAw?;&HSK_@_SX+KP(UL~VWl>x_O_C`kAI@w(w zT50k&X%&vNLENZF#<;%&lqW^+j`cA@kPZYg^po4m0gASQA|r zq0a^kc{5oyWGW!KOCz9u%c2}nEi=!3x#MlYGP^yPzcIXG4PmdE1T1Fo$ucD0kj@8x zw6Kw;GyLsRHz+Y0b8fysJ?WX#iTj5h&hz`K#}ulj%9-twerr< zV`~aOgmu5Z2>WH8uA}UGn~pLoviT^YX1e5TuNcc9onz}!rpkEefU@ysgo!9wbn zs(Aj$_S6Gap6;QndcL2VhQ1Z5K8e5G1Oe&yrbdiGQqVK{KDP!Ad*24F^GDI;bjLPm zd|1ued5SUYU)~l^6teSI(>^e$$8*TseJgwaG45RF2m4JD0G*^*4k_b~AvNq&X>?a+ zeS6@(#Gp6jP$zE^36Mwjn%d=KZSz{L==EK#v`QB}ih#Oo{E5(x@1PS1hIk?u4fJw> z>>|z#*~P35HITG8`{}Oi#j4&kl#3h@#o^`=P>;0_%^ZmWyaKXGwnnE@(h9X9QBc}~8UBume+xFATA7-XJrebo`7>8T_1 zzBfsh8EES|y2t!d6SujuVCFd`dqK2KcLwqCpP1qB&3(-Zu6B2kA^pBUZ>xko-0r66 z^ZHSMHg02?j#`|GWKWlKfz6B**qKSl1pEuKtNcZX8lA0J-lm4)0woU>kah~)EGedw z6;@$rR~iL>Y*}!w+}6CEU@_q`urujB!%I@w=O-n`;MwH;RnKPH)_ZSNC4eO!oi7#^ z=zDsZj0&rpQcvq&?{BHOn{ZOt?)zi*uu}L{qzVeag;{oe(!lC^5x06e_oipnvoRk_}ng`&bm_U?05&KPV^cfCjo&92i(>@rBYIv)`tLv+5o+{!3t5I(}x(8Umm_9Qw%cuUmu zX>Jj^Uv!t{+iB@i-+`>{PIod}l(iRmTfazojRu7W5nOA^%5)kpTgfi(zM+l>i6&Yg z;r{ML|F+pV6dabI^W+9KUnqCnfvy?1=1+dW>cxqDm0G&t(ivai2P-1rP_kd;tgc-~)ppE^!mj2tAro4CcxD@4YBf?d0egOTzpuXjYr<8P94ZYSd?`>*Q zPOHw{48ND^a5#D`6NXYN2Oaw0t)i245w6NYz8S8tP*z~zxvJM`VbTf`+)}P0bNR-B zF^6pdD!q?0|FNe$@aB@($SZp18gHNwEUBjH)~f~SFD9Y8)3;Y`K2NVP8O0$zmEm5@ z=k4ffG~bVRp(B<&L2V;{$)%NwPbcRFaAc9$R-F3^+yg;x*Gvj+U7+llWZqULPjtoZ zD9FCg!`!JqLWJ&X9UeT2hq@e5u9tCddKY8<)j%ce)3mTnq`mmW3dIvw=_4hb1=ZIr>Ypb4*n<*WMcm3VJLwy4=|=x9Lj^Ydmib3x&%3 z)V!4s3u95VVrh4So${J|X!Fp|mlAXKFDAu^F?N}l$@8EfO7IAKs<%3F30*Kx$%Yw) z$T1K)(`6_0lF{cpIqp)9n;(VZ%C7n*uI3k5q?v@1agJaM|IxUeOt(#vX8uTk!N|v&v^R;z+dg^6)WR_u z4OZ9!a2GwfIdI3eq@-VKVjf`&BoHPqmw)%oQ!#ei1Vy(P@;29Mhqwt|iA8UTfA?(H zd)0B?iuIiAeq1QePmy}wTbPRm^7Uhq*$$?bM5>bR!WNKq#$XQO%Qey+UxU&4DzTUz*y z-p!Tjsd|D+Yx?w1NajlF&b`!su3NA#YG)z(HRcPi z-DAi|&!#lqsp;A^y8D-F`1E#V0Y7ZF^DF{xNvxsUTT;^ZF&Nd4c2sg)&Urf*4vedI zq1MapE|PNK?LfmPP4$T6Tk*}QXjJMK8#l{-3RkP}&WBAJRcp=i=US*IuYU9AYf+=4 z_Jee|24BT9V2#sdidR}d&xW1mFH1rc@G!(T+u7;wl%AS52v|q_N6A3ggY`ku*PIRi zZRHA(zJNiO#gbE+V9~QfRPGI`s9EKJS|%=FFbVL zLaJj{uqg`vRQ2ujUtd$=siz}>1;G+eG8q1M7oeiW^`6ToOoQVM$x_OHWzSQ)!}rHw zSJ?iv;UfPht2yw<4k3HY2Kps|MgLCoL-Etmu^_<6=|v4+xY%=V^(zCbIr+j@4a)G3 zPiJ><7q*X%WAg^qlSitUziTdNxE-9U>*Z5pO_m~w_kj7ApGg3lBb~pj!DYYt=h}2E z|6LFeiiX&U9##M zY4?@y04rimS;Z7&-JET6Is9jfdS>P+Ui!jNZ$cRN4`dUyY;={maGy0BsR51PEW4kR zq5l`I9INlzX89VhmCN+a^Ppi>9}KZMtiL0Cgm~bh()y!zxAUp1{&l#LUbh5h(X=`| zN7;WbekZn>r{?yAwW!Q9Fx^Txwij{V9?c!?Ju3&L>i*4a{M5)Z+E9>}|2wj$PUyrz z-JXAQAkXc2P)iGp2N%&)Ao%%#P}UzjVFier!p|}*&_Cf((!pa0cy@??Hi$%l`PAI% zy#LdjeR`e!k>a|JsV+5KLjm;}V!FiBD&{Zw@MUw5}imT=bc zBtL(LDW3M^#%J2t=3o97#NWjuF`qbLe(o;+|2Q%D;kdAuTs=mb*;ifHA|1hCbxJ>N z2F1=?+k#T{STdZBGsru)aB$=IW7y*fEk!X*Z@RKQfAM*)&a;q0AD@)0tbg#rUxn6O z^~X!-Ldj2-{UJW{&CcY!^J5%ooAt@?)jT-kJOJq8a9i^K`UOHna8bgAYe1qMangS> z<|1Qugp9@etDaWi_duv88c@NFr5B?*MG>DHYI{dp6XJhjc-w#YiSK%C9)6!;`y>LR|QIt|MT zkagWvw$IyjBAB^Oft+Q9yqHeb7bJ zQ8lTw{b!hc@@DFW z6E_Gbeu|i7up(RpuC$V_f9KRrY&nYD>~T_A1umIw@b@m-szWlC zEb)cg7;8n1j7qI-^PCie+xtR~3yoQeSe}?v<(p`Qw53qUrAqnaTB-{0gW2~{XLg-{ zR6}r<6Ykq39GgQR>1nO~Y;zSy*iTzS@*h*&_iju`riug|qh0al)nQSwbu#oX^v!OS z1~jbH6>Tu3W&y?L^I7|X!5e{Q4Kkg7JX`1nK7_Di2Lia=oA_yuQA9Q7otRGvgZ7eO zb@Wc6We=t#0ikJa%q+@k*90N|kZ6~JIMt7gKg{XH)*(J7-au&_gVrL^IHp|}@ zE|8=!Jpgr!H!r)dQq>@+{kgL-5BX~V+OvI8pJ-7*aZVIqBynXs=btrjW z=%ZY@&{%-vDI>{M3d-h4?t)ox+*1vl6$U{d|Ftt}pErs((-gg7tUCr8*Qq#)#?V)1 zDOzOY$J$?tZ6kR3N5pO1p7X#gue}Q*J^Gs#ITTp6{@ZmuSQt_K(#^J1j30Y$%lN3@ zyu^mRp2Q3FfoE6&IZ{s&D}L)r?F4F17y1^)qARYZMWieM3Dj-qi4T@7XG`vf%$!wX zx-X4S0uv_VnIc9Nm}j{nIHbqWQFZpQi)}K`$Exn=bG$`oXENQWOfFE;C+bQhtlU)) z)hLE&P<0a(Yeuyt@nXt*b?Emv$>L;;eTz#?l5*4XnRp*%v(C9Sf)~9REU=%)y5o~hD zlg%kg4OgYxqRsDVmbMN*atmI#TMf%{#Kpij-r+p53+%QUfy*tE3eVQ*z;9?b=m5qX-~rIiEq%Y}h$&t{~0KV}gz-BQt_(lh6&!Kq&L z`2r=)JI6W?ML3hxg5EI5Z3VUg1gY~bvL_4gn=uM9x@nzX%vxm@G6B7uaZHPXKQyMF zPSC^H_E@gV)KNLCF_OL@+SITbdu&J(owe*@40!tj@4vJ(N*~#eA%^?Yy=^ipmyS6L zUqzIX{7KX~!{|>)dcm8;@JgCJqjbev?y}K1Cx5=B^$IZ-Y0RFaD zG20s_)@_|Ry_tFUsJdS3^#iv@JuB=YBtshPOB8#_oFhXGFm5&wGxG-vm_=8a&_z$* zY0?Xj#eq>xeR+sG=7Dgya`^usUpUtE{lkP;XgB?JkPkj|lp7+O*gknT>UV`zqk`wR%L@B91ybJx0et^3FQ$AvS` zdCoce?B1WVhn4CvKh6u9RSO6w{qK#o<@r7f$g_kRIVhKtLcCD}*poT4WOQG9`UB`&F;~n&;&7%F0T=1Y70S zXSKi>Ui+1dX8Vd6)-Z5{mh*bOcJ|D(jkBmB*a+jeHexPIV&sqWNy7}ngd?nBWHKGe zK?3`4V`o{gaxMA~-H0!#zg^C6Y=_ijaATd3Cxaw`UMZ6eKMV~E1IBxRuH8Q={i?x6 z@QNoYv!;s*=l&SX7Rc_oShvS;Po+u4etWT`d5d0(&$um$Bdf^S-}ALR`-J!=b=GXP z0+0Msw8`-+O8Y9ywy%%%0_E|u?iH?b&m0}TBGt4lLiTV%m^8B>K_+$*tkR16C4u~E zOLRy#OKItjgCgh8Z2sJ5t9nH=Stm=F%L6&jJ{DfP@1#pN(4#c*qIa$qmrWy8r~5L_ z!^%D~KF5t|7xobb93`(SYU9!cBka}MoA*N7=OLU{p5P z!)JQ3+^?E&N-W?{?6up6HwL=Yh7;SWnc2*^jn3lmc`dDrAA}Eoo7Lo0rdqNhmQp*0 zI5{~5v1Vl(aYWxnB8G$^>V)b>gl9+m0*LIGrVY}%&iVC;$Mn+srfpz@&-%J@uN`Z_ zkIK89h>W4{XZxR;rT5tK%3v@GmRKM4B1vuIs+p1L2}=HSkcqD1`VEBdsptsNV%;9B z433BuInU_eV1>A8yv|9>YpzcZ0f~{6?x%Q4dq8FJxP4)Db7mCTtQ>;i8Tde!w_x^N z2iQghGQW|k;D}#s96ZNg3D)8~dy&j-3;_z_S-BpWKLRM0FNBx_!nS(F4!1s{9|-Lm z*L%AU*vh6u1o4XMndWW~+hhjDC(PidM+{sJYwj*p^)EcRKI2k}s#aZ);8`^Y+d!aG z;^=5~<3Z=bux5noSp6&z^~l6u>X3HPnnp97H%)?X-%~L4j?aSuADR0;7Xf0~qp@H8xbI?R$8a2~pT`gDmpP^96r+#iX&Ye{8eIZi#=h^Q zMK^HuS*Yfp!*v&W3_L_U#nS^mCt&qi-r|Tg!TbE78U~!TU&cgMj2EnzE=x1C$yBDL z_gMdrY5>T^3?PlF2g1WIl;ipMOQ14B0Fx6fA^!4Q2~C|z%_pv)#fu%+-I}cHT04Ap zG0W|1XRP=6*;RuJ5=W8%uUcpkojDgk(X&@kaD=5^JhY8YaJW7VyvXHt9@Ev1SnJWbz>md+=xVH9rA4AXAkFU+mAD=~Pcso0d_WXA`lfUjRZ` zR{H4zZuR70@bbqnjSh#+bb<3TdF1SoU&rQo^L+34Ait<(>Y`*t8;REex4x#xw{>%@ zx#_&l;mUbXFVJJnF%g0rQw|#>Dm+6kdTasN0`LS!qR83e*@cBLzA*B1(Si%YhC|I` zGaNw$wx$xUK+YuB5R0!ME{NFlolmzeY>BuRVRxRTHBJIp<-u!E`BEU%Yy(_&`_v3OHQXXjffPH0)nP_7c|>p};wez#S% zQE>}tduqoE3M68MzXz2*_tvZ`FLL$Tk248o{2u4v~*fy#|@ zP4OJa0&`#!l#f;Gzm0ZP{w8m7i?zDXt~|cXXH3}qlnuL?6W9iknXxWS#gFr_bznPk zvIU=TgrEN!H)4U#J{czaqppNF0sUYw#lw*sPG?^*(o)%kL~6}7lv5J_R9gkLDW|iM zoMpL~u#yI_;i7O!k{Y$RWg2DP^@V+DhD3?L(XqXRQlDJT5OBgLJ?@urUI zuoI=u#e&5ygX-XINhEoe&>-nnNXzJ3x2Ca7D(wlppovE=TK+rClJduU%{J68ps528m`|M7$>g?cC=(KTZ({km zCU5d5u}hgmMrVvGx-yl)iD;n7o-*pptM{=!3Q!^u0|fX3`_VI*ht*5-ArHtIgq zi9!_{1H7+)3fi)X>%lABxSHmyEE1j5w;#uYT683yCxekZ83d1X9GDVVu) z{P7C$u)uSP9fpK0ov%iz2VYQQS%nz~$s^BQ%Hote7rzYa?M#F>J4t<|=Z5@tC5J%o z#$1JJcBWcEEAuJ@9>nmLM2Ey4(El2)T6r~dq*^*UrA6Lu^v!a??IZ!IZgTvoVTXr% zv>hF9OiS0ed1%E{r*_@Nlw+NY=LS&8Rj(CJbJhSzRDgo&$&+l9>FXWV5c;MBs(uu9bn`ury z?Er7zB4HKGp5boZZeM%$M}C<%2JWkU5PE>=fO=vTnSSaG2`OQDld%6ZHOsKq!!-QX zW0%yy09SBd6l51eSUFd*l6To?<(nV*>D{a<^Qo|w4v+CQ?!ubgW$6F!sikn z7h-r^$JsUN5cI!e4pKaiQD$*$nT)$&Yu;@@NiRVFBQAcw;%9)+EvzjZ`Et3YS;_1x zX(9=EAinorm0Ro-Xt_;z4j`>f3E0#Ai3BhFng5%f-yg3B?Hyj%1ny0ABA?wn_aXmz zCwfNAd@{_ov;6A0d-~@=?}tJJX7leTKA!ur7v2^&O(zW?pm?6M?0-#k@%2lfX2oI4 z8~Ep@#=qt@4hFoEE6;7nfc>7unE!kYSWH0Yexnq*%;2Daz-Hq7K6sE(K+!#zZO67>#Q$LcpF zf46hSu&jnMsb;zdM<4PzL`@d&Un@$;1lF0!zKmX^HA`NEdQv~DEI|w7*z=%l3T?9} z?|+CQB!zkV7Bf9*h#{H+FNsRE8ryFF&Zqe65#V9=*MLKcmpm(st*_$#7_FX}6!_mV zkG|&O7}euPtk`BTP3v9&PEXzXU?zab8Q&-ru6TsvJbIu6W@{zL>Vpxs|CVROF~-Y( zcH_cVJ>4}KZOzh$zb>bozU2I$IzT!(SOjkT;m?1l4*X^O0obevgUyY9k>KojJl>!U zAqn->3%C96LwNzXLH9zrub#WU=d%IN)Z_u41fGA;MY-zlDamL7uadAi<|459iy3rO zfK&6XZ~Xq(L>Igj0M!2aunpQTs(%;XVADKe0q9ltdrIejZ9@c`;D_mlCv$&IbiseO z!-4(3S+{!hKei!s4;@v#h_pGK=&`2gi6ly9{X3&If1$X1XMnVNha!dPn zWSHo>an(-VcbBu~&iV)+4452SyH$jjY&6yvLy{q+j6>YopJpRWs$MRBPp3JjPNxo9 z_%Hl;nqUD8tbp-MHCDx_jB$k9XNPxW zzcnuvcceFdm)!jr9L;FQRH?AQ0Mj76`?{4Fs7xp zD9c1!pKd9z<>sBpe;E0hD1m?Z`7!uC)WOJ%4O@}tdG$TT;&RvFPE=daTLE=E@jWH8 z3Dz#xCGnZGv_c&N7uI6ds%NZf`FuFzf_H{FvA#cG)=b(;2M9300D&AN z9pRgeX;~Ex+(s5P%!OJg4GVO`hln#gN!E81NZWE8$<5GQV1X%umAtoa9ApHJbiI4>$3MOV`X5Ua zP}vmr!Wrbm#ZkS)Fy3Nn1JOw8O+=o^49hoxdn{mz-_3ntaac5-~Vz05%e zWk2MH$_R637D3h3EKb-_7^f2AasGJ5ry$g9r)NL)Kr2Y3e`M+Xx=V5PQ3=z~r415x z#P=Bpje`?jS3}pnUkEkBIMl|g+Akfls*G6R=o;-X4|a%N37ox^Tn1T{`?S3M`7IU;ecvzV6oOMsnHqM^G*CvXBRc1QP{uS# z85o75y_$l^<_g;m`6h2LmRhzQ`b~TUE+8m}sEMc)Fz(TXz3M{5tI{wDcwL4EPT%D+_=3*nG58x&R!c0yz>>CP8|1;2A|DBbWR6 zAy*4>Cj5g@{6Z>cB1w!j5hhW(v2y;VXySYYsY&jfi+B@=pL23=j(B&WYgCKy(7Jcm z#@jCep_Iw8^kzFi_zqmHL`%)B_n3<*9-jv&T&J`5# zvG~e(vaU8FvY^g1Wuq3KXh5#r($KbF9uhkM^*oY0fK2X0svWy`Q-_{a{{adE+D9T1S9eAVSV^kvrJE5;fh}dWV7ffPmqHJBSOFIoTL$ZZRdq z4;O0JW-k#63Q#OkaSYMZ>@(YhP_Bvnrojb|CF}F&9K&qJ$zpeI!qsy#Ef*_dqb4%9 z-XRNs5{}DB@>V<;pQ-Q3P|Z50??J9@MPHq#2@{WVSeMpQKItaUp%UY2tiEGqlemz8 zp+8k{zvJW+HA zt|B~l<*`af)>5bv69D%s0i(W+xm}MCo5_{EWAvk?tC+OVB6rIL5Il|k^5%vC#5anB zBZ;KL0*;fakbqbNyL_6SeE~@dFR402`0mE5n!w-RN&A1R)?V+v9ujYiQB0gAA34LoI(oK6~~D{h*`E69S&~a=_i?UYdkBbJVD+P_R+n z6*k1VxN>;p7*GC&?LR>WUq#mjH+3(&j%?Ne|H&ZDW9tN?aNi*_a#@IlX?y@Dn!6&M z{WQ-+qX?>Zh|POl^(os>svo;1_{o4savxqDKgA@VtTgpUj>D68Q zNZ~xFdIdL&;HxStKI@0&Z-}ZSPT2bM)dAmakeJIqQ6ib)-pHa$&+8; z0H40DwN0BB|Mfp~LG{;k+d97rz}AeCk)kk2jU*7r+!m`rmv9G9_w={XcL$;bptSd7 zI{ytpiz{b&z_^NJ#nLmoeXQn6;*r`p*x_hOb$jn=tbcC30JnGmRF9*pY8gVaU!Pi| zIkyX|)tDG%x9|m_GzK@{$WP98;hOmd{>Lq)d6a}6c4zGMb^}wHdLer~9RISayof?* zEx}KOJ3l^p@UPKrs1}Jq8Fz1G1}JTD8K2=ueSr&1E#7OGaHK6a?$6wNd<`;^R*UlB z1aeIKeNH70!C4&D@(Tf%DHRMRehnYTE21c~k@k$LmJ=hPTI4N85Eq#R6Bu*Yu06eX z-Jb~Zln6y=Xt}`?y)pBnRm9uQMGJdJxXScPnjH{|FZ8O7cIx-hpjHh{ z#8bdnL(PwDz^DnW=qn@C2ITobs@g;&w7Bn336>S=N!Ia*wz=fXY`MZSLtaR^+5!Y?REv9A+i22icDI~AkXF;{lWE0RKCLH3j6ZFbkT4u#CR6l3W^8& z7O0+3g$yNDA=U9bi|j~@s76hT;*uH<4u~tWRU)jPK{Y7FDKvZTOFTfa7M|b!Ule~| z1D^mUqK^*D#-!@r29mCp+kYP->BM}bv496g@g!j-EKjs~6+h)XQfMKm+32~>s?urd z6|yb#^r~Q6?+az~*jIlue!6VJSN?pyK&B4cWF41Xa!=`RyXfwhKIs?BfJS27>A?0DXH=KxMW@K{z$u)t%CSrX;rD-I@Magz7Cj`EvGB`&tihJ;i3Bb|g>j*CQjwWYnL zm>>u$tqIwv9NY8|%kmkQux|X&Y**Ccn?vW~`12(C>8eeEC}`&MGOlx)dUoHtN~Iz< zqE^#^;&P%^wQLCGn|`56#b%FOGKVHlp)Xk3C5ns`BaI>tOnU~_hj6rpB9=Gwt9!YX zb_6POqns11?V(O#E0199=?0vgWdR@UWD5lbkDXD>?tXZ{_b zc3EZ0_EY6ulWJ&bxm?9uf1p~4G7-FFz~JBf`A8Uu5v)op>x2}etKJncsu)x%me(5TT0_mh5Jsw-&Rndk&f6gga&kM`ie6cMh`YARSyUJer??{$gl zUI&xR=bPjm$rgLJx@H%!$RPGBixY!^Cs>O}{hHm=DEwiys9We8DP;DHss>O7PRO20T`7 z??sGP>*%9JUP$Hh8v9dfjS15s5#2$bAUSDEgV#5yrs5Iy!D9yXmxlBUEGV*s?H`Cs zxkngvSCVpj%UiSv3kN_D4OVjI7HLkEa#&wJr1%-#utjx)@!a|set*tg-hZtKZDQ`- z@9ay%kHg}aa@i1>zfXil$b9d@g=n?Az~B)DQYAwB-Z z6zBX5;Dvzl(e_ND^}mb?@JjSl4}hKv2N#V0j|d3SYy&Z>oZH8L;yg6H&JEymmX-gQ z&eQ(_?J9t|j_8s+FP{8o4Di0vtLLlwd$b(T9D{i~!WZX%C3=7+4pe_F>td;5l|Yc* zt9_U0ti=4++JG5>O*vgW`Pbe+eFElKM0a436#uCFpfmcyyV0)IC}6BH?Z|z*Tj|052=67 z&y?3Z)Adi#Hx*hnnEtdv6p{o{%H|YDS)*}wBH$W98_Ii%G&6rVUPv2IVCOdprX_T& zdSiz6OiAF+0hT(B-0aX+_j9NZdP{d=MqVE zyh=941Tg}oNLJLSq`0G92Gxa(0R4PU!Qv0eC6fUcZV9yiWQ@usQ7dG-7-*-0ph=j6 zh;OwP86{Trp20QHVgw+ePNC|5HtvYw5?MU1;_ALr+{)#9g(g@RgWn7yd#NRk8~O&e zt0v2FZt7?z&IV4v)9e6>y#WTID)ZyItj)ZmU-S`*!QJ`Q!KhC|OXbK6I0NxN*+m9- zp(n;+8f=#^B!w?|EaS{eZ2z8b*_LZtpbZ(55O0%b(CG*b0jhsBx{r2m{dz zB$A-HQwYu>m3ZF|TrFzA1Zu4Iue1@6Rw|I{opNslu2@i40f7BO7=1Egj*akByT~tK z-4we54_U%WO2`1#Dv9AzRy+`UxU14{mckLun%IxV{X^!hPE#pXLa_*UeqONabrz>owI0QnrWd_6)Ueo3TgsNel8BV`C{` z3YEmWOGQWw7#kLHZ^vOzUH%tYuO5mGHT`@CyBX$ zvz!*HsXD0!FC4(wzFmFKRyv^?O(X;jGMtc)qA;6UQ5zqF+pqQ=<1@Q&eHj!WAvBHx z>_ckTc_W%AW&#&R?G!bYZt6&<6VPy`A^^T1GR8XrRsG7{ZQ2&;hn3E$<)o@3ECwm- z4H9O6qK4=s?n=ap>9)9^^p2OMnFdV1^1W8CVA4RU46<>BV*)tyKP=rCH=0*liX@!Z?vd^m9Kgd?`|DU{7$usm6t= zh|fi1ge_aHQ*n6byX(P9K@j6>?9w0aeX-BwMai8F*;cu=Z!4fZkT5oIw`_cL*yj|(*yJGYqcb6Mt?lzG$u0&537IT89EC2{D1qvIlik!@C372nMSV-35Z z$Y27%u~x!9-cq4yYVaIZHjxKh`&FE<6Py;{eyc0aCar2MkBA7F4u%x+5)^vGRtKx1SPW4);T*i~GM-)|TXhRJFGqlglbYcKK(9UW`ew zJTl~uST3qBe(NUv)h(u*OQE0Hb~eIvuLC^77<+T}jsuUvHmhoP%Od}NwII{MGpsy; zRE!}@?5igB7L9qnLb(J=afc{Ph4vrKsv@>aSDj-ITH!lnw?II7rXKRQ$AxAHAqc2{ z$uQhG9!sSmdP1Bv!((QidVeh)khmhNYN6)vX)TRWoV!~&$ z1_r&p8;#ytL~iBv+sp0cX2|*Bty%QECo%VjT85R(6W0qgZr$(CB6{|7mf661m&S2W zQwIa+k+=K1$M!!b`W=gCIWkA6!%?<9i^zCS$}9Pp1TrGEH$^F;mW*Uhj#DMRA!$CW zQB9}fTG{EXGa){Qdo$yZY_f*V>wSvP0{f9bqRqrg+c@&w$8g@HJ&iucFAi33YTC-m z)}3*jRTJ8v5kva9TozwFAFV0HK}T=7pz=Lyu+haaS~0)>RBV673lX)hPw5P?U8j?MBTSpMF>X*0xeN?%a*U z*>GVTJ}w1W1T}6H_}2JdTjTi!H1H?5a5heDvd{{ql20|&?nb&MCsjWf%W+@I!)!oj z0hg#(H9;pZz{f6pgCcEDfsXw8G1hiE&SiDG*J(_v0ZMVrJPIu+{||7WagC}BeB1=G ziUE5oV^12Bql`mZnrs`mYT5^l9$W6;W<+sU-ggKcM(LX`(H9-^!jPdS0~Rkc!eQ!r z@UfS%<~lq03eOxWL3&e6=0@`00r-+)97wwkro)i0Q1tU%D_sMxfu%QsTR!MYBD(;pj*#G-G*O!LbE` z`gO*#@tVxHOs5|?{ysZJ$b>EYJ{$G{MgeJi8jdI3##{cg# zI6a7(N#M&XTzCIh?G%XGckOB)XkU^-->uYF6q?!|P5jm&1AX3f<)Hz9E&FvXTa4nk zbk4+>dBxo-nQCHz3 z=yr-}IdgVp0ElIM?5Xkr`a<_!UOL!!oN=_H6f?vmNY_l5z9BmcE20MK+<&wJ%?Wxc zw*V7bV5&#mpr_ea`^8AX0DOK@qxW(PNQGJ{!2$R6>C=9!YrpW_9Hs&|hv)a?G79H^ z`?CpTQU&M*@uOJB#>U_g8rDs)ZHl=~D!X3Uo`yim0}l9VE;|Rdr=aP$Yu77M*1eyi z0*Lw_A8*AgRPrd~zCV0yGuM6;8IHfQurMUDx6{9IC#qV+hTQeHeY0EC#>CR*Q_%!8 z>VDhrGjIz4aHkXxiC=8DBCMQl-|`1A1HW*yJDERxQD~I|snj*5U;>XMq=Oo%-41)V zmj=GmW5#+TPwj?xR{ZtxBroB%;4 zfZoK)ZIMrnDmDsDM&MD>W+oR0(3;rV;|~gZ&kWqb+ax!?)Xg%J$3&HkH=Psgr&E{Sx9W2TWtemElSEv@`df z!A=yR$sj?&0RSDg;@T#-wL29=eS5|RhoSQ2!m8SdM|X_XRD(;)s{CcJ@{;*>01xRIEi(q31D0BTb{LkWrbf&R#itZARavN_< zHys#T18fh=HNg$Mq(ullpRS7FVs`GcGtT$ZG@g&tnlnHyw z3TPn6o(6}rIv0SS!`68kql+v9;Y*6uK4Amj-ok?@wL6lw^Cn~$EWxlJ9xch+v24|c z8)>#H>P1vn@{?)?;5;XS3K8Um3z)!FIHX#_9$W9hay*W)=1zW)i}@Gf$n3i^1%S&F zmGSexSrWjNU{=b`8#qy7a^F;fsj6w^x(DJpQvtUFc7T@Ed9!4 z)hH#m|D~HZxAeE45wU*3rTzg(eCqUWCi>#w^@jjh`G4qjk3{T2W-n^FsMJfrl{n8* z#2Z%F65F_x#u>j;X!=NjpBLB^h+VoFJ2lpU-EYnhAGBQx;5D8KRTIs36sWTl*W;w3_edu1^ zOrY-%9(;!V$26WxmWKycoa1aHIdSQ=tJVW%ww#>@GHDMfjlX9FF=5*VbXO#jD70Ah z>%Feb%HA2kx6O$J`&eT_ zms@_nR!uW5JDyIpNIVa|uK!gdw}fxwUhriPIj4!ayJd0jA9SOY=f%m1C0^psmvfL! zzxh85-oG*`f3hs6mJnUh1K3_8S&O+p5UuoBDuxKV8WVHH zm%*5Ww=CWcKtSiI?AZIPtghbdY~Bq^*~b=hcPl8xvwm1p4YV_=VaN9{L|4#L1?Hrx zPctggZn)Okb@To;ANQ>Vr2}Gbnys;RS&Oa^8tZ6b4JUacsm&&FunI^PT?ONHl(g7* zkN|s4AUCqrI*wB@5{@&5_ zD)r6`6?wbr>I(@U;rl4)FDJWrdm$iIFhnppk!`L)Z_3T*@kpknTD9)wG~id9cfVz+ zILrR<$!uQQqFoS+J=#dW(!Z1$%eK{4P8C!37}OOp`7X9?r=179bClE&6I%elzhtm> zxy;h7DIyF2dY<)fd+5Fpc*2CiwhGcext zm?Pl|_Vg=YyjISAq!7&@`fY!a2nJ!QXmZKgy>j0n}xaN7L+}xfOFAN^uA9 zMQqV@v2|hOj|O%U*0v-9ClreYbatU8;UbWV>ch-#{D_6H`1lQ`+|u|C6NiofD8f!% zK{@Znsd_z0$j45R0hkIcWOAFptFrb6+{tKy?ErU2wc4|n+5?0w?A9gl*woYsBkJ`n z!gS>tK~nl|@+>W$jeCy}z?>Y2xX^G3^r6fcz+|!6MSvaX#c%@+lCMioicwlrzRnrY zUgPmrCK9~|Bw**u)++Ot9f1qd9<$d5pZ=^?ZQGn{Wh4b?5vom-=_Aw(v`m2=f@JwI z39zvYMQ`}80}ga1$Uli6qG*!`_{9J&v04?4OH?IQA>v42UBXK|23%AXV95d7v*tj; zE=_1lt>L)q4d54T-E&IBJlwRx&LtvQ{MIu_bZyO2$?xG6Me%Zg@nJ_evVxd$OhEkr zM(S-!>n@aAvt`_L#a7z`Sib^rR|DS(*7@LMRH4092{>_9^og^oHn)YLrDoB(`!*&S zFgPo5H0Jy|=3nYd=&#KQaJl{YN}`w@3JIJ$p6~NEc(~BV4gEF1mF8Gg{^nKwYfTpX~pnjW3kyPxK|S zZ0+Y4Kd1B8v_wJxH()$`0_1uBV`}~%-rm~D5bv#L;tdBU${kb|{e*;~zkTnCQIwO@ z`Vilzz4|em!n6L{Z{J{S+UvBtGk1Tml5iis{~&zBTIEG>>?`cgrBi;TB>qK>TPH{G zoH*pd!a`hRY~)Iut6=Vcedc0WyuGBoqRZj|A1lT+F(J@RV+@d=3hUbt$|TJDG-n?L zyI=fi{0{iG&Gibh`r@O%zy1Hm{!NYluhJ@6UFXvcSWe&63Wp}qRK*u5OFzvJGwD>Kt3rp|%hWY0BX^dr6 z2q-fdK9fNGYbkx#_(V3^B9FcxGqLF=Ud-?6Z0kx!d~-VfF&%q(WjjXyd4q9-`_k*I+&68rU=ut2KQjN#F-+334C|_+_nD;fB zA~Tp96H?(|ElGipdba3_VDpw^%a%w@$)S(#mJ_q^E}Ezq8z~M;R

kmzT9sRW+!TcUjLLT1t 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 Z0z4o`{1fHmb4QpTh{gkT)IFOQ{{=d}_Iv;U diff --git a/reseau/topologie_globale.md b/reseau/topologie_globale.md index 71e0d2e..6690d15 100644 --- a/reseau/topologie_globale.md +++ b/reseau/topologie_globale.md @@ -1,23 +1,22 @@ # Topologie globale de l'infrastructure +Le réseau sera découpé en deux sous réseau matérialisé par des switchs virtuel. Le réseau interne accessible directement depuis l'extérieur et le réseau d'administation accessible uniquement via un VPN. -## Pour les connexions à la partie utilisateur +## Réseau Interne -Le réseau local sera séparé en 3 zones privées. +Le réseau interne sera séparé en 4 zones privées. -- ROUTE qui sera la DMZ situé juste après le firewall et qui contiendra les loadbalancer (HAProxy) et les reverse proxy public (NGINX). +- DMZ qui sera située juste après le firewall et qui contiendra les loadbalancer (HAProxy) et le serveur DNS. -- KRKN qui contiendra les containers des services public et club la liaison entre KRKN et ROUTE se fera à travers les reverses proxy NGINX. +- PROXY qui sera placé juste après la DMZ et qui contiendra les reverses proxy pour les services autres que les environnements CTF ainqi qu'une Mail Gateway pour faire un relai entre l'extérieur et le serveur mail. Ce relai permettra de filtré les mails. -- CTF qui sera la zone dédiée au reverse proxy CTF et aux containers/VMs des environnements CTF. +- INT qui contiendra les containers des services permanents. La liaison entre INT et PROXY se fera à travers les reverses proxy NGINX et la Mail Gateway. -Les requêtes arriveront sur le pare-feu qui effectura un premier filtrage et transmettra les requêtes sur les ports 80 et 443 à un des loadbalancer, c'est le loadbalancer qui décidera ensuite si la requête sera retransmise à l'un des reverses de la zone KRKN ou au reverse de la zone CTF. +- CTF qui sera la zone dédiée au reverse proxy CTF et aux containers/VMs des environnements CTF. Le lien avec l'extérieur se ferra directement au niveau de la DMZ via HAProxy. -## Pour les connexions à la partie administration +Les requêtes arriveront sur le pare-feu qui effectura un premier filtrage et transmettra les requêtes sur les ports 80 et 443 à un des loadbalancer, c'est le loadbalancer qui décidera ensuite si la requête sera retransmise à l'un des reverses de la zone INT ou au reverse de la zone CTF. -L'accès à l'interface d'administration de Proxmox se fera par la voie classique, en cas de connexion à pve.krhacken.org, HAProxy vérifiera le certificat client et son CN avant de rediriger vers un des deux panels. +## Réseau Administation -L'accès au port 8006 (port par défaut de l'UI Proxmox) et au port 22 se fera par un VPN qui sera géré par le pare feu (OPNSense) sur la zone ADMIN. +L'accès au réseau administration se fera grâce à un VPN. Depuis le réseau administration on pourra accéder librement à tout les services hyperviseurs compris. Cela pourra par exemple permettre de mettre en place un système de monitoring. -Voilà un schéma (très simplifié) de la topologie globale du réseau (user et admin) - -![Topologie de la zone Route](schema_global.png) +De son côté l'accès à l'interface d'administration de Proxmox se fera aussi par la voie classique. En cas de connexion à pve.krhacken.org, HAProxy vérifiera le certificat client et son CN avant de rediriger vers un des deux panels. diff --git a/reseau/topologie_reseau_physique.md b/reseau/topologie_reseau_physique.md new file mode 100644 index 0000000..5bdeadf --- /dev/null +++ b/reseau/topologie_reseau_physique.md @@ -0,0 +1,9 @@ +# Topologie du réseau physique + +Chacune des nodes possède 4 interfaces réseau, pour des questions de redondance et de débit nous allons mettre 2 de ces interfaces en bond pour le réseau interne et la communication entre les deux serveurs. Les deux interfaces restantes seront utilisées pour l'accès à internet et pour le réseau d'administration. + +- eth0 sur une interface simple utilisé uniquement par OPNSense via WAN +- eth2 formera le bridge OVS ADMIN +- eth1 et eth3 formerons le bond OVS bond0 sur le bridge OVS interne + +Pour faire communiquer entre elles les deux nodes il y aura un switch physique sur lequel sera branché les quatres interfaces des nodes et l'entité de quorum. diff --git a/reseau/topologie_reseau_virtuel.md b/reseau/topologie_reseau_virtuel.md new file mode 100644 index 0000000..6513ca9 --- /dev/null +++ b/reseau/topologie_reseau_virtuel.md @@ -0,0 +1,46 @@ +# Topologie du réseau virtuel + +Rappel: +- eth0 sur un bridge OVS (WAN) accessible uniquement par OPNSense +- eth2 formera le bridge OVS Admin +- eth1 et eth3 formerons le bond OVS bond0 sur le bridge OVS Interne + +Pour chacune des zones (INT ou CTF) il y a deux types de VM/CT, + +- Ceux qui sont directement accessible depuis internet derrière OPNSense c'est les services frontend. +- Ceux qui sont accessible uniquement à travers une frontend c'est les services backend. + +## Les switchs virtuel + +- Un switch Administation pour toute les tâches d'administration avec comme lien extérieur eth2 +- Un switch Interne qui devra gérer, avec des VLANs, l'accès (filtré) à internet des services qui ne sont pas directement derrière le FW (Nextcloud, Git, Serveur Web...) en séparant le tout en plusieurs zones et les services qui sont directement derrière le FW (HAProxy, Proxy des services, Mail et DNS). Avec comme lien extérieur un bond entre eth1 et eth3. + +## Communication des switchs entre les nodes + +Tout les hyperviseurs auront une pâte sur le VLAN 100 sur chaque switch pour le protocole GRE qui permet l'échange entre les switchs virtuel de chaque nodes. + +## Services Frontend + +Concrètement les containers concernés auront des ports d'entrée DNAT vers eux ce qui signifie qu'ils seront accessible depuis internet à travers le firewall. C'est le cas de HAProxy, des Mails, du serveur DNS et du Proxy des services. + +Tout ces CT auront obligatoirement une pâte sur la VLAN 10 et une VLAN backend du switch Interne. + +## Services Backend + +Les containers ou VMs concerné ne seront pas accessible depuis internet cependant certain seront accessible par l'intermédiaire de HAProxy (entre autres). + +Cette parti sera découpé en plusieures zones, +- PROXY sur la VLAN 20 qui contiendra les reverses proxy public, +- INT sur la VLAN 30 qui contiendra tout les services de la partie krhacken, +- CTF sur la VLAN 40 qui contiendra le reverse proxy CTF et les environnement CTF, +- EXT sur la VLAN 50 qui contiendra les environnement de test. + +## Partie Internet + +Tout les containers et les VM Backend auront accès à internet via le proxy interne (en frontend). Pour cela ils auront tous une pâte sur la VLAN 80 du switch interne. + +## Partie Administration + +- Chaque hyperviseur ainsi que l'entité de Quorum aura une pâte sur la VLAN 10 du switch Administration pour le fonctionnement de Corosync. +- Toutes les VM, tout les CT, les hyperviseurs et l'entité de Quorum auront une pâte sur la VLAN 20 du switch Administration pour les tâches d'administration via le VPN ou localement en cas d'urgence. +- Chaque hyperviseur aura une pâte sur la VLAN 30 su switch Administration pour pfSync (HA du Firewall).