xpeditis2.0/infra/prod/scripts/refresh-cloudflare-ips.sh
2026-09-07 21:40:50 +02:00

89 lines
3.0 KiB
Bash
Executable File

#!/usr/bin/env bash
# =============================================================================
# Rafraichissement des rangs d'IP Cloudflare
# =============================================================================
# Cloudflare fait evoluer ses rangs. Deux endroits en dependent :
# - terraform/firewall.tf (qui peut atteindre 80/443 sur app-01)
# - la configuration Traefik (quelles IP ont le droit d'ecrire X-Forwarded-For)
#
# Une liste perimee produit deux pannes distinctes et peu evidentes :
# - du trafic legitime rejete par le firewall Hetzner ;
# - une IP client mal identifiee, donc une limitation de debit qui frappe
# tout le monde et des audit_logs faux.
#
# A relancer tous les trimestres, et systematiquement avant un `terraform apply`.
#
# bash scripts/refresh-cloudflare-ips.sh # compare et affiche
# bash scripts/refresh-cloudflare-ips.sh --write # met a jour firewall.tf
set -euo pipefail
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
TF_FILE="${HERE}/../terraform/firewall.tf"
WRITE=false
[[ "${1:-}" == "--write" ]] && WRITE=true
echo ">>> Recuperation des rangs officiels Cloudflare"
V4="$(curl -fsS --max-time 15 https://www.cloudflare.com/ips-v4)"
V6="$(curl -fsS --max-time 15 https://www.cloudflare.com/ips-v6)"
[[ -n "$V4" && -n "$V6" ]] || { echo "Reponse vide de Cloudflare, abandon." >&2; exit 1; }
echo
echo "IPv4 ($(echo "$V4" | wc -l | tr -d ' ') rangs) :"
echo "$V4" | sed 's/^/ /'
echo
echo "IPv6 ($(echo "$V6" | wc -l | tr -d ' ') rangs) :"
echo "$V6" | sed 's/^/ /'
echo
echo ">>> Rangs actuellement declares dans firewall.tf :"
grep -oE '"[0-9a-f:.]+/[0-9]+"' "$TF_FILE" | tr -d '"' | sort -u | sed 's/^/ /'
DIFF=$(diff <(printf '%s\n%s\n' "$V4" "$V6" | sort -u) \
<(grep -oE '"[0-9a-f:.]+/[0-9]+"' "$TF_FILE" | tr -d '"' | sort -u) || true)
if [[ -z "$DIFF" ]]; then
echo
echo ">>> Aucune difference : rien a faire."
exit 0
fi
echo
echo ">>> DIFFERENCES DETECTEES :"
echo "$DIFF"
if ! $WRITE; then
cat <<'MSG'
Relancez avec --write pour mettre a jour terraform/firewall.tf, puis :
cd terraform && terraform plan && terraform apply
Pensez aussi a reporter la liste dans la configuration Traefik :
/var/lib/rancher/k3s/server/manifests/traefik-config.yaml (sur app-01)
puis : sudo systemctl restart k3s
MSG
exit 2
fi
BLOCK_V4=$(echo "$V4" | sed 's/^/ "/; s/$/",/')
BLOCK_V6=$(echo "$V6" | sed 's/^/ "/; s/$/",/')
python3 - "$TF_FILE" <<PY
import re, sys
path = sys.argv[1]
src = open(path).read()
src = re.sub(r'(cloudflare_ipv4 = \[\n).*?(\n \])',
lambda m: m.group(1) + """${BLOCK_V4}""".rstrip(',') + m.group(2),
src, flags=re.S)
src = re.sub(r'(cloudflare_ipv6 = \[\n).*?(\n \])',
lambda m: m.group(1) + """${BLOCK_V6}""".rstrip(',') + m.group(2),
src, flags=re.S)
open(path, 'w').write(src)
print("firewall.tf mis a jour")
PY
echo
echo ">>> Verifiez le diff avant d'appliquer :"
echo " git diff infra/prod/terraform/firewall.tf"
echo " cd infra/prod/terraform && terraform plan"