mirror of
https://github.com/wweir/sower.git
synced 2026-10-20 08:16:35 +00:00
One request to a name whose A record is the client's own serve address became a self-sustaining chain: the proxy forwarded it into the tunnel, the relay resolved the name back to the client and dialed the client's own listener, which forwarded it again. Measured on r6c: 601 connections and a relay host that ran out of memory. A proxy dial must never re-enter a listener this client forwards proxy traffic on. Router.DialProxyOnly now refuses such a target: the listener set is the HTTP/HTTPS proxy addresses on every DNS listen address plus SOCKS5, resolution is skipped for ports this client does not serve, and the answer is cached for a minute so a proxied dial does not pay a DNS round trip per connection. Refusals surface as ErrSelfProxyTarget - HTTP 403, SOCKS5 0x02 - and a resolution failure is not treated as evidence of self-targeting. Plan, rejected alternatives and the evidence trail: docs/plans/2026-10-12-self-proxy-target-guard.md