fatedier/frp · error

proxy %s: %v

Error message

proxy %s: %v

What it means

Aggregate wrapper: ValidateAllClientConfig iterates proxy configs and prefixes each per-proxy validation failure with the proxy's name. The real cause is in the %v inner error produced by ValidateProxyConfigurerForClient (e.g. invalid localPort, unknown plugin, bad remotePort range).

Source

Thrown at pkg/config/v1/validation/client.go:210

func ValidateAllClientConfig(
	c *v1.ClientCommonConfig,
	proxyCfgs []v1.ProxyConfigurer,
	visitorCfgs []v1.VisitorConfigurer,
	unsafeFeatures *security.UnsafeFeatures,
) (Warning, error) {
	validator := NewConfigValidator(unsafeFeatures)
	var warnings Warning
	if c != nil {
		warning, err := validator.ValidateClientCommonConfig(c)
		warnings = AppendError(warnings, warning)
		if err != nil {
			return warnings, err
		}
	}

	for _, c := range proxyCfgs {
		if err := ValidateProxyConfigurerForClient(c); err != nil {
			return warnings, fmt.Errorf("proxy %s: %v", c.GetBaseConfig().Name, err)
		}
	}

	for _, c := range visitorCfgs {
		if err := ValidateVisitorConfigurer(c); err != nil {
			return warnings, fmt.Errorf("visitor %s: %v", c.GetBaseConfig().Name, err)
		}
	}
	return warnings, nil
}

View on GitHub (pinned to 6c8a8d0a97)

Solutions

  1. Read the inner error after the proxy name — it names the exact field and rule
  2. Fix that proxy entry (port range, plugin fields, name syntax) and re-run `frpc verify -c <file>`
  3. Temporarily comment out other proxies to bisect if the inner message is ambiguous

Example fix

# before
[[proxies]]
name = "ssh"
type = "tcp"
localPort = 70000

# after
[[proxies]]
name = "ssh"
type = "tcp"
localPort = 22
Defensive patterns

Strategy: try-catch

Validate before calling

for _, p := range proxyCfgs {
    if err := validation.ValidateProxyConfigurerForClient(p); err != nil {
        // surface p.GetBaseConfig().Name + err before startup
    }
}

Try / catch

if err := validation.ValidateAllClientConfig(cc, proxies, visitors, uf); err != nil {
    if after, ok := strings.CutPrefix(err.Error(), "proxy "); ok {
        name, inner, _ := strings.Cut(after, ": ")
        // handle per-proxy failure keyed by name
    }
}

Prevention

When it happens

Trigger: Any [[proxies]] entry whose per-type validation fails — e.g. type "tcp" with localPort 0 or > 65535, missing name, invalid plugin options, transport fields violating proxy-level rules. First failing proxy aborts the loop.

Common situations: One typo'd proxy block in a large included config; new proxy type fields not supported by the running frp version; port conflicts with range constraints on the server.

Related errors


AI-assisted analysis of fatedier/frp@6c8a8d0a97 (2026-08-15). Data as JSON: /api/errors/a1182b883cc55040. Report an issue: GitHub.