Как можно авторизовать пользователя до попадания на DNS-сервер

«Как можно авторизовать пользователя до попадания на DNS-сервер» — вопрос из категории Безопасность, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Go можно реализовать авторизацию перед DNS-запросом через middleware или перехват запросов. Например, используя net/http и кастомный DNS-резолвер:

package main

import (
    "net/http"
    "net"
)

func authMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        if !isAuthorized(r) { // ваша логика авторизации
            http.Error(w, "Unauthorized", http.StatusUnauthorized)
            return
        }
        next.ServeHTTP(w, r)
    })
}

func main() {
    // Настройка кастомного DNS-резолвера
    net.DefaultResolver = &net.Resolver{
        PreferGo: true,
        Dial: func(ctx context.Context, network, address string) (net.Conn, error) {
            // Проверка авторизации перед разрешением DNS
            if !isAuthorizedFromContext(ctx) {
                return nil, errors.New("unauthorized DNS request")
            }
            return net.Dial(network, "8.8.8.8:53") // или ваш DNS-сервер
        },
    }

    handler := authMiddleware(yourRouter)
    http.ListenAndServe(":8080", handler)
}

Этот подход проверяет авторизацию до DNS-запроса через:

  1. HTTP-middleware для обычных запросов
  2. Кастомный Resolver для прямых DNS-запросов из кода

Для более сложных сценариев можно использовать DNS-прокси с авторизацией.