# Architecture sécurisée des réseaux **Sujet** : https://perso.isima.fr/~frbreuil/tp_archi_secu_reseau/2021-2022/ ## Installation Modifier VirtualBox pour enregistrer les données dans /VM : Préférence > Général > Rentrer le nom Sur les VMs > Settings > Général > Changer le nom OpenBSD coté SAJ : - eth0 : MAC > 080027D08AA8 // IP > 192.168.102.96 - dmz : MAC > 080027D1A1D7 // IP > 10.0.0.1 - lan : MAC > 080027531EE8 // IP > 10.0.1.1 Regénérer @MAC --> permet de ne pas faire de conflits avec les autres machines de la salle Adresse IP => fichier hostname.*nom interface* contient soit "dhcp" soit l'adresse de l'interface Pour avoir le scroll on se connecte en SSH à la VM OpenBSD à l'adresse publique (192.168.102.96)(shift + pageUP/ shift + pageDOWN ça fonctionne aussi). Debian Bullseye coté SAJ : Par quel fichier de configuration est configurée l'addresse de son interface ? /etc/network/interfaces ![](https://i.imgur.com/hRcMRRV.png) Montre que l'adresse est setup en DHCP Adresse IP > 169.254.3.179 -> Car n'arrive pas à joindre le serveur DHCP Il faut mettre son adresse IP en statique (10.0.0.1) sudo vim /etc/network/interfaces Ajouter les lignes ``` Bash auto enp0s3 iface enp0s3 inet static address 10.0.0.2/24 gateway 10.0.0.1 ``` `systemctl restart networking` pour réinitialiser l'adresse IP `ifdown enp0s` pour "débrancher" le fil et `ifup enp0s3` pour rebrancher et ainsi actualiser l'adresse IP Windows : On les mets dans le réseau LAN niveau cartes réseau Windows 7 mdp = gonfle! Adresse d'autoconfiguration IPv4 > 169.254.85.114 --> A changer plus tard avec un serveur DHCP Windows 2004 = student Adresse d'autoconfiguration IPv4 > 169.254.136.4 ??? --> A changer plus tard avec un serveur DHCP `rcctl set dhcpd flags em1` <span style="color:red">Adresses en 169.254.x.x = pas d'adresses configurées (adresse APIPA)</span> ## Partie I : Le Firewall Last matching rule wins : on bloque tout en premier puis on autorise petit à petit (du plus général au plus précis) --> Dans PacketFilter et systèmes BSD ### Sécurisation par défaut en entrant depuis Internet /etc/pf.conf pour faire le changement de configuration Fichier avant modifs : ![](https://i.imgur.com/j2XpYGS.png) ``` Bash block drop in on em0 // Utile puisqu'il y a des block avant ??? pass in on em0 proto icmp ``` Commande pfctl -f /etc/pf.conf Reload le file et si il y a une erreur dedans ça l'indique et ça reload pas. Ping okay SSH ne marche pas depuis l'extérieur sur le firewall --> La règle marche bien ### Ouvrir uniquement les ports nécéssaires On autorise SSH sur le firewall depuis notre machine ``` Bash pass in on em0 proto tcp from 192.168.102.3 to em0 port 22 // Adresse Justine ``` On précise une destination avec l'interface et un port destination SSH On teste en se connectant à SSH depuis notre machine au firewall : ça marche ! Logger les connexions bloquées: ``` Bash block drop in log on em0 ``` --> Pas d'options nécéssaires On teste en prenant un PC non autorisé et en tentant une connexion SSH La connexion SSH ne marche pas Le log a sa propre interface (pflog0) donc pour capter si des logs sont enregistrés on tcpdump l'interface `tcpdump -n -e -i pflog0` On voit lors d'une connexion non autorisée un log qui apparait dans l'output de la commande On peut aussi faire pour visualiser les règles dans l'ordre `systat rules` Qui donne l'output suivant ![](https://i.imgur.com/AhdAR0h.png) Le fichier de règle à la fin de cette question est : ![](https://i.imgur.com/ELfMO9m.png) ### NATer la DMZ Déja en réseau interne, déja IP statique et gateway Elle est accessible depuis le firewall - *Pouvez vous vous connecter en tant que root via ssh depuis le firewall vers le serveur debian ? Pourquoi ?* On peut car le trafic est bloqué seulement sur l'interface entrante du firewall (em0) et non sur la sortie donc lui il peut pas pas les PC de l'extérieur Configurer NAT sur interface em1 de OpenBSD (pour que l'intérieur de la DMZ puisse accéder à Internet avec des adresses publiques) : Dans /etc/sysctl.conf : Régler configuration réseau et système Pour faire du NAT il faut autoriser le ip forwarding avec l'option net.inet.ip.forwarding à mettre à 1 --> Permet aux paquets de voyager entre les interfaces des machines Créer fichier : /etc/sysctl.conf car il existe pas et on ajoute la ligne net.inet.ip.forwarding=1 On reload ensuite (en redémarrant la machine car on ne trouve pas la bonne commande) On vérifie la valeur en faisant la commande `sysctl net.inet.ip.forwarding` --> La valeur est bonne Dans /etc/pf.conf : ``` pass out on em0 from 10.0.0.0/24 to any nat-to em0 ``` --> out on em0 parce que on veut que la translation se fasse en sortie du firewall vars Internet --> from 10.0.0.0/24 permet de cibler le flux à l'origine de ce réseau pour avoir Internet --> nat-to em0 pour mettre une adresse publique automatiquement Pour vérifier que la machine Debian a accès à Internet, on ping 8.8.8.8 (pas encore de résolution de noms de domaines donc pas de google.com) --> Ca marche Que faut t'il configurer pour que cette machine puisse résoudre des noms DNS ? /etc/resolv.conf On a déja dans ce fichier domain local.isima.fr qui fait de la résolution basique pour nous ### Configurer le serveur DHCP Configurer dhcpd : On créé le fichier /etc/dhcpd.conf dans OpenBSD On ajoute dedans les lignes : ``` option domain-name-servers 192.168.100.74; // Récupérer le DNS public (adresse IP dans resolv.conf) subnet 10.0.1.0 netmask 255.0.0.0 { range 10.0.1.2 10.0.1.10; option routers 10.0.1.1; // Route par défaut }; ``` dhcpd -n --> qu'est ce qui ne va pas dans le fichier de conf Pour recharger la configuration: ``` rcctl set dhcpd flags em2 rcctl enable dhcpd ``` Log dans /var/log/deamon pour voir qui demande des IP --> Les machines Windows ont bien des IP Windows 2004 : 10.0.1.2 Windows 7 : 10.0.1.3 (faut forcer pour qu'il réessaye) ### NATer les postes de travail Mode réseau interne déja fait, adresses DHCP récupérées sur les Windows. Configurer NAT sur em2 pour accéder à internet : Pas besoin de refaire de l'ip forwarding Dans /etc/pf.conf : ``` pass out on em0 from 10.0.1.0/24 to any nat-to em0 ``` Les postes de travail ont accès à Internet ### Port forwarding Machine hôte = PC Justine Justine doit pouvoir être connecté à la machine Debian en faisant ssh firewall -p 2222 directement Dans /etc/pf.conf: ``` pass in on em0 proto tcp from 192.168.102.3 to em0 port 2222 rdr-to 10.0.0.2 port 22 ``` --> on met l'adresse publique du firewall car c'est à lui que le client peut accéder Pour tester `ssh test@192.168.102.96 -p 2222` --> Ca marche depuis la machine de Justine et pas depuis la machine de Stacy donc c'est nice Fichier /etc/pf.conf après modifications : ![](https://i.imgur.com/Fx1q1dH.png) ### Redirection de ports pour l'accès public Redirection les connexions de l'extérieur à destination de HTTP vers Debian : Dans /etc/pf.conf: ``` pass in on em0 proto tcp from any to em0 port 80 rdr-to 10.0.0.2 ``` En tapant l'adresse IP du firewall dans un navigateur on obtient une page web valide Où sont stockés les fichiers journaux du serveur HTTP ? /var/log/lighttpd/error.log --> On n'a pas les permissions et c'est seulement our les erreurs On y accède avec `journalctl -u lighttpd` Vérifier que les connexions faites sont bien enregistrées. Si ce n'est pas le cas, que faut il faire pour logguer chaque requête faite par un client ? Pour voir les connexions, on regarde dans le fichier */etc/lighttpd/lighttpd.conf* Il n'y a pas de fichier pour accesslog donc on va rajouter la ligne `accesslog.filename = "/var/log/lighttpd/access.log"` Ca va enregistrer nos connexions dans le fichier précisé. Dans */etc/lighttpd/lighttpd.conf* on ajoute "mod_accesslog" dans server_module: ![](https://i.imgur.com/Nlw7SXa.png) Résultat dans le fichier : ![](https://i.imgur.com/XiDkHcN.png) ### Filtrage sortant Dans /etc/pf.conf : Pour filtrer les accès à Internet depuis le LAN ``` block drop in on em2 pass in on em2 proto tcp from any to any port {80,443} ``` On tente de se connecter à Internet depuis une VM Windows pour voir si ça marche et ça c'est bon. Le ping ne passe pas par contre. Autoriser le ping: ``` pass in on em2 proto icmp ``` Le ping marche mais pas sur un nom de domaine car on n'autorise pas le dns Autoriser DNS: ``` pass in on em2 proto udp from any to any port 53 ``` Bonne pratique : mettre log sur toutes les règles pour voir quelle requête passe avec quelle règle puis vérifier avec tcpdump Fichier après modification : ![](https://i.imgur.com/011lqHq.png) ### Filtrage simple des connexions bruteforce On veut modifier la règle faisant le port forwarding vers Debian Dans /etc/pf.conf: ``` pass in on em0 proto tcp from 192.168.102.3 to em0 port 2222 rdr-to 10.0.0.2 port 22 keep state (max-src-conn-rate 3/60, overload <bad_hosts> flush global) ``` --> 3/60 = 3 connexions échouées en 60 secondes --> <bad_hosts> est une table présente dans la doc et on suppose qu'elle existe On essaye de se connecter 3 fois et au bout de la 4ème on a plus de réponse de la machine Observer la table PF: `pfctl -t bad_hosts -T show` ![](https://i.imgur.com/ivwsq3U.png) Enlever le blacklistage : `pfctl -t bad-hosts -T delete 192.168.102.4` ![](https://i.imgur.com/notOKUB.png) Comment faire pour s'assurer que certaines IP ne seront jamais blacklistées ? Création d'une table whitelist et autorisation des addresses de cette tables à se connecter sans connection rate maximal : ``` table <whitelist> {192.168.102.4} pass in on em0 proto tcp from <whitelist> to am0 port 2222 rdr-to 10.0.0.2 port 22 ``` ![](https://i.imgur.com/daPobL1.png) ## Partie II : Le VPN Avant mise en place iked : - noter les configurations réseau/tables de routage : Sur le firewall ![](https://i.imgur.com/JIbfIEC.png) Sur Windows ![](https://i.imgur.com/bBMwvb0.png) - tester la connectivité via ping, la résolution DNS via nslookup `ping 192.168.102.96` ![](https://i.imgur.com/cEaw87E.png) `nslookup google.com` ![](https://i.imgur.com/hL6kz7N.png) - faire une connexion avec nom d'utilisateur/mot de passe en clair (telnet/FTP) et écouter le traffic via wireshark sur la machine hôte, simulant ainsi un attaquant potentiel Aller sur ent.uca.fr et entrer des identifiants bidon et capturer le trafic en clair avec wireshark Après mise en place du VPN : - noter les configurations réseau/tables de routage - tester la connectivité via ping, la résolution DNS via nslookup - faire une connexion avec nom d'utilisateur/mot de passe en clair (telnet/FTP) et écouter le traffic via wireshark sur la machine hôte, simulant ainsi un attaquant potentiel ### IKEv2 #### Utilisation de ikectl ![](https://i.imgur.com/paSPAmr.png) S'assurer d'un heure correcte via la commande `rdate poll.ntp.org` Création d'une CA : `ikectl ca serveurPKI create` ![](https://i.imgur.com/zkphMKI.png) Implique la création de fichiers : ![](https://i.imgur.com/aoxmMUX.png) ![](https://i.imgur.com/NZqPFs1.png) La machine windows étant à l'extérieur, son addresse IP est 192.168.102.121 Création du couple de clés : - Création des certs Pour le client, (**attention** il faut préciser l'IP du client Windows dans CN, ou par defaut) : `ikectl ca serveurPKI certificate 192.168.102.121 create` ![](https://i.imgur.com/HFLblw0.png) Pour le serveur (**attention** même nom que le CN) : `ikectl ca serveurPKI certificate 192.168.102.96 create` ![](https://i.imgur.com/T8ZPaho.png) - Installation en local des certificats du serveur : `ikectl ca serveurPKI install` `ikectl ca serveurPKI certificate 192.168.102.96 install` ![](https://i.imgur.com/sNmVN8b.png) - Export pour récupérer les certificats de la machine (peer) `ikectl ca serveurPKI certificate 192.168.102.121 export` (préciser un mdp: client) ![](https://i.imgur.com/BWRUCsm.png) Transfert vers la machine windows : 1. `scp doc.tgz test@10.0.0.2:~/` ![](https://i.imgur.com/o5qgn3g.png) ![](https://i.imgur.com/S2fGaf1.png) 2. Copie du doc vers notre home ![](https://i.imgur.com/45XSKwm.png) 3. Décompression `tar -xzpf doc.tgz -C /var/www/html` ![](https://i.imgur.com/1nYWf1d.png) 4. Autoriser le listing de directory sur le serveur web. Ajouter l'option `server.dir-listing="enable"` dans le fichier `/etc/lighttpd/lighttpd.conf` #### Configuration serveur OpenBSD 1. Il faut que le nom du certificat soit le nom du Common Name donné lors de la génération du certificat (screen avant modification du CN ci-dessous). 2. Création d'un fichier `/etc/iked.conf` en mode 640 (`iked -n` pour vérifier la config) ![](https://i.imgur.com/hlTlvwQ.png) ![](https://i.imgur.com/vam7WTc.png) 3. Autoriser IPsec à passer sur le réseau ![](https://i.imgur.com/gDyP0xP.png) 4. Ajout de l'authentification CHAP-V2 ![](https://i.imgur.com/6xWfY8y.png) --> Il faut remplacer from any to 10.0.0.0/24 par from any to dynamic Démarrer le VPN, et s'assurer qu'il fonctionne correctement en observant les fichiers journaux du système, la liste des interfaces, ainsi que les serveurs en écoute. Démarrer le VPN : `iked -S` ![](https://i.imgur.com/FapfS9K.png) Option pour le démarrer en foreground et très verbeux `iked -dv` On voit que les clés et certificats ne sont pas au bon endroit(je sais pas comment) Il faut ajouter donc les clés du serveur (create et install) ainsi que **copier** les certificats du client pour que le serveur sache qui va se connecter à lui ![](https://i.imgur.com/2gaoqFr.png) Quand ils le sont on a des nouvelles lignes ca... avec un OK à la fin Une nouvelle interface est apparue *enc0*. -> Nop, toujours là ![](https://i.imgur.com/qxMc2Xz.png) Les serveurs en écoute avec la commande `netstat -lnt` On peut voir que le port *4500* est en écoute, c'est le port précisé par iked (cf. affichage ci-dessus). ![](https://i.imgur.com/TkflcQC.png) Activer iked(8) au démarrage de la VM. `rcctl enable iked` Quelles sont les régles de firewalling à ajouter pour qu'un client puisse se connecter au VPN ? Voir screen pf.conf Quels sont les fichiers de clefs de la PKI qui vont être utilisés par le serveur ? les .crt ??? Quelles sont les IP utilisées par le VPN ? 10.0.2.0/24 normalement ? #### Configuration client Windows Dans Virtualbox, reconfigurer l'interface de la machine virtuelle Windows pour qu'elle soit en mode pont sur eth0. Vérifier qu'elle récupère bien une adresse via DHCP depuis le serveur de la salle. -> OK, adresse 192.168.102.121 Quels sont les fichiers/certificats transmis au client ? Le .tgz entier donc avec tout ses bidules au client ![](https://i.imgur.com/O0kW8lD.png) Quels sont les paramêtres à utiliser pour la configuration du client ? Il faut importer les certificats dans le certificate store local de la machine Windows oir/debugguer le traffic passant à travers le `mmc` dans cmd "Ajouter/supprimer un composant logiciel" --> Liens MMC : https://www.thesslstore.com/knowledgebase/ssl-install/how-to-import-intermediate-root-certificates-using-mmc/ https://wiki.strongswan.org/projects/strongswan/wiki/Win7Certs Ajouter le Certificate store. Dans **Personal**, click droit, importer : on ajoute le certificat client. Dans **Trusted Certification Authorities**, same : on ajoute le certificat CA. Pour se connecter, cherche VPN dans les paramètre Windows et ajouter notre serveur, ainsi que nos identifiants : ![](https://i.imgur.com/5CL5Xhn.png) ![](https://i.imgur.com/gFFsWsT.png) Resolution : mettre IKEv2 en type de réseau privé virtuel ![](https://i.imgur.com/mAK6hNS.png) Résolution : mettre tout par défaut dans les certificats (noms doivent être les même que le CN) ![](https://i.imgur.com/KYcLccc.png) On a une adresse dans 10.0.2.0/24 donc c'est bien Test du ping vers 10.0.0.2: Marche pas Règle à mettre (merci Andy): ``` pass in on em0 proto udp from any to 192.168.102.96 port {500,4500} pass in on em0 proto esp from any to 192.168.102.96 pass in on enc0 proto tcp from 10.0.2.0/24 to 10.0.0.2 port http ``` Test du ping vers 10.0.0.2: C'est bon ![](https://i.imgur.com/mKrX00y.png) Le curl marche aussi ! #### Route par défaut ? 2 modes: - Uniquement pour le traffic à destination des réseaux privés du coté du serveur. Tout le reste du traffic passe par la connexion internet existante, et n'est pas chiffré. - Tout le traffic passe par le VPN. C'est la configuration par défaut du client IKEv2 de windows. Comment modifier ce comportement ? Pour modifier le comportement par défaut du client IKEv2 Windows on fait... https://forums.clavister.com/viewtopic.php?t=6089 Split tunneling https://windowsreport.com/fr/tunnel-divise-vpn-win-10/ Avec ce tuto on dirait que la configuration split tunneling est deja faite par défaut, c'est bizarre. On décoche Utiliser passerelle par défaut Changer la configuration du VPN : ![](https://i.imgur.com/WacJCWg.png) Dynamic = adresse des clients VPN from ... = je suis le VPN et j'ai tels réseaux derrière --> de base on avait any donc tout les réseau donc le client passait par là mais maintenant on dit qu'on a que le réseau local 10.0.0.0/24 On arrive à ping google --> il ne passe pas par le VPN On arrive à curl 10.0.0.2 --> il passe par le VPN pour allez sur le réseau local Comment voir/debugguer le traffic passant à travers le VPN ? Avec tcpdump -nei enc0 // interface du VPN ipsecctl -sa --> on voit les sous réseaux qui sont connectés au VPN Quels sont les avantages/inconvénients des deux méthodes ? Google Comparer l'utilisation du réseau en utilisant les deux méthodes. Le firewall est moins chargé et le VPN aussi donc connexion plus rapide ? Quelles sont les différentes méthodes possibles pour que les réseaux 10.0.0.0/24 et 10.0.2.0/24 se "voient" ? On tente de ping 10.0.2.227 (la windows) depuis le serveur web et ça ne marche pas donc partie VPN peut voir partie "DMZ" mais pas l'inverse Pour débloquer, on peut enlever des règles de firewall entre les deux Il faut aussi la règle from 10.0.0.0/24 to dynamic Que faut il configurer sur le firewall pour qu'un client VPN puisse accéder à internet ? Un serveur DNS ??? Tenter une connexion SSH depuis le client VPN vers le serveur dans l'autre sous-réseau. ssh test@10.0.0.2 --> Marche sans redirection puisque c'est seulement de l'extérieur qu'on fait le port 2222 ### Jonction de deux sites On fait une configuration site-to-site plutot que client/serveur Il faut suivre la page de FAQ http://www.openbsd.org/faq/faq17.html On prends la clé du serveur 2 (/etc/iked/local.pub) dans le serveur 1 (/etc/iked/pubkeys/fqdn/serveur2.domain) et inversement. On a pas besoin de déplacer notre local.pub à nous, c'est fait automatiquement. em0 est une adresse publique donc pas besoin de la changer. On change l'adresse du réseau LAN pour éviter les conflits --> pour serveur 1 c'est 10.0.3.0/24 (dans bullseye /etc/network/interfaces et on restart networking) On devra aussi choisir une autre adresse de translation VPN serveur 2 = 192.168.102.98 serveur 1 = 192.168.102.96 Dans pf.conf ``` pass in log on em0 proto udp from 192.168.102.98 to em0 port {isakmp, ipsec-nat-t} tag IKED pass in log on em0 proto esp from 192.168.102.98 to em0 tag IKED ``` Dans iked.conf (serveur 1 - responder): On commente l'ancienne configuration de VPN ``` ikev2 'serveur1_rsa' passive esp \ from 10.0.3.0/24 to 10.0.2.0/24 \ local 192.168.102.96 peer 192.168.102.98 \ srcid serveur1.domain ``` Dans iked.conf (serveur 2): ``` ikev2 'serveur2_rsa' active esp \ from 10.0.2.0/24 to 10.0.3.0/24 \ peer 192.168.102.96 \ srcid serveur2.domain ``` On redémarre tout (rcctl restart iked; iked -S) iked -dv ???? Sur la page FAQ ça dit "Using iked -dv can help you understand the exchange" mais c'est un peu complexe ipsecctl -sa ## Partie III : CARP/Pfsync https://www.it-connect.fr/fail-over-pfsense-via-carp-et-pfsync/ ### Généralités cloner la machine virtuelle OpenBSD (on aura donc fw1 et fw2) ne pas oublier de réinitialiser les adresses MAC : network > advanced > reinit changer son hostname : hostname nom supprimer les clefs ssh dans /etc/ssh/ pour éviter des alertes de ssh (elles seront regénérées au démarrage de la VM) Dans les deux firewall : dans VirtualBox, activer une 4e interface physique dans la configuration réseau (support a pfsync) > internal network, name = firewall_internal (réseau distinct de dmz et lan pour simuler une connection directe entre les 2 machines) dans VirtualBox, choisir 'tout autoriser' pour le mode promiscuité des 3 premières interfaces (nécessaire pour le bon fonctionnement de carp dans virtualbox) --> network > promiscious mode > allow all dans OpenBSD, modifier les configurations des deux firewall pour que chacune des interfaces 'clones' se retrouvent dans le même sous-réseau : * em0 reste en DHCP sur fw1 et fw2, qui doivent donc chacun récupérer une IP publique distincte * em1 sur fw1 aura l'addresse 10.0.0.100 et 10.0.0.200 sur fw2 * em2 sur fw1 aura l'addresse 10.0.1.100 et 10.0.1.200 sur fw2 * em3 sur fw1 aura l'addresse 10.0.10.1 et 10.0.10.2 sur fw2, sur un sous-reseau en /30 (c'est l'interface pour pfsync(4)) en faisant des cat et modifiant /etc/hostname.emX on peut voir les adresses ou si c'est en DHCP ou non et ajouter des adresses statiques fw_1 : - em0 : 192.168.102.96 (bien en DHCP) - em1 : 10.0.0.100/24 - em2 : 10.0.1.100/24 - em3 : 10.0.10.1/30 fw_2 : - em0 : 192.168.102.161 (bien en DHCP) - em1 : 10.0.0.200/24 - em2 : 10.0.1.200/24 - em3 : 10.0.10.2/30 - ### Failover https://www.openbsd.org/faq/pf/carp.html Activer PfSync: vi /etc/hostname.pfsync0 Dedans on ajoute : up syncdev em3 --> On lie les deux firewall (à faire dans les 2) Activer CARP: sysctl -w net.inet.carp.allow=1 Activer la préemption (pour bascule automatique): sysctl -w net.inet.carp.preempt=1 Les modifications CARP peuvent se faire via ifconfig mais ces changements sont temporaires. Il faut donc créer des fichiers hostname Sur fw1: vi /etc/hostname.carp0 -->inet 192.168.102.200 255.255.255.0 192.168.102.255 vhid 200 carpdev em0 pass carp0 vi /etc/hostname.carp1 -->inet 10.0.0.1 255.255.255.0 10.0.0.255 vhid 1 carpdev em1 pass carp1 vi /etc/hostname.carp2 -->inet 10.0.1.1 255.255.255.0 10.0.1.255 vhid 2 carpdev em2 pass carp2 Sur fw2, on créé aussi les fichiers mais au lieu de mettre les adresses des interfaces on garde les adresses des interfaces du fw1 à redonder. Sur fw2: vi /etc/hostname.carp0 -->inet 192.168.102.200 255.255.255.0 192.168.102.255 vhid 200 carpdev em0 pass carp0 advskew 100 vi /etc/hostname.carp1 -->inet 10.0.0.1 255.255.255.0 10.0.0.255 vhid 1 carpdev em1 pass carp1 advskew 100 vi /etc/hostname.carp2 -->inet 10.0.1.1 255.255.255.0 10.0.1.255 vhid 2 carpdev em2 pass carp2 advskew 100 On reload les interfaces: sh /etc/netstart Comment est utilisée la valeur fournie via advskew ? Plus la valeur est grande, moins l'hote à de chance de devenir master et donc d'avoir la priorité --> on dévie la advbase de plus en plus lors des publication CARP Mettre une passphrase pour éviter les intrusions Les adresses et vhid à mettre sont dans le TP On met un vhid unique sur l'interface extérieure pour éviter les conflit avec les autres groupes Autoriser le traffic du protocole carp : ``` pass on {em0 em1 em2} proto carp keep state (no-sync) set skip on pfsync0 ``` Modifications du VPN (iked.conf dans les 2 firewall): ![](https://i.imgur.com/YP30SgO.png) La local est l'adresse publique du firewall (carp0) Ce principe de failover permet d'éviter de devoir refaire toutes les règles de firewall puisqu'on prends uniquement les interfaces carp en compte. Changement des règles de réseau pas au niveau pass in on em0 mais plutot pour les parties où les noms d'interfaces remplacent des adresses IP précises (to... par exemple). On modifie dans les règles de nat et de manière générale dans toutes les règles utiles à ce moment là Les clients connectés sur dmz et lan devraient avoir accès à Internet --> depuis la dmz c'est bon Que faut il faire pour que le VPN marche sur l'ip flottante ? ip flottante = carp0 ![](https://i.imgur.com/YP30SgO.png) La local est l'adresse publique du firewall (carp0) Il faut aussi modifier l'adresse du serveur dans le client VPN Est-ce que le VPN peut gérer le failover ? Oui puisqu'il se connecte à l'ip flottante vérification des états de connexions bien synchronisés : systat states ![](https://i.imgur.com/veaoFAC.png) On voit bien des connexions carp Il faut que les connexions soient identiques sur le résultat des deux firewall (carp et autres). Ca indique que la redondance est faite et qu'en eteignant le master ça change rien à la co des utilisateurs Si il n'y a pas la même chose c'est que pfsync ne marche pas Pour vérifier, on fait un ping depuis debian vers 8.8.8.8 et on le laisse tourner, on éteint le fw1 et si le ping continue malgré le firewall éteint c'est que fw2 a pris le relais Certains états ne devraient pas être synchronisés, lesquels, pourquoi, et comment s'assurer qu'ils restent locaux a chacun des firewall ? ??? Faut t'il modifier la rêgle de NAT pour les différents réseaux ? il faut faire nat-to carp0 et non em0 pour que ça marche même en cas de failover (sinon ça translate sur un réseau dirigé que par un firewall...) Quels sont les conséquences sur les paquets en provenance des sous-réseaux ? Ils sont natés et ils peuvent sortir sur Internet ? La bascule se fait bien lorsque l'on coupe un firewall (le ping jusqu'à la machine debian ne s'arrête pas). ### Load balancing SI QUELQU'UN TROUVE COMMENT FAIRE MARQUEZ SVP Commande exemple : `ifconfig carp0 192.x.x.x carpdev em0 carpnodes 1:0,2:100` *(vhid:advskew)* Carpnodes permet de définir le load balancing sur les carp ayant les vhid 1 et 2. Si une machine a 1:0 et l'autre 1:100, la première sera préférée à la seconde en terme de load balancing, pour le carp ayant le vhid 1. donc il faut alterner parmi les carp pour que les machines se les partagent et donc se partagent la charge. Dans un des fichiers carp (genre hostname.carp0) inet 192.168.102.200 255.255.255.0 192.168.102.255 carpdev em0 vhid 200 pass carp0 DEVIENS inet 192.168.102.200 255.255.255.0 192.168.102.255 carpdev em0 carpnodes 1:0, 2:100 --> sur l'autre firewall on fera 1:100, 2:0 Mode IP Mode ARP balancing arp ? net.inet.carp.arpbalance ## Partie IV : Reverse Proxy ### Généralités ![](https://i.imgur.com/8uZmccc.png) ### Proxy niveau 3 / redirection web avec loadbalancing Faire un clone : Quels sont les fichiers a remodifier sur le clone ? Vérifier que les deux firewall peuvent y accéder. Une fois le clone fait, il faut modifier : - */etc/network/interfaces* sur la machine pour modifier l'addresse en 10.0.0.3 et faire `systemctl restart networking` - */etc/pf.conf* sur les firewall, copier la règle de redirection de port SSH `pass in on em0 proto tcp from any to carp0 port 2223 rdr-to 10.0.0.3 port 22` - */var/www/html/index.html* sur la machine pout savoir quel serveur répond. Curl pour tester les modifs de la page, depuis l'autre debian parce que flemme LUL Ne pas oublier d'activer le logging des requêtes dans les configurations de lighttpd (lighttpd-enable-mod accesslog). Suivre le log via tail -f /var/log/lighttpd/access.log. *Configurer un relai dans relayd(8) pour qu'il distribue les requêtes sur le port 80 sur les deux serveurs web, en mode round-robin (les requêtes vont arriver alternativement sur les deux serveurs. Quels sont les autres modes ?)* Pour configurer relayd : - Créer le fichier de configuration */etc/relayd.conf* sur fw1 ``` redirect "www" { listen on 192.168.102.200 port 80 forward to 10.0.0.2 check http "/" code 200 mode roundrobin forward to 10.0.0.3 check http "/" code 200 mode roundrobin } ``` - Reload relayd `relayd -f /etc/relayd.conf` c'est plutôt :`relayd -n` Autre modes que round robin : - **mode hash** [key] Balances the outgoing connections across the active hosts based on the key, IP address and port of the relay. Additional input can be fed into the hash by looking at HTTP headers and GET variables; see the PROTOCOLS section below. This mode is only supported by relays. - **mode least-states** Forward each outgoing connection to the active host with the least active pf(4) states. This mode is only supported by redirections. - **mode loadbalance** [key] Balances the outgoing connections across the active hosts based on the key, the source IP address of the client, and the IP address and port of the relay. This mode is only supported by relays. - **mode random** Distributes the outgoing connections randomly through all active hosts. This mode is supported by redirections and relays. - **mode roundrobin** Distributes the outgoing connections using a round-robin scheduler through all active hosts. This is the default mode and will be used if no option has been specified. This mode is supported by redirections and relays. - **mode source-hash** [key] Balances the outgoing connections across the active hosts based on the key and the source IP address of the client. This mode is supported by redirections and relays. *Que faut t'il configurer dans pf(4) pour que relayd puisse fonctionner correctement ? Observer les règles PF et les tables.* Il faut supprimer la règle de redirection vers le port 80 de la machine 10.0.0.2 pour qu'il ne redirige pas directement vers cette machine uniquement. relayctl show summary -> on voit bien nos connexions cat /var/log/daemon -> voir les logs dans pf.conf il faut ajouter : anchor "relayd/*", puis reload relayd.conf pf.conf va remplacer cette anchor par les règles créées automatiquement par relayd (notamment pour liste et les redirect) ![](https://i.imgur.com/K3zUE2o.png) Marche, donne les pages des deux serveurs une fois sur 2 #### Failover Quand on éteint un serveur, une seule des deux pages s'affiche (normal) Vérification de la somme de contrôle de la page donnée sur le serveur web avant de forwarder la requête: ![](https://i.imgur.com/Qyv6aw0.png) Le digest est obtenu grâce à la commande "ftp -o -http://*adresse_serveur* | sha1" Sachant que les deux html sont les mêmes, on voit bien que les deux sont up quand on fait "relayctl show summary" ![](https://i.imgur.com/hdWryAn.png) MAIS quand on change un des deux html on voit que un des deux est down. ![](https://i.imgur.com/g7l6NwE.png) Modifier le contenu d'une page pour tester ce contrôle. A quoi sert ce mode ? Cela permet d'avoir une vérification plus poussée que juste en vérifiant avec un ping. Configurer un fallback : 2ème instruction de forward to dans une autre liste `table <fallback> disable { 10.1.5.1 retry 2 }` #### Reverse proxy simple relai niveau 7 reverse-proxy dit applicatif reverse proxy lui-même qui ouvre la connection vers le serveur final, va faire la requête, et transmettre le résultat au client qui attend sur la connection que ce dernier a ouvert avec le reverse-proxy - mais c'est transparent pour le client Rajouter un virtual host: Dans un des serveurs web, https://www.osradar.com/configure-virtual-hosts-lighttpd/ ``` mkdir -p /var/www/html/www.test chmod -R 755 /var/www/html/www.test chown -R www-data:www-data /var/www/html/www.test cat "<html><body>welcome to www.test2.osradar.lan </body></html>" | /var/www/html/www.test/index.html mkdir -p /etc/lighttpd/vhosts.d/ ``` Ajouter la ligne : include_shell "cat /etc/lighttpd/vhosts.d/*.conf" à la fin de /etc/lighttpd/lighttpd.conf ``` vi /etc/lighttpd/vhosts.d/www.test.conf ``` ![](https://i.imgur.com/0ahFrah.png) ``` systemctl restart lighttpd ``` On ajoute 192.168.102.200 www.test dans le /etc/hosts du client (un PC hôte à l'extérieur du firewall) Relays will forward traffic between a client and a target server. In contrast to redirections and IP forwarding in the network stack, a relay will accept incoming connections from remote clients as a server, open an outgoing connection to a target host, and forward any traffic between the target host and the remote client, operating on layer 7. A relay is also called an application layer gateway or layer 7 proxy. Pour configurer relayd, on va faire relay et non redirection comme pour le niveau 3 relayd -n Attention, pour relayd ce n'est plus une redirection niveau 3, mais un relai niveau 7. Pourquoi ? Bonne question, parce qu'il y a une URL ? Parce qu'il analyse la requête maintenant. Il est intelligent, relayd recoit direct la requête et l'analyse lui même sans besoin de pf --> Il n'y a plus besoin d'anchor et il faut une règle pour autoriser les paquets à arriver sur le port 80 sinon rien n'arriverait à relayd ![](https://i.imgur.com/59wdRGs.png) On vérifie le nom de domaine demandé puis on forward au bon serveur Dans chacun des cas, quelle est l'ip cliente enregistrée dans le log de serveurs web ? Que faut t'il faire dans la configuration de relayd pour que le serveur web ait une information correcte ? tail -f /var/log/lighttpd/access.log 10.0.0.100 --> @ carp Pour mettre la vraie adresse de la source, il faut faire un match-address ? ![](https://i.imgur.com/zrreY5k.png) ![](https://i.imgur.com/5wWEjW4.png) ## Partie V : Proxy sortant ### Généralités Un proxy peut-être configuré de deux manières principales : en mode transparent/interception: l'utilisateur ne sait pas qu'il passe par un proxy, c'est le firewall qui détourne les requêtes du client sur le port 80 de manière transparente vers le proxy en mode classique: le navigateur/poste client doit être configuré pour utiliser le proxy sur un couple adresse:port connu. Dans ce cas, le proxy peut demander une authentification au client pour faire du suivi. Généralement dans ce cas le firewall bloque complètement l'accès au port 80 en sortant pour obliger tout les clients à passer par le proxy. On parle de proxy sortant quand on reçoit la requête d'un client interne à notre réseau à destination d'un serveur web à l'extérieur, et on ne la transmet pas directement à la cible - on va d'abord l'analyser pour savoir si cette requête est légitime, ou cacher éventuellement la réponse pour la resservir à un autre futur client. ### Proxy filtrant ![](https://i.imgur.com/84ZVzmz.png) /etc/tinyproxy.conf https://wiki.deimos.fr/TinyProxy_:_Mise_en_place_d%27un_proxy_simple_et_rapide.html /etc/tinyproxy/filter --> liste des adresses à bloquer (isima.fr) Dans /etc/tinyproxy.conf Filter "/etc/tinyproxy/filter" rcctl restart tinyproxy Reconfigurer le navigateur dans les clients du LAN pour utiliser l'ip et le port du proxy (pour tout les protocoles y compris ssl). Quelle IP:port utiliser ? ### Proxy cache