Routing

Voyons maintenant comment permettre aux serveurs de se connecter à Internet. Nos serveurs flask vont envoyer une requête à un serveur externe, ici ipinfo.io, pour vérifier la connexion.

Rendez-vous dans Routing puis General.

Cliquez sur Enable puis Save.

Vous devez appercevoir un triangle blanc sur fond vert en haut à droite indiquant que le service de routage est lancé.

Rendez-vous dans Firewall, Rules puis LAN pour éditer les règles de pare-feu concernant cette interface.

Vous pouvez voir ici qu’aucune règle n’est présente par défaut. Donc, sauf exception, tous les paquets en provenance du LAN seront bloqués par le pare-feu.

Nous allons donc ouvrir le pare-feu pour tous les paquets en provenance du LAN. (Une fois de plus, cet exemple est simpliste, libre à vous de l’adapter dans vos environnements de production.)

Pour ajouter une règle, cliquez sur le signe +.

Ici, vous voyez la page de création d’une règle.

Attention : il est important de bien comprendre le point de vue du pare-feu et le point de vue du serveur. Ce qui est en sortie de nos serveurs Flask vers l’Internet est en entrée du pare-feu sur le LAN. (De même, ce qui va entrer sur le serveur va d’abord rentrer sur le pare-feu sur le WAN.)

Pour cela, cliquez sur le bouton plus pour ajouter une nouvelle règle. Choisissez Any dans le menu Protocol, puis cliquez sur Save en bas de page.

La règle apparaît, cependant le changement n’est pas encore pris en compte. Cliquez donc sur Apply changes.

Voilà, la règle de pare-feu est désormais active.

Nous pouvons maintenant vérifier que nos VM ont bien accès à Internet.

Pour cela, rendez-vous dans la console du pare-feu et entrez les commandes suivantes :

curl -X GET http://10.0.2.11:5000/test-connectivity
curl -X GET http://10.0.2.12:5000/test-connectivity

Pour plus de contexte, voici le code correspondant côté serveur :

@app.route('/test-connectivity', methods=['GET'])
def test_connectivity():
    try:
        response = requests.get("https://ipinfo.io/ip", timeout=5)
        response.raise_for_status()  # Ensure we catch any HTTP errors
        ip_address = response.text
        return jsonify(ip_address=ip_address), 200
    except requests.RequestException as e:
        return jsonify(error="Unable to reach the external service", details=str(e)), 503

Le serveur va donc envoyer une requête vers l’exterrieur et récupérer une réponse : son IP. Si tout fonctionne bien, le serveur doit vour répondre avec l’IP publique attribuée au pare-feu, car le réseau LAN est NATé.