Сървър който кешира DNS заявки. Най-вероятно ще ползвам https://github.com/miekg/dns или https://github.com/tonnerre/golang-dns за parsing и изпращане на самите заявки.
Идеята ми е да кеширам A и АААА записи
(т.е. IPv4 и IPv6). (Може да разширя да кеширам и повече типове заявки като CNAME, etc.)
Когато клиент ме попита за даден запис:
- Проверявам дали имам записа в кеша. Ако го имам - връщам резултата
- Ако го нямам - отивам и го взимам от друг DNS, запазвам го в кеша и пак отговарям на клиента
- Ако заявката е нещо което не поддържам (различно от А и АААА запис), питам друг DNS и връщам този отговор (или директно казвам на клиента, аз не знам - питай еди-кой-си).
Самите кеширани записи мисля да ги пазя в някакъв key-value store, може би. Също така искам да има опция кеша да се запазва и на диска, за да може да се запази при reboot пък и така ще има някаква автономност на сървърчето (ако някой пак реши да DDoS-не Dyn, например :D) (Осъзнавам, че тук възниква въпрос какво правим с TTL-то в кеша като е запазено от диска и го четем след това - не съм го измислил още)
Имам различни идеи как и кога да се прави cache invalidation и update на кеша. Може записи които имат по-голям hit-count да имат по-голям TTL или нещо подобно.
Освен това искам да имам json базиран конфигурационен файл. Да може да се конфигурира:
- порт на който да работи сървъра
- списък от DNS сървъри, от които да черпи информация
- списък от записи, които да hard-code-не в кеша по default
- дали да използва DNSSEC или само него, т.н.
- вид/настройка на cache TTL
- да запазва ли кеша на диска
- (не) resolve-вай IPv4/IPv6
Също така искам да имплементирам REST API за комуникация със сървъра. То да позволява:
- CRUD на записи в кеша. Пример: дай ми всички записи в кеша, изтрий даден запис, смени му TTL, insert-ни този запис да сочи към това IP и да е перманентен и т.н.
- Пренасочвай този домейн към друг
- Този запис да се resolve-ва само по IPv4/IPv6
- Добави си този DNS сървър към списъка на "sources of truth"
- Общо взето повечето неща, които има в json config-а да може да се променят през API-то
- Всяка заявка към REST API-то да има опция "запази това в json конфигурацията ти или не" (където това е приложимо)
- Евентуално да има authentication (OAuth) на REST API-то.