Un pare-feu est un jeu de règles réutilisable, en entrée comme en sortie, que vous rattachez à vos machines. Il est appliqué par l'hyperviseur, avant que le trafic n'atteigne le système : rien à installer, il marche pareil sous Linux, Windows et BSD, et une erreur dans la machine ne peut pas le désactiver.
Ce qu'il filtre
- Une machine sans pare-feu accepte tout le trafic entrant, comme avant.
- Dès qu'une machine a au moins un pare-feu, le trafic entrant qu'aucune règle n'ouvre est jeté. Avec plusieurs pare-feux, leurs règles s'additionnent.
- Les réponses aux connexions de la machine passent toujours : mises à jour, téléchargements et appels d'API sortants ne demandent aucune règle.
- Ses réseaux privés ne sont jamais filtrés, pas plus que la console web du panneau, qui atteint la machine même si toutes les règles sont fermées.
- Le trafic sortant est libre tant qu'aucun pare-feu de la machine n'a de règle de sortie.
Créer un pare-feu
Une règle laisse entrer un protocole (tcp, udp,
icmp pour le ping en IPv4 et IPv6, ou any), sur des ports
("22", "80,443", une plage "8000-8100" ; absent :
tous les ports), depuis des sources (adresses ou plages IPv4 et IPv6 ; absent : partout).
curl -s -X POST https://api.ffxf.net/v1/firewalls \
-H "Authorization: Bearer $FFXF_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "web",
"rules": [
{"protocol": "tcp", "ports": "22", "sources": ["203.0.113.0/24", "2001:db8::/32"], "description": "SSH depuis le bureau"},
{"protocol": "tcp", "ports": "80,443", "description": "Web"},
{"protocol": "icmp", "description": "Ping"}
]
}'
{
"data": {
"id": 7,
"name": "web",
"rules": [
{ "protocol": "tcp", "ports": "22", "sources": ["203.0.113.0/24", "2001:db8::/32"], "description": "SSH depuis le bureau" },
{ "protocol": "tcp", "ports": "80,443", "sources": ["0.0.0.0/0", "::/0"], "description": "Web" },
{ "protocol": "icmp", "ports": null, "sources": ["0.0.0.0/0", "::/0"], "description": "Ping" }
],
"members": []
}
}
Sans rules, le pare-feu démarre avec SSH (TCP 22) et le ping ouverts
depuis partout ; envoyez "rules": [] pour n'en avoir aucune. Les adresses
sont ramenées à leur adresse de réseau (203.0.113.7/24 devient
203.0.113.0/24). Dix pare-feux par compte, cinquante règles par pare-feu,
vingt sources par règle.
Gardez une porte d'entrée. Un pare-feu qui n'ouvre pas TCP 22 (ou 3389 sous Windows) coupe SSH (ou le bureau à distance) sur toutes les machines qu'il protège. La console web marche toujours, mais un script ou un agent qui travaille en SSH perd sa machine.
Protéger une machine
curl -s -X POST https://api.ffxf.net/v1/firewalls/7/members \
-H "Authorization: Bearer $FFXF_TOKEN" \
-H "Content-Type: application/json" \
-d '{"vm": 4821}'
{ "data": { "vm": 4821, "hostname": "web-1", "status": "applied" } }
Les règles sont en place quand l'appel répond. Rattacher un pare-feu déjà rattaché
répond 200 : un script peut rejouer sa configuration sans risque. Jusqu'à
cinq pare-feux par machine. Une machine sans adresse publique n'en reçoit pas : elle
n'a rien à filtrer (409).
Changer les règles
PUT /firewalls/{id} avec rules remplace toute la
liste : décrivez l'état voulu, l'API l'applique à chaque machine rattachée
avant de répondre. Envoyez toutes les règles que vous gardez, pas seulement la nouvelle.
curl -s -X PUT https://api.ffxf.net/v1/firewalls/7 \
-H "Authorization: Bearer $FFXF_TOKEN" \
-H "Content-Type: application/json" \
-d '{"rules": [{"protocol": "tcp", "ports": "22"}, {"protocol": "tcp", "ports": "443"}]}'
pending_machines compte les machines que les nouvelles règles n'ont pas
encore atteintes (hyperviseur injoignable) ; elles portent
"status": "error" dans members et sont reprises
automatiquement en quelques minutes.
Détacher, supprimer
| Action | Appel | À savoir |
|---|---|---|
| Détacher | DELETE /firewalls/{id}/members/{vm} | Les règles du pare-feu quittent la machine. Sans autre pare-feu, elle accepte de nouveau tout le trafic entrant. |
| Renommer | PUT /firewalls/{id} avec name | Règles inchangées si rules est absent. |
| Supprimer | DELETE /firewalls/{id} | Refusé (409) tant qu'il protège une machine : le supprimer les ouvrirait toutes d'un coup. |
Règles de sortie
Une règle avec "direction": "out" laisse sortir du trafic, vers des
destinations au lieu de venir de sources. Tant qu'aucun pare-feu
d'une machine n'a de règle de sortie, tout peut sortir. Dès que l'un en a une,
seul sort ce que les règles de sortie ouvrent, plus ce qui reste
toujours permis :
- le DNS (port 53) vers les résolveurs que FFxF configure sur la machine ;
- les réponses aux connexions entrantes que le pare-feu a laissées passer ;
- le réseau privé.
{
"rules": [
{"protocol": "tcp", "ports": "22"},
{"direction": "out", "protocol": "tcp", "ports": "80,443", "description": "Mises à jour et HTTPS"},
{"direction": "out", "protocol": "tcp", "ports": "5432", "destinations": ["198.51.100.20"], "description": "Base externe"}
]
}
La première règle de sortie ferme tout le reste : sans la règle 80,443
ci-dessus, les mises à jour de paquets et les téléchargements s'arrêtent. Des
sources sur une règle de sortie, ou des destinations sur une
règle d'entrée, sont refusées (validation_failed) plutôt qu'ignorées. Sur
une machine sans IPv4, une destination IPv4 autorise aussi son adresse NAT64
(64:ff9b::/96), par laquelle cette machine joint l'IPv4. Le port 25 reste
fermé, quoi que disent les règles.
Détails utiles
Les lectures demandent la portée vms.read ; créer, modifier, rattacher et
supprimer demandent network.write. Le serveur MCP expose les mêmes
actions : voir Outils MCP.