Una rete di distribuzione o un proxy chiude la connessione e ne apre una propria verso di te. Il tuo server vede perciò l'indirizzo del proxy a ogni richiesta, e questo rompe in silenzio tutto ciò che dipende dal sapere chi sta chiedendo.

Cosa si rompe

  • Il limite di frequenza: tutti i visitatori sono un unico indirizzo, quindi o si limitano tutti o nessuno.
  • I blocchi: fail2ban blocca il proxy, e con esso tutti quanti.
  • Registri e statistiche: un solo indirizzo per il mondo intero.
  • Le regole per paese: il paese del nodo di confine, non quello del visitatore.

Di' al server dove sta l'indirizzo vero

set_real_ip_from 173.245.48.0/20;
set_real_ip_from 103.21.244.0/22;
# ... the rest of the provider's ranges
real_ip_header CF-Connecting-IP;
real_ip_recursive on;
Fidati di quell'intestazione solo se arriva dagli intervalli del proxy stesso. Fidarsene da qualsiasi provenienza significa che chiunque può mandarla dichiarandosi l'indirizzo che preferisce, e la tua lista di blocchi diventa un'arma contro i tuoi stessi visitatori.

E dove si trova https

Se il proxy chiude il TLS, il tuo server vede semplice http e può decidere che il visitatore vada rimandato a https — dove si trova già. Ecco un ciclo di reindirizzamenti.

# PHP, before the framework loads
if ((@$_SERVER["HTTP_X_FORWARDED_PROTO"] ?? "") === "https") {
    $_SERVER["HTTPS"] = "on";
}

Verifica che abbia funzionato

tail -5 /var/log/nginx/access.log

Indirizzi veri e diversi fra loro vuol dire che è giusto. Lo stesso indirizzo su ogni riga vuol dire che non lo è.

Quando funziona, chiudi le porte 80 e 443 a tutto tranne che agli intervalli del proxy. Altrimenti chiunque scopra l'indirizzo della tua origine può aggirare del tutto il proxy.