mrkeyoor.com_
Sat 07 Nov 00:42 UTC
Self-Hostedevaluationupdated 01 Nov 2026

frp review

Choose frp when you want to expose private services through a public server you operate and can manage both ends of the tunnel. frp forwards TCP, UDP, HTTP and HTTPS traffic to services behind NAT or a firewall. Our run on August 23, 2026, at commit 758f07d did not establish a working tunnel deployment: the stored build status conflicts with compiler diagnostics, and two named E2E suites could not find the required binaries.

+100stars / 7d
Verdict

frp is worth evaluating when you need several forwarding modes and can operate the public relay yourself. Our August 23, 2026, run at commit 758f07d leaves build completion unresolved and does not demonstrate a working tunnel deployment. Produce the missing assets and binaries, rerun the relevant suites, and test the intended traffic path before relying on it.

We ran it

Lab card: what happened when we ran frpScreenshot of frp (github.com/fatedier/frp)
Install✓ · 37s142 packages
Build✓ · 6s
Tests✗ · 60s33 passed · 6 failed of 39 (go test)
Repo520 files~70,060 lines of source · 2.7 MB · 4 CI workflows · tests dir

Answers from our run

Does frp build from source?

Dependencies installed in 37 seconds (142 packages), and the build succeeded in 6 seconds. We cloned commit 758f07d into a clean Debian container with 3 CPUs and no project-specific setup.

Do frp's tests pass?

No. The project's own test command finished in 60 seconds and reported 33 passed, 6 failed (go test).

Who should not use frp?

Readers who need this review to demonstrate a successful tunnel deployment; our recorded run does not establish that.

What are the alternatives to frp?

cloudflared, rathole, bore. frp is worth evaluating when you need several forwarding modes and can operate the public relay yourself.

Setup4/5Rates the documented two-binary setup and concrete examples. Public networking remains the operator's responsibility; our conflicting build record does not verify successful setup.
Docs5/5Rates extensive concrete examples for protocols, authentication, routing and monitoring in the supplied README. We did not execute every documented example.
Community5/5Rates visible repository attention in the supplied GitHub snapshot. Stars do not establish adoption, response times, support quality or deployment success.
Maturity4/5Rates the documented feature set and supplied v0.71.0 maintenance evidence. Future v2 compatibility is explicitly excluded, and our E2E run did not establish deployment reliability.

Discussed on

  1. hnFrp: A fast reverse proxy to help you expose a local server to the internet134 points
  2. hnFast proxy to expose a local server behind a NAT or firewall to the internet5 points
  3. hnA fast reverse proxy to help you expose a local server behind a NAT or firewall4 points

Who it’s for

Operators who have a public server and want to control the relay and private client.
Developers exposing SSH, web services or UDP services through documented configurations.
Teams prepared to configure authentication, restrict exposed ports and test their intended network paths.

Who it’s NOT for

Readers who need this review to demonstrate a successful tunnel deployment; our recorded run does not establish that.
Users who cannot operate the public server required by the documented setup.
Deployments that require XTCP to work across every NAT device; the README explicitly warns that it may not.
Teams planning around a compatible future v2 migration; the README says v2 will be incompatible with v1.

Setup reality

Our sandbox run on August 23, 2026, used commit 758f07d59e155e1eb044d3ca6bb3151fdab737dc. The attached harness records installation as successful in 37 seconds with a dependency count of 142. Its build summary records success, exit 0 and 6 seconds, but the raw tail contains missing embedded dist assets for both web interfaces and vet-exit:1. That conflict prevents us from describing the build as verified successful.

The test command returned exit 1 after 60 seconds without a recorded timeout. The attached stored parser summaries report 33 passed, 6 failed and 39 total package results. These are parser summaries, not verified unique or exhaustive test counts. The raw tail separately identifies missing binaries in two E2E suites; it does not explain every failure counted by the parser.

Start with the documented public-server and private-client setup, then verify that the binaries and required web assets exist before running E2E tests. A successful deployment still needs a traffic check through the exact protocol and authentication configuration you intend to use.

Should you operate an frp relay?

Choose frp if owning the public endpoint is part of your requirement. The documented setup puts frps and its configuration on a server with a public IP, and frpc beside the private service. That gives you control over the relay, while leaving its configuration and operation with you.

frp forwards TCP, UDP, HTTP and HTTPS traffic to services behind NAT or a firewall. The README at our tested commit includes SSH, domain-based web routing, DNS forwarding and private visitor examples. Those examples establish documented capabilities; our run did not validate those traffic paths.

What our sandbox actually established

Our run took place on August 23, 2026, at commit 758f07d59e155e1eb044d3ca6bb3151fdab737dc. The recorded sandbox image was golang:1.24-bookworm, with 3 CPUs and 8 GB of memory. The installation tail shows Go downloading go1.25.0, so the image name alone does not identify the toolchain used throughout the run.

