fatedier/frp · error · ErrGroupParamsInvalid

group params invalid

Error message

group params invalid

What it means

ErrGroupParamsInvalid is returned when a proxy tries to attach to an existing group whose group name or bind address differs (tcp.go:108, http.go:101, tcpmux.go:121, https.go:94). Within one group every member must use the same group name and the same server bind address; otherwise the parameters are considered invalid and the new proxy is refused.

Source

Thrown at server/group/group.go:23

// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package group

import (
	"errors"
)

var (
	ErrGroupAuthFailed    = errors.New("group auth failed")
	ErrGroupParamsInvalid = errors.New("group params invalid")
	ErrListenerClosed     = errors.New("group listener closed")
	ErrGroupDifferentPort = errors.New("group should have same remote port")
	ErrProxyRepeated      = errors.New("group proxy repeated")

	errGroupStale = errors.New("stale group reference")
)

View on GitHub (pinned to 6c8a8d0a97)

Solutions

  1. Make group name and bind address identical on every member of the group
  2. If deployments are unrelated, use distinct group names per environment/team
  3. Re-verify each member config with frpc verify after edits

Example fix

# member A: group = "app", bindAddr = "0.0.0.0", remotePort = 9000
# member B — before: bindAddr = "127.0.0.1"  -> ErrGroupParamsInvalid
# after
[[proxies]]
name = "b"
type = "tcp"
group = "app"
groupKey = "correct-horse"
bindAddr = "0.0.0.0"
remotePort = 9000
Defensive patterns

Strategy: validation

Validate before calling

// Config lint: same group implies same bindAddr and type
for _, p := range proxies {
    if p.Group != "" {
        ref := groupRef[p.Group]
        if ref != "" && ref != p.BindAddr {
            return fmt.Errorf("group %s: bindAddr %q != %q", p.Group, p.BindAddr, ref)
        }
    }
}

Type guard

func isGroupParamsInvalid(err error) bool {
    return errors.Is(err, group.ErrGroupParamsInvalid)
}

Try / catch

if errors.Is(err, group.ErrGroupParamsInvalid) {
    // group name or bind address differs from the established group — align member configs
}

Prevention

When it happens

Trigger: Same group name but different bindAddr across members; mixing proxy types under one group name (e.g. one member binds 0.0.0.0, another 127.0.0.1 on frps); group name collision between unrelated deployments on the same frps.

Common situations: Copy-pasting a group config between environments and changing the address on only some members; two teams accidentally choosing the same group name on a shared frps.

Related errors


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