{"record":{"id":"6b0530a4c7845b23","repo":"ginuerzh/gost","slug":"s-unsupported-6b0530","errorCode":null,"errorMessage":"%s unsupported","messagePattern":"(.+?) unsupported","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"ssh.go","lineNumber":74,"sourceCode":"\n\treturn authorizedKeysMap, nil\n}\n\ntype sshDirectForwardConnector struct{}\n\n// SSHDirectForwardConnector creates a Connector for SSH TCP direct port forwarding.\nfunc SSHDirectForwardConnector() Connector {\n\treturn &sshDirectForwardConnector{}\n}\n\nfunc (c *sshDirectForwardConnector) Connect(conn net.Conn, raddr string, options ...ConnectOption) (net.Conn, error) {\n\treturn c.ConnectContext(context.Background(), conn, \"tcp\", raddr, options...)\n}\n\nfunc (c *sshDirectForwardConnector) ConnectContext(ctx context.Context, conn net.Conn, network, raddr string, options ...ConnectOption) (net.Conn, error) {\n\tswitch network {\n\tcase \"udp\", \"udp4\", \"udp6\":\n\t\treturn nil, fmt.Errorf(\"%s unsupported\", network)\n\t}\n\n\topts := &ConnectOptions{}\n\tfor _, option := range options {\n\t\toption(opts)\n\t}\n\n\tcc, ok := conn.(*sshNopConn) // TODO: this is an ugly type assertion, need to find a better solution.\n\tif !ok {\n\t\treturn nil, errors.New(\"ssh: wrong connection type\")\n\t}\n\n\ttimeout := opts.Timeout\n\tif timeout <= 0 {\n\t\ttimeout = ConnectTimeout\n\t}\n\n\tcc.session.conn.SetDeadline(time.Now().Add(timeout))","sourceCodeStart":56,"sourceCodeEnd":92,"githubUrl":"https://github.com/ginuerzh/gost/blob/a33fdbf4c98034f4bfeeaea9868909822b9c526d/ssh.go#L56-L92","documentation":"The SSH direct port-forward connector (sshDirectForwardConnector) only supports TCP. Its ConnectContext returns '<network> unsupported' when the network argument is \"udp\", \"udp4\", or \"udp6\", because SSH direct-tcpip channels are TCP-only.","triggerScenarios":"Calling sshDirectForwardConnector.ConnectContext directly with a UDP network value; its Connect wrapper always passes \"tcp\", so this occurs only on direct ConnectContext calls.","commonSituations":"Trying to forward UDP traffic through an SSH direct forwarder; generic routing code that passes the client's requested network (udp) straight through to an SSH TCP forward connector.","solutions":["Use \"tcp\", \"tcp4\", or \"tcp6\" with sshDirectForwardConnector","For UDP over SSH, use a different transport (e.g. a UDP-capable relay or tunnel UDP inside TCP yourself)","Validate network values before dispatching to connector implementations"],"exampleFix":"// before\nconn, err := sshConn.ConnectContext(ctx, netConn, \"udp\", raddr)\n// after\nconn, err := sshConn.ConnectContext(ctx, netConn, \"tcp\", raddr)","handlingStrategy":"validation","validationCode":"if strings.HasPrefix(network, \"udp\") {\n    return errors.New(\"ssh direct forward supports tcp only\")\n}","typeGuard":"func isTCP(n string) bool {\n    return n == \"tcp\" || n == \"tcp4\" || n == \"tcp6\"\n}","tryCatchPattern":"conn, err := sshFwdConnector.ConnectContext(ctx, netConn, network, raddr)\nif err != nil && strings.HasSuffix(err.Error(), \"unsupported\") {\n    return fmt.Errorf(\"ssh forward: %w\", err)\n}","preventionTips":["Always call via Connect() (which pins network to tcp) instead of ConnectContext directly","Reject udp schemes on ssh forward nodes at config parse time","Remember SSH port forwarding is TCP-only; tunnel UDP separately if needed"],"tags":["ssh","port-forwarding","unsupported-network"],"backgroundTag":"unsupported-network-type","analyzedSha":"a33fdbf4c98034f4bfeeaea9868909822b9c526d","analyzedAt":"2026-09-02T22:15:54.506Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-10T02:17:09.455Z"}