diff --git a/internal/client/storage.go b/internal/client/storage.go
index 411d869a..8d563703 100644
--- a/internal/client/storage.go
+++ b/internal/client/storage.go
@@ -167,7 +167,7 @@ func NewStorage(ctx context.Context, conf *StorageConfig) (s *Storage, err error
 		mu:                     &sync.Mutex{},
 		index:                  newIndex(),
 		runtimeIndex:           newRuntimeIndex(),
-		upstreamManager:        newUpstreamManager(),
+		upstreamManager:        newUpstreamManager(conf.Logger),
 		dhcp:                   conf.DHCP,
 		etcHosts:               conf.EtcHosts,
 		arpDB:                  conf.ARPDB,
diff --git a/internal/client/upstreammanager.go b/internal/client/upstreammanager.go
index 2e79a024..34222222 100644
--- a/internal/client/upstreammanager.go
+++ b/internal/client/upstreammanager.go
@@ -1,6 +1,7 @@
 package client
 
 import (
+	"log/slog"
 	"slices"
 	"time"
 
@@ -8,6 +9,7 @@ import (
 	"github.com/AdguardTeam/dnsproxy/proxy"
 	"github.com/AdguardTeam/dnsproxy/upstream"
 	"github.com/AdguardTeam/golibs/errors"
+	"github.com/AdguardTeam/golibs/logutil/slogutil"
 	"github.com/AdguardTeam/golibs/stringutil"
 )
 
@@ -33,6 +35,12 @@ type customUpstreamConfig struct {
 
 // upstreamManager stores and updates custom client upstream configurations.
 type upstreamManager struct {
+	// logger is used for logging the operation of the upstream manager.  It
+	// must not be nil.
+	//
+	// TODO(s.chzhen):  Consider using a logger with its own prefix.
+	logger *slog.Logger
+
 	// uidToCustomConf maps persistent client UID to the custom client upstream
 	// configuration.
 	uidToCustomConf map[UID]*customUpstreamConfig
@@ -46,8 +54,9 @@ type upstreamManager struct {
 }
 
 // newUpstreamManager returns the new properly initialized upstream manager.
-func newUpstreamManager() (m *upstreamManager) {
+func newUpstreamManager(logger *slog.Logger) (m *upstreamManager) {
 	return &upstreamManager{
+		logger:          logger,
 		uidToCustomConf: make(map[UID]*customUpstreamConfig),
 	}
 }
@@ -68,6 +77,14 @@ func (m *upstreamManager) customUpstreamConfig(
 		return cliConf.prxConf
 	}
 
+	if ok && cliConf.prxConf != nil {
+		err := cliConf.prxConf.Close()
+		if err != nil {
+			// TODO(s.chzhen):  Pass context.
+			m.logger.Debug("closing custom upstream config", slogutil.KeyError, err)
+		}
+	}
+
 	prxConf = newCustomUpstreamConfig(c, m.commonConf)
 	m.uidToCustomConf[c.UID] = &customUpstreamConfig{
 		prxConf:               prxConf,