Sia che si stia eseguendo un ricursore DNS aperto o un server DNS autorevole, il problema è lo stesso e la maggior parte delle possibili soluzioni sono uguali.
La migliore soluzione
I cookie DNS sono uno standard proposto che offre ai server DNS un modo per richiedere ai client di inviare un cookie al fine di dimostrare che l'indirizzo IP del client non è stato falsificato. Questo costerà un ulteriore andata e ritorno per la prima ricerca, che è il costo minimo più basso che una soluzione possa offrire.
Fallback per i clienti più anziani
Poiché i cookie DNS non sono ancora standardizzati, sarà ovviamente necessario supportare i clienti più vecchi ora e per gli anni a venire.
È possibile valutare le richieste di limite dai client senza il supporto dei cookie DNS. Ma i limiti di velocità rendono più facile per un utente malintenzionato eseguire il tuo server DNS. Attenzione che alcuni server DNS hanno una funzione di limite di velocità progettata solo per server DNS autorevoli. Dato che stai chiedendo un risolutore ricorsivo, tali implementazioni di limitazione della frequenza potrebbero non essere applicabili a te. Il limite di velocità in base alla progettazione diventerà il collo di bottiglia per il tuo server e quindi un utente malintenzionato dovrà inviarti meno traffico per causare la caduta delle richieste legittime rispetto a quelle che avrebbe se non ci fosse un limite di velocità.
Un vantaggio dei limiti di velocità è che nel caso in cui un utente malintenzionato inonda il server DNS con richieste DNS, è più probabile che rimanga una capacità che ti consentirà di accedere al server e indagare sulla situazione. Inoltre, è possibile progettare limiti di velocità per eliminare principalmente le richieste dagli IP dei client che inviano molte richieste, il che potrebbe essere sufficiente per proteggerti dal DoS dagli aggressori che non hanno accesso agli IP client di spoofing.
Per questi motivi, un limite di velocità leggermente inferiore alla tua effettiva capacità può essere una buona idea, anche se in realtà non protegge dall'amplificazione.
Usando TCP
È possibile forzare un client a utilizzare TCP inviando un codice di errore che indica che la risposta è troppo grande per UDP. Questo ha un paio di inconvenienti. Costa due viaggi di andata e ritorno aggiuntivi. E alcuni client difettosi non lo supportano.
Il costo di due roundtrip aggiuntivi può essere limitato alla sola prima richiesta utilizzando questo approccio:
Quando l'IP client non è stato confermato, il server DNS può inviare una risposta troncata per forzare il client a passare a TCP. La risposta troncata può essere breve quanto la richiesta (o più breve se il client utilizza EDNS0 e la risposta no) che elimina l'amplificazione.
Qualsiasi IP client che completa un handshake TCP e invia una richiesta DNS sulla connessione può essere temporaneamente autorizzato. Una volta autorizzato, l'IP può inviare query UDP e ricevere risposte UDP fino a 512 byte (4096 byte se si utilizza EDNS0). Se una risposta UDP attiva un messaggio di errore ICMP, l'IP viene nuovamente rimosso dalla whitelist.
Il metodo può anche essere invertito usando una lista nera, il che significa che gli IP client possono eseguire query su UDP per impostazione predefinita, ma qualsiasi messaggio di errore ICMP fa sì che l'IP venga inserito nella lista nera che richiede una query TCP per uscire dalla lista nera.
Una bitmap che copre tutti gli indirizzi IPv4 rilevanti potrebbe essere memorizzata in 444 MB di memoria. Gli indirizzi IPv6 dovrebbero essere memorizzati in qualche altro modo.
Non so se qualche server DNS abbia implementato questo approccio.
È stato anche riferito che alcuni stack TCP possono essere sfruttati negli attacchi di amplificazione. Ciò vale tuttavia per qualsiasi servizio basato su TCP e non solo per il DNS. Tali vulnerabilità dovrebbero essere mitigate aggiornando una versione del kernel in cui lo stack TCP è stato corretto in modo da non inviare più di un pacchetto in risposta a un pacchetto SYN.