Transparent proxy allows applications to operate without explicitly using HTTP or SOCKS proxy interfaces. The host or gateway takes over selected traffic and forwards it according to policies. This does not mean applications can absolutely not observe differences, nor does it equate to transparent decryption: connection timing, addresses, protocol support, and certificate boundaries may still change.
We need to answer separately: how packets reach the proxy, how the proxy obtains the original destination, how to infer domain names, and how the proxy's own outbound traffic avoids being taken over again. Configuring only one listening port or one default route is usually insufficient to complete the entire closed loop.
Requirement
Key Mechanism
Receive outbound traffic from local applications
Local OUTPUT path, routing, or TUN takeover
Receive traffic forwarded by other machines via gateway
Inbound PREROUTING and routing delivery
Preserve the original destination address of packets
Transparent socket mechanisms like TPROXY
Obtain the domain name requested by the application
DNS mapping, visible handshake information, or application metadata
Prevent the proxy from recursively taking over itself
Outbound marking, routing rules, or isolation boundaries
Cover both IPv4 and IPv6 simultaneously
Routing, rules, and DNS behavior for both address families
The Three Takeover Methods Operate at Different Abstraction Layers
REDIRECT: Modifying the Destination Endpoint, Restoring Relationships via Connection Tracking
REDIRECT is a special form of Destination NAT. In the IPv4 local OUTPUT scenario, it can redirect to a loopback address; in the PREROUTING scenario, it usually selects the local address of the incoming interface; it is not correct to write all cases as changing to 127.0.0.1. iptables REDIRECT
NAT changes the destination address of the current packet, but conntrack can preserve the metadata of the original direction. TCP proxies can query the original destination via the applicable SO_ORIGINAL_DST. This is not a dedicated interface that only makes sense under the REDIRECT target, nor should it be simply written as "the original address is permanently lost."
In the Linux 7.2 source code, net/netfilter/nf_nat_redirect.c distinguishes between LOCAL_OUT and PRE_ROUTING address selection; nf_conntrack_proto.c's getorigdst queries the conntrack original destination and restricts it to corresponding protocols. UDP cannot treat this TCP interface as a universal restoration method; obtaining the original destination of datagrams requires separate design.
REDIRECT changes the normal destination address to a local address, but the proxy still needs to understand the protocol and target of the forwarded traffic. Using TLS SNI as a substitute for the original destination is also incomplete: SNI does not include the destination port, nor does it guarantee that every connection has a visible domain name.
TPROXY: Packets Do Not Undergo Destination NAT, But Still Need to Be Delivered to Local Transparent Sockets
TPROXY delivers matched traffic to sockets that support transparent reception, preserving the IP/transport layer destination endpoint. Its effective operation requires transparent listening, rule selection, marking, and policy routing to work together; applications need to set options such as IP_TRANSPARENT as required.
For example, if a rule marks selected packets as 1, a policy rule looks up table 100, and table 100 contains local type routes, non-local destination addresses can be handed to the local protocol stack. local ... dev lo here expresses local delivery, not rewriting the original destination IP to 127.0.0.1.
Having only the TPROXY action without corresponding routing, or only building routing while the proxy does not support transparent sockets, cannot form a complete path. Locally generated traffic and gateway inbound traffic take different hooks; one cannot assume that a single PREROUTING rule takes over all local outbound traffic. Linux TPROXY Documentation
The target of a TCP connection can be obtained from applicable socket semantics; UDP usually needs to handle destination metadata per datagram. Actual programs still need to correctly handle address families, ports, and return packet sources, rather than assuming a single UDP listening socket has only one permanent destination.
TUN: User-Space Device Interface for Sending and Receiving IP Packets
TUN is oriented towards IP packets, while TAP is oriented towards Ethernet frames. Linux programs create or attach devices via interfaces such as /dev/net/tun, read data sent by the kernel to that device from the file descriptor, and write returned data into the kernel's receiving path. Whether there is a 4-byte packet information prefix depends on settings like IFF_NO_PI; one cannot simply skip the same length for all implementations.
TUN itself does not perform encryption, does not parse domain names, and does not automatically provide SOCKS exits. User-space programs can encapsulate IP packets into a VPN, or run a protocol stack, terminating local TCP and establishing another connection to the proxy. The latter is not equivalent to sending original TCP segments one by one intact into a CONNECT. Linux TUN/TAP
Virtual network interfaces are not necessarily /dev/net/tun. For example, the Linux kernel's WireGuard uses its own network device implementation; the user-space version might deliver IP packets via TUN; one cannot draw all WireGuard and TUN proxies as having exactly the same data path.
Outbound Bypass: DIRECT Also Encounters Loops
When an application's target packet is routed to TUN, and the proxy decides on DIRECT, it still needs to create a real outbound connection. If the new socket continues to hit the same default route, the connection returns to TUN, forming a recursion. The same applies to connecting to a remote proxy node; one cannot only exclude DIRECT targets and forget the node address.
Methods such as policy marks, dedicated routing tables, binding interfaces, or network namespaces can be used; specific priorities and address overrides must be coordinated. Bypassing by process UID also has scope and shared user issues; one cannot assume that any platform has the same rule semantics.
The following only simulates a single IPv4 teaching strategy: proxy outbound mark prioritizes bypass, explicit local network segments bypass, and the rest is handed to TUN. It does not modify real routing, nor does it cover all special addresses or deployment rules.
fromipaddressimportip_address,ip_networkBYPASS_MARK=0x80local_ranges=[ip_network('127.0.0.0/8'),ip_network('192.168.0.0/16')]defroute(destination,mark=0):addr=ip_address(destination)ifmark&BYPASS_MARK:return'physical'ifany(addrinnetfornetinlocal_ranges):return'local'return'tun'assertroute('203.0.113.10')=='tun'assertroute('203.0.113.10',BYPASS_MARK)=='physical'assertroute('192.168.1.10')=='local'assertroute('198.18.0.42')=='tun'# Changing the target to a remote proxy node will not naturally bypass TUN; an exit policy is required.
assertroute('192.0.2.20')=='tun'assertroute('192.0.2.20',BYPASS_MARK)=='physical'print('Local bypass, proxy exit, and recursion risk model passed')
"Saying 'creating TUN does not require iptables'" does not mean deployment does not need firewalls or policy routing. Mihomo's auto-route, auto-redirect, strict-route, and other options have platform and implementation limitations; one should read the current version's configuration rather than interpreting the names as fixed cross-platform behaviors. Mihomo TUN Configuration
Original Destination IP Does Not Equal Domain Name
The same IP can serve many domain names, and the same domain name can correspond to multiple addresses. IP ownership or geographic databases cannot reliably restore the name the application wants to access; "IP falling in a certain country" is not an equivalent substitute for domain name classification.
Information Source
What It Can Provide
Missing or Unreliable Situations
Original IP/Port
Network target
Does not contain service domain name
Plaintext HTTP Host
Application-declared HTTP target
Cannot be directly read under HTTPS, and may be inconsistent with the connection target
TLS ClientHello SNI
Visible service name hint
No SNI, ECH, or incomplete parsing materials
DNS Association Table
Correlation between a resolution and subsequent connections
Shared addresses, caching, side-channel parsing, and lifecycle differences
Fake-IP Mapping
Name represented by locally synthesized address
Mapping loss, conflicts, or client bypassing this DNS
TLS ClientHello does not allow finding SNI at a fixed "5+32" offset: records, handshake length, session ID, cipher suites, and extensions all need to be parsed according to structure, and may cross TCP read boundaries. QUIC Initial also requires removing corresponding protection and reassembling CRYPTO data; one cannot directly perform fixed offset lookups on UDP payloads.
ECH hides the inner ClientHello; the outer public name is not necessarily the application's original target. Sniffing can be used for limited routing hints and should not be treated as reliable authentication. RFC 9849: ECH
Fake-IP: Allocating Local Indexes, Not Encoding Domain Names into IPs
A proxy-controlled DNS can assign 198.18.0.42 to api.example.com; the client subsequently connects to this synthesized address; the takeover program checks the local mapping, restores the domain name, and decides the actual exit. The address itself usually cannot decode the domain name alone; the key state is in the mapping table.
Common pools use 198.18.0.0/15, but the IANA purpose of this segment is network benchmark testing, not a globally unified address reserved specifically for proxies. Deployment needs to avoid conflicts with actual network usage, and cannot let synthesized addresses flow to the public internet without mapping. IANA Special Address Registry
For example, if the client caches the synthesized address for 10 minutes, the proxy restarts after 1 minute and reassigns the same address to another domain name, it may route incorrectly. Mapping persistence, address recycling, DNS TTL, and active connection lifecycles need to be coordinated; simply ensuring "one IP, one domain name" in the current table is not enough.
If the client obtains the real IP via its own DoH, the connection can still be taken over by TUN, but the Fake-IP mapping may not exist; this is "traffic already taken over, insufficient domain name information," not necessarily "traffic completely bypassing the proxy." Conversely, only taking over UDP53 does not cover TCP DNS, DoT, or DoH. Consistent policies should be applied to A and AAAA, direct domain names, and Fake-IP filtering. Mihomo DNS Configuration
After the Mapping is Cleared, Does the IP in the Cache Still Represent the Original Domain Name?
Clear the mapping first, then connect; the address itself cannot restore the name. Then, if the address is mistakenly reused, the client still wants to access api.example, but the proxy will query other.example. Fixing this requires coordinating the state of both sides, rather than just making the current mapping table look one-to-one.
Preparing the visual
After the Mapping is Cleared, Does the IP in the Cache Still Represent the Original Domain Name?
Synthesized IPs are indexes for local mappings. The client's copy and the proxy's mapping have different lifecycles; reusing addresses too early will point old intents to new objects.
{"id":"fake-ip-lifetime","title":"After the Mapping is Cleared, Does the IP in the Cache Still Represent the Original Domain Name?","summary":"Synthesized IPs are indexes for local mappings. The client's copy and the proxy's mapping have different lifecycles; reusing addresses too early will point old intents to new objects.","height":1000,"html":"<h2 data-i18n=\"heading\"></h2><p class=\"intro\" data-i18n=\"intro\"></p><div class=\"actions\"><button id=\"clear\" data-i18n=\"clear\"></button><button id=\"reuse\" data-i18n=\"reuse\"></button><button id=\"refresh\" data-i18n=\"refresh\"></button><button id=\"connect\" data-i18n=\"connect\"></button><button id=\"reset\" data-i18n=\"reset\"></button></div><section class=\"panel\"><h3 data-i18n=\"state\"></h3><div id=\"state\"></div></section><section class=\"panel\"><h3 data-i18n=\"last\"></h3><div id=\"last\"></div></section><details class=\"scope\"><summary data-i18n=\"scopeLabel\"></summary><p data-i18n=\"scope\"></p></details>","css":".intro{margin:8px 0 18px;color:var(--muted);font-size:14px}.caption,.hint{font-size:12px;color:var(--muted);margin-top:12px}.control{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:6px 12px;align-items:center;margin:14px 0;font-size:13px}.control label{font-size:13px}.control output{color:var(--accent);min-width:5em;text-align:right;font-variant-numeric:tabular-nums}.control input{grid-column:1/-1;width:100%;margin:0}.presets{display:flex;gap:4px;align-items:stretch}.presets button{flex:1 1 0;min-width:0;overflow-wrap:anywhere;font-size:13px}.actions{display:flex;gap:8px;flex-wrap:wrap;margin:14px 0}.actions button{flex:1;min-width:0;font-size:13px;min-height:42px}.copy{display:grid;font-size:14px;margin:16px 0}.copy>*{grid-area:1/1;margin:0}.reserve{visibility:hidden}.scope{margin-top:14px;color:var(--muted);font-size:12px}.scope summary{padding:8px 0;cursor:pointer}.scope p{margin-top:10px}.two{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin:16px 0}.card{border:1px solid var(--rule);border-radius:9px;padding:14px;min-width:0}.card header{font-size:14px;font-weight:600;margin-bottom:10px}.card button{font-size:12px;width:100%;min-width:0}.card small{display:block;font-size:12px;color:var(--muted)}.card code{font-size:12px;overflow-wrap:anywhere}.metrics{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin:16px 0}.metrics>div{border-left:2px solid var(--accent);padding-left:10px;min-width:0}.metrics span{display:block;min-height:3.2em;color:var(--muted);font-size:12px}.metrics strong{font-size:23px;display:block;font-weight:500;overflow-wrap:anywhere;font-variant-numeric:tabular-nums}.formula{border-top:1px solid var(--rule);padding-top:12px;margin-top:14px;font-size:13px;font-variant-numeric:tabular-nums;overflow-wrap:anywhere}.value{font:500 20px var(--viz-font-ui)}.legend{display:flex;flex-wrap:wrap;gap:6px 14px;font-size:12px;color:var(--muted);margin:12px 0}.legend span:before{content:'';display:inline-block;width:8px;height:8px;border-radius:2px;background:var(--accent);margin-right:6px}.legend .second:before{background:var(--second)}.check{display:flex;align-items:center;gap:8px;font-size:13px;margin:12px 0}.check input{width:16px;height:16px;flex-shrink:0;accent-color:var(--accent)}select,input[type=text],input[type=number]{background:var(--paper);color:var(--ink);font:inherit;font-size:13px;padding:10px;border:1px solid var(--rule);border-radius:7px;max-width:100%;min-width:0}select{width:100%;min-height:42px}.band{height:20px;display:flex;background:var(--surface);border-radius:4px;overflow:hidden}.band i{height:100%;display:block;background:var(--accent);transition:width .25s}.band i.second{background:var(--second)}button:disabled{cursor:default}.status{font-size:13px;min-height:4.8em}.mono{font-family:var(--viz-font-mono);font-variant-numeric:tabular-nums}.muted{color:var(--muted)}\n@media(max-width:480px){.two{gap:8px}.card{padding:12px 9px}.actions button,.presets button{font-size:12px}.metrics strong{font-size:20px}.metrics{gap:8px}}\n@media(prefers-reduced-motion:reduce){*,*::before,*::after{transition:none!important;animation:none!important}}\n.track-row{margin:16px 0}.track-row>span{display:block;font-size:12px;color:var(--muted);margin-bottom:7px}.track{display:flex;gap:5px;min-width:0}.cell{flex:1;min-width:0;min-height:48px;border:1px solid var(--rule);border-radius:5px;background:var(--surface);display:flex;align-items:center;justify-content:center;text-align:center;padding:5px 3px;font-size:12px;overflow-wrap:anywhere;font-variant-numeric:tabular-nums}.cell.on{background:var(--accent-soft);border-color:var(--accent)}.cell.gold{background:var(--second-soft);border-color:var(--second)}.cell.empty{border-style:dashed;color:var(--muted)}.cell.error{border-color:var(--second);text-decoration:line-through}.choices{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px;margin:14px 0}.choices button{min-width:0;padding:10px 4px;font-size:12px;overflow-wrap:anywhere}.choices button[aria-current=true]{border-color:var(--accent);background:var(--accent-soft)}.relation{display:grid;grid-template-columns:minmax(0,1fr) 28px minmax(0,1fr);align-items:center;gap:6px;margin:12px 0}.relation .cell{min-height:72px}.relation>i{text-align:center;font-style:normal;color:var(--accent)}.readout{font-size:13px;white-space:pre-line;min-height:6.4em;overflow-wrap:anywhere}.plot{position:relative;border-left:1px solid var(--rule);border-bottom:1px solid var(--rule);padding:8px 0;margin:18px 0}.plot-row{height:28px;position:relative;margin:4px 0;background:var(--surface)}.plot-row i{position:absolute;inset-block:5px;background:var(--accent);min-width:2px;transition:width .2s,left .2s}.plot-row b{position:relative;padding:4px 6px;font:11px/28px var(--viz-font-ui);background:var(--paper);border-radius:3px}.axis{display:flex;justify-content:space-between;font-size:11px;color:var(--muted)}\n\n/* Action labels must remain readable across locales and narrow embeds. */\n.actions{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}\n.actions button{overflow-wrap:anywhere;white-space:normal;min-height:58px;padding:8px}\nbutton{overflow-wrap:anywhere}\n@media(min-width:640px){.actions{grid-template-columns:repeat(3,minmax(0,1fr))}}\n\n.metrics span{overflow-wrap:anywhere}\n.panel{border:1px solid var(--rule);border-radius:9px;padding:12px;margin:14px 0;min-width:0}.panel h3{font-size:13px;margin:0 0 10px;color:var(--muted)}.source{font:13px/1.8 var(--viz-font-mono);white-space:pre-wrap;overflow-wrap:anywhere;margin:12px 0}.source mark{background:var(--accent-soft);color:var(--ink);border-bottom:2px solid var(--accent)}.source .fault{background:var(--second-soft);border-color:var(--second)}.diagram{display:block;width:100%;height:auto;max-height:320px;margin:14px 0;overflow:visible}.diagram text{fill:var(--ink);font:12px var(--viz-font-ui)}.diagram .edge{stroke:var(--muted);stroke-width:1.5;fill:none}.diagram .edge.on{stroke:var(--accent);stroke-width:3}.diagram .node{fill:var(--surface);stroke:var(--rule);stroke-width:1.5}.diagram .node.on{fill:var(--accent-soft);stroke:var(--accent)}.diagram .node.gold{fill:var(--second-soft);stroke:var(--second)}.log{font:12px/1.8 var(--viz-font-mono);white-space:pre-line;overflow-wrap:anywhere;min-height:7.2em}.table{display:grid;gap:5px;margin:14px 0}.table .tr{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:5px}.table .tr>*{padding:8px 5px;background:var(--surface);border-radius:4px;min-width:0;overflow-wrap:anywhere;font-size:12px}.table .tr .on{background:var(--accent-soft)}.table .tr .gold{background:var(--second-soft)}.choices button{min-height:44px}.metrics strong{min-height:1.6em}.code-line{display:block}.code-line.on{background:var(--accent-soft);border-left:2px solid var(--accent);padding-left:6px}.status-badge{font-size:12px;color:var(--accent)}.tile-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px}.tile-grid .cell{min-height:40px}.actions button{min-height:48px}.form-field{display:grid;gap:8px;margin:14px 0;font-size:13px}.form-field input{width:100%;font-family:var(--viz-font-ui)}.metrics.three{grid-template-columns:repeat(3,minmax(0,1fr))}.formula{min-height:3.2em}.presets{flex-wrap:wrap}.presets button{flex-basis:25%;min-height:44px}\n\n.budget{display:flex;height:28px;margin:16px 0;background:var(--surface);border-radius:5px;overflow:hidden}.budget i{display:block;background:var(--accent);transition:width .2s}.budget i.gold{background:var(--second)}.intervals{margin:16px 0}.interval{position:relative;height:36px;background:var(--surface);margin:6px 0;border-radius:4px;overflow:hidden}.interval i{position:absolute;height:100%;background:var(--accent-soft);border-left:2px solid var(--accent)}.interval i.gold{background:var(--second-soft);border-color:var(--second)}.interval span{position:relative;z-index:1;font:12px/36px var(--viz-font-ui);padding-left:7px}.table .tr>*{min-height:4.8em}.formula{white-space:pre-line;min-height:7.2em}.actions:has(>button:only-child){grid-template-columns:1fr}.metrics strong{min-height:3.2em}.rangegrid{display:grid;grid-template-columns:repeat(12,minmax(0,1fr));gap:3px;margin:14px 0}.rangegrid .cell{min-height:30px;padding:3px 1px;font-size:10px}.message{min-height:7.2em;white-space:pre-line;font:13px/1.8 var(--viz-font-ui);overflow-wrap:anywhere}\n/* Allow CJK hanging punctuation without overflowing a metric's border box. */\n.metrics>div{padding-right:4px}.metrics span{line-break:anywhere}\n\n#state .tr{grid-template-columns:1fr 1.8fr}.tr>*{min-height:5em}#last{min-height:5.4em;font:13px/1.8 var(--viz-font-ui);overflow-wrap:anywhere}","js":"const $=s=>document.querySelector(s);const set=(id,v)=>$('#'+id).textContent=v;const t=k=>viz.t(k);function cells(id,values){$('#'+id).replaceChildren(...values.map(v=>{const e=document.createElement('div');e.className='cell '+(v.cls||'');e.textContent=v.text;e.title=v.title||v.text;return e;}));}function pressed(mode){document.querySelectorAll('[data-mode]').forEach(e=>e.setAttribute('aria-pressed',String(e.dataset.mode===mode)));}const esc=s=>String(s).replace(/[&<>\"']/g,c=>({'&':'&','<':'<','>':'>','\"':'"',\"'\":'''}[c]));const fmt=s=>'{'+[...s].sort().join(', ')+'}';function graph(id,nodes,edges){const el=$('#'+id);el.setAttribute('viewBox','0 0 360 200');el.innerHTML='<defs><marker id=\"arrow-'+id+'\" viewBox=\"0 0 10 10\" refX=\"8\" refY=\"5\" markerWidth=\"5\" markerHeight=\"5\" orient=\"auto-start-reverse\"><path d=\"M 0 0 L 10 5 L 0 10 z\" fill=\"var(--muted)\"/></marker></defs>'+edges.map(e=>{const a=nodes[e[0]],b=nodes[e[1]],dx=b.x-a.x,dy=b.y-a.y,d=Math.hypot(dx,dy)||1;if(edges.some(r=>r[0]===e[1]&&r[1]===e[0])){const nx=-dy/d,ny=dx/d;return '<path class=\"edge '+(e[2]?'on':'')+'\" d=\"M '+(a.x+dx/d*22+nx*12)+' '+(a.y+dy/d*22+ny*12)+' Q '+((a.x+b.x)/2+nx*38)+' '+((a.y+b.y)/2+ny*38)+' '+(b.x-dx/d*25+nx*12)+' '+(b.y-dy/d*25+ny*12)+'\" marker-end=\"url(#arrow-'+id+')\"/>';}return '<line class=\"edge '+(e[2]?'on':'')+'\" x1=\"'+(a.x+dx/d*25)+'\" y1=\"'+(a.y+dy/d*25)+'\" x2=\"'+(b.x-dx/d*28)+'\" y2=\"'+(b.y-dy/d*28)+'\" marker-end=\"url(#arrow-'+id+')\"/>';}).join('')+nodes.map(n=>'<g><circle class=\"node '+(n.cls||'')+'\" cx=\"'+n.x+'\" cy=\"'+n.y+'\" r=\"25\"/><text x=\"'+n.x+'\" y=\"'+(n.y+4)+'\" text-anchor=\"middle\">'+esc(n.name)+'</text>'+(n.sub?'<text x=\"'+n.x+'\" y=\"'+(n.y+43)+'\" text-anchor=\"middle\">'+esc(n.sub)+'</text>':'')+'</g>').join('');}function table(id,rows){$('#'+id).classList.add('table');$('#'+id).replaceChildren(...rows.map(r=>{const row=document.createElement('div');row.className='tr';r.forEach(x=>{const c=document.createElement('div');if(typeof x==='object'){c.textContent=x.text;c.className=x.cls||'';}else c.textContent=x;row.append(c)});return row;}));}function band(id,parts,total){$('#'+id).replaceChildren(...parts.map((p,i)=>{const e=document.createElement('i');e.style.width=(100*p.value/total)+'%';e.className=i%2?'gold':'on';e.title=p.name+': '+p.value;return e}));}function intervals(id,items,total){$('#'+id).replaceChildren(...items.map(p=>{const row=document.createElement('div');row.className='interval';const bar=document.createElement('i');bar.style.left=(100*p.start/total)+'%';bar.style.width=(100*(p.end-p.start)/total)+'%';bar.className=p.cls||'';const label=document.createElement('span');label.textContent=p.label;row.append(bar,label);return row;}));}let map='api.example',last='∅';function draw(){table('state',[['client intent','api.example'],['client cache','198.18.0.42'],['proxy map',map||'∅']]);set('last',last);$('#state').dataset.map=map||'';}$('#clear').onclick=()=>{map=null;draw()};$('#reuse').onclick=()=>{map='other.example';draw()};$('#refresh').onclick=()=>{map='api.example';draw()};$('#connect').onclick=()=>{last=!map?'FAIL: no mapping':map==='api.example'?'api.example ✓':'WRONG TARGET: '+map;draw()};$('#reset').onclick=()=>{map='api.example';last='∅';draw()};draw();","audio":false,"strings":{"clear":"Clear Proxy Mapping","connect":"Connect Using Cached IP","heading":"After the Mapping is Cleared, Does the IP in the Cache Still Represent the Original Domain Name?","intro":"Retain the client cache, clear or reassign the proxy mapping separately, then try connecting.","last":"Last Connection Result","refresh":"Re-resolve and Restore Mapping","reset":"Reset","reuse":"Mistakenly Reuse for other.example","scope":"Fix 198.18.0.42, client caches api.example; proxy can drop the mapping or mistakenly reuse it for other.example. Demonstrates errors and recovery, does not implement network or recommended address pool configurations.","scopeLabel":"Model Scope and Conventions","state":"State on Both Sides"}}
MTU, Address Family, and Fault Localization
Takeover may add encapsulation, potentially reducing the effective MTU; when small requests succeed but large transfers stall, check path MTU, ICMP error propagation, and MSS as evidence. User-space TCP stacks, UDP relays, and IP encapsulation paths handle things differently; one cannot uniformly solve all problems by "changing MTU to a fixed value."
The IPv4 default route 0.0.0.0/0 does not cover IPv6. If AAAA is available but the IPv6 path is not taken over, the application may choose an IPv6 exit; if IPv6 is blocked uniformly, it may change reachability and address selection. Configuration should be explicit based on the expected coverage, rather than treating the ability to access a certain IPv4 site as complete acceptance.
Read-only checks can view current rules and routing in order, then correlate with proxy logs:
ip rule showip -6 rule showip route show table allip -6 route show table allip -d link show
Observation
Next Step for Localization
Proxy did not receive target traffic
Address family, routing, hooks, and matching conditions
Received traffic but original destination is incorrect
Can identify target but repeatedly appears outbound
Outbound bypass and mark/rule priority
Only certain domain names are misrouted
DNS path, mapping, ECH, and sniffing limitations
Only UDP fails
Proxy exit capability, association, and MTU
Only large responses or long connections are abnormal
Fragmentation/PMTUD, backpressure, state timeouts
These checks are used to understand the existing deployment; when configuring, check listening, takeover, bypass, and return paths as a complete solution.
Continue Reading
Forward Proxy: HTTP/SOCKS explicit interfaces and DNS location.