[Проект] go-dnscached

  1. Сървър който кешира 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-то.

Трябва да сте влезли в системата, за да може да отговаряте на теми.