The harness stores step status, exit code, elapsed time, parsed counts and a log tail. Installation was recorded as successful in 37 seconds. The build summary records success, exit 0 and 6 seconds, but its raw tail reports missing embedded dist assets and vet-exit:1. We preserve both observations because a successful wrapper status does not resolve the diagnostics inside it.

The test step returned exit 1 after 60 seconds and was not marked timed out. Its stored parser summaries report 33 passed, 6 failed and 39 total package results. Those figures do not establish exhaustive unique test coverage. Packages marked [no test files] are not failed or skipped tests.

Two failures are identifiable in the raw tail. The test/e2e suite reports load frpc-path error: stat ../../bin/frpc: no such file or directory. The test/e2e/compatibility suite reports load current-frps-path error: stat ../../bin/frps: no such file or directory. These messages explain why those suites could not proceed; they do not reconcile all six failures in the stored parser summary.

This record does not demonstrate a working public relay, successful E2E compatibility, reconnect behavior or production traffic handling. It contains no dependency audit result, so advisory findings and scan coverage are unknown. The MrKeyoor testing methodology explains how command outcomes reach the review. That page supplies provenance context, not proof that its current procedure governed this older run. No new execution was performed for this correction.

Public ports and private visitors solve different access needs

The documented SSH example exposes a local SSH service through a port on the public server. The HTTP example adds a virtual-host listener and DNS pointing at that server. Decide which service should be reachable before opening its relay port.

For access through another client, the README documents STCP with a preshared key. Its XTCP mode attempts direct data transmission between clients, but still needs an frps server and may not work with every NAT device. The README suggests falling back to STCP when XTCP does not work.

The tested-commit documentation also describes token and OIDC authentication between frpc and frps, TLS configuration and server port restrictions. Client authentication does not establish who may use the application you expose. Verify the application's own access controls as part of your deployment check.

Which alternative changes the decision?

cloudflared proxies traffic from the Cloudflare network to your origin. Consider it when you want Cloudflare in the traffic path rather than operating an frp public relay. This is a replacement architecture for that requirement, not an additional frp feature. Its README also describes client access for non-HTTP TCP traffic, so check the access model for your intended service.

rathole requires service tokens and splits each service's configuration between client and server. Consider it when that configuration model suits a tunnel through your own public server. Its README supports TCP and UDP service configurations and optional Noise or TLS transport. We did not compare its performance with frp.

bore forwards local TCP ports through a remote server. Consider it when TCP forwarding meets the requirement. Its optional secret authenticates the handshake; the README says further traffic is not encrypted by default. It is an alternative for that narrower task, not a replacement for frp's UDP or domain-routing capabilities.

What to verify before adoption

First produce the required binaries and web assets, then rerun the relevant E2E suites. In a staging network, check traffic through the chosen protocol, rejected credentials, exposed ports and recovery after a connection interruption. These are recommended acceptance checks, not results from our run.

Keep the tested commit separate from release identity. The attached v0.71.0 release page identifies release commit 4a23aa1; our run used 758f07d. The release notes describe a negative connection-pool denial-of-service fix and a mixed-case custom-domain validation fix. They do not turn our checkout into a verified release deployment.

How to read the retained scores

The retained ratings use a five-point editorial rubric: 1 means substantial documented obstacles, 2 means major gaps, 3 means a usable basis with material qualifications, 4 means strong documented support with an operational qualification, and 5 means extensive evidence for the specific dimension being rated. They are judgments, not benchmark results.

Setup ease rates the documented two-binary path, not a proven successful build in our sandbox. Documentation rates the breadth of concrete examples, not their independent execution. Community rates visible repository attention, not support quality or adoption. Maturity rates the documented feature set and maintenance evidence, not deployment reliability. The build conflict and incomplete E2E execution remain material limits regardless of these ratings.

Alternatives

ProjectWhat it isPick it when
cloudflared gh↗The Cloudflare Tunnel client proxies traffic from Cloudflare's network to an origin.Choose it when routing through Cloudflare fits your requirements better than operating an frp public relay.
ratholeA Rust NAT traversal proxy with TCP and UDP service configurations and mandatory service tokens.Choose it when you want a public-server tunnel with service configuration split between client and server.
bore gh↗A TCP tunnel that forwards local ports through a remote server.Choose it when TCP forwarding is sufficient, accounting for its lack of traffic encryption by default.

What people are saying

  1. [github-trending] fatedier/frp

Sources

  1. frp README
  2. frp repository facts
  3. frp v0.71.0 release
  4. Reconnect issue 5355
  5. Visitor source IP logging issue 5486
  6. Antivirus documentation issue 3637

More self-hosted reviews

nvke · voxl · rustdesk-server · spotifast · tapflow · lucky · the whole board →