diff --git a/app/proxyman/outbound/handler.go b/app/proxyman/outbound/handler.go index 3819f52b..ab44a1d5 100644 --- a/app/proxyman/outbound/handler.go +++ b/app/proxyman/outbound/handler.go @@ -325,6 +325,7 @@ func (h *Handler) Start() error { // Close implements common.Closable. func (h *Handler) Close() error { common.Close(h.mux) + common.Close(h.proxy) return nil } diff --git a/proxy/wireguard/client.go b/proxy/wireguard/client.go index ff1592ef..345581c7 100644 --- a/proxy/wireguard/client.go +++ b/proxy/wireguard/client.go @@ -77,6 +77,20 @@ func New(ctx context.Context, conf *DeviceConfig) (*Handler, error) { }, nil } +func (h *Handler) Close() (err error) { + go func() { + h.wgLock.Lock() + defer h.wgLock.Unlock() + + if h.net != nil { + _ = h.net.Close() + h.net = nil + } + }() + + return nil +} + func (h *Handler) processWireGuard(ctx context.Context, dialer internet.Dialer) (err error) { h.wgLock.Lock() defer h.wgLock.Unlock() diff --git a/transport/internet/system_dialer.go b/transport/internet/system_dialer.go index 63365099..cc8f3cc0 100644 --- a/transport/internet/system_dialer.go +++ b/transport/internet/system_dialer.go @@ -61,6 +61,11 @@ func (d *DefaultSystemDialer) Dial(ctx context.Context, src net.Address, dest ne } var lc net.ListenConfig lc.Control = func(network, address string, c syscall.RawConn) error { + for _, ctl := range d.controllers { + if err := ctl(network, address, c); err != nil { + errors.LogInfoInner(ctx, err, "failed to apply external controller") + } + } return c.Control(func(fd uintptr) { if sockopt != nil { if err := applyOutboundSocketOptions(network, "", fd, sockopt); err != nil {