V2RayEz can chain Psiphon through its client-side Domain-Fronting MITM proxy, exactly like the PsiphonOverMITM project:
Psiphon app ── upstream proxy ──► V2RayEz MITM (domain fronting) ──► Psiphon network
- Open the Psiphon tab and click Start Psiphon over MITM.
V2RayEz starts the Domain-Fronting MITM proxy and shows you an address such as
http://127.0.0.1:8087. - Install/trust the MITM CA (Domain Fronting tab → Download CA) so the proxy can read your HTTPS locally.
- In the Psiphon app, go to Settings → Proxy → Upstream Proxy and set it to
the address shown (HTTP), e.g. host
127.0.0.1, port8087. - Connect Psiphon. Its traffic now rides over the domain-fronting tunnel.
This mirrors the upstream project, which also runs the Psiphon app and only points its upstream proxy at the local MITM.
go get github.com/Psiphon-Labs/psiphon-tunnel-core/... does not work as a
library import, and that is expected. psiphon-tunnel-core:
- uses a local-path replace in its own
go.mod(replace github.com/pion/dtls/v2 => ./replace/dtls), which only resolves inside its own repository, not when imported elsewhere; - pins forked modules (
github.com/Psiphon-Labs/quic-go,github.com/Psiphon-Labs/utls) whose module paths differ from what older transitive deps request — this is thelucas-clemente/quic-govsquic-go/quic-goerror spiral you saw; - requires Go 1.26+.
Because of the local-path replace, the only reliable way to build the embedded
engine is to compile from within a checkout of psiphon-tunnel-core (so its own
go.mod/replaces apply) and expose it as a small service — not to go get it into
this module. For almost everyone the Recommended path above is simpler and just
works.
Only if you specifically want the tunnel embedded in the binary:
- Use Go 1.26+.
- Build from a local checkout of
psiphon-tunnel-core(so itsgo.modwith the./replace/dtlslocal replace and forked quic-go/utls is in effect), then wireinternal/psiphon/psiphon_real.goagainst that checkout via areplacein this module pointing at your local path. go build -tags psiphon .(tags go before the dot).
This is intentionally manual; the build scripts skip it and fall back to a standard
build so they never spiral on go get.