Ответ
В 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-запроса через:
- HTTP-middleware для обычных запросов
- Кастомный Resolver для прямых DNS-запросов из кода
Для более сложных сценариев можно использовать DNS-прокси с авторизацией.