{"record":{"id":"b91bda4a9639a595","repo":"XTLS/Xray-core","slug":"xudp-rejected-udp-443-traffic","errorCode":null,"errorMessage":"XUDP rejected UDP/443 traffic","messagePattern":"XUDP rejected UDP/443 traffic","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"info","filePath":"app/proxyman/outbound/handler.go","lineNumber":224,"sourceCode":"\t}\n\tif ob.Target.Network == net.Network_UDP && ob.OriginalTarget.Address != nil && ob.OriginalTarget.Address != ob.Target.Address {\n\t\tlink.Reader = &buf.EndpointOverrideReader{Reader: link.Reader, Dest: ob.Target.Address, OriginalDest: ob.OriginalTarget.Address}\n\t\tlink.Writer = &buf.EndpointOverrideWriter{Writer: link.Writer, Dest: ob.Target.Address, OriginalDest: ob.OriginalTarget.Address}\n\t}\n\tif h.mux != nil {\n\t\ttest := func(err error) {\n\t\t\tif err != nil {\n\t\t\t\terr := errors.New(\"failed to process mux outbound traffic\").Base(err)\n\t\t\t\tsession.SubmitOutboundErrorToOriginator(ctx, err)\n\t\t\t\terrors.LogInfo(ctx, err.Error())\n\t\t\t\tcommon.Interrupt(link.Writer)\n\t\t\t\tcommon.Interrupt(link.Reader)\n\t\t\t}\n\t\t}\n\t\tif ob.Target.Network == net.Network_UDP && ob.Target.Port == 443 {\n\t\t\tswitch h.udp443 {\n\t\t\tcase \"reject\":\n\t\t\t\ttest(errors.New(\"XUDP rejected UDP/443 traffic\").AtInfo())\n\t\t\t\treturn\n\t\t\tcase \"skip\":\n\t\t\t\tgoto out\n\t\t\t}\n\t\t}\n\t\tif h.xudp != nil && ob.Target.Network == net.Network_UDP {\n\t\t\tif !h.xudp.Enabled {\n\t\t\t\tgoto out\n\t\t\t}\n\t\t\ttest(h.xudp.Dispatch(ctx, link))\n\t\t\treturn\n\t\t}\n\t\tif h.mux.Enabled {\n\t\t\ttest(h.mux.Dispatch(ctx, link))\n\t\t\treturn\n\t\t}\n\t}\nout:","sourceCodeStart":206,"sourceCodeEnd":242,"githubUrl":"https://github.com/XTLS/Xray-core/blob/7d214f8b094f75322fa3990f8aadad1c912f24f5/app/proxyman/outbound/handler.go#L206-L242","documentation":"An info-level error deliberately constructed (AtInfo) by the outbound handler when a UDP connection targeting port 443 (typical QUIC traffic) arrives at a handler with mux enabled and the udp443 policy set to 'reject'. It is fed through the mux test() closure, so it is reported as 'failed to process mux outbound traffic' with this message as the cause, and the connection is intentionally terminated. This is policy behavior, not a malfunction.","triggerScenarios":"ob.Target.Network == net.Network_UDP && ob.Target.Port == 443 while h.mux != nil and the handler's udp443 setting equals the string \"reject\". The connection is then interrupted and dispatch returns.","commonSituations":"Users add udp443:'reject' (or a template/ GUI default does) to stop QUIC so browsers fall back to TCP and can be routed/sniffed; browsers like Chrome then trigger this on every QUIC attempt, flooding logs. Also seen when users confuse it with xudp settings and wonder why YouTube/HTTP3 breaks.","solutions":["If QUIC passthrough is wanted, remove the udp443 option or set it to 'skip' so UDP/443 bypasses mux instead of being killed.","If rejection is intended but noisy, expect these info logs and optionally lower log level to warning to silence them.","Alternatively block QUIC at the client/browser (e.g. chrome://flags disable QUIC) so traffic never reaches the proxy."],"exampleFix":"// before\n\"streamSettings\": { \"udp443\": \"reject\" }\n\n// after\n\"streamSettings\": { \"udp443\": \"skip\" } // or remove the field entirely","handlingStrategy":"validation","validationCode":"// Policy check before dispatching QUIC-looking traffic to a mux handler\nif isUDP && port == 443 && muxEnabled(handler) && udp443Policy(handler) == \"reject\" {\n    return sendICMPPortUnreachable(conn) // or answer locally; do not forward into the handler\n}","typeGuard":null,"tryCatchPattern":"// This is intentional policy: detect and treat as silent drop\nif err := dispatch(ctx, link); err != nil {\n    if strings.Contains(err.Error(), \"XUDP rejected UDP/443\") {\n        return nil // expected rejection, not a failure to report\n    }\n    return err\n}","preventionTips":["Choose udp443 policy deliberately: reject (kill QUIC), skip (bypass mux), or unset","If rejecting QUIC by design, expect one info log per QUIC attempt and lower log verbosity","Disable HTTP/3 in managed browsers instead of killing it at the proxy for cleaner UX"],"tags":["go","xray","quic","udp","mux","policy"],"backgroundTag":null,"analyzedSha":"7d214f8b094f75322fa3990f8aadad1c912f24f5","analyzedAt":"2026-08-15T14:26:24.325Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}