mirror of
https://github.com/fatedier/frp.git
synced 2026-10-05 17:15:56 +08:00
Compare commits
15
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8dd26c6961 | ||
|
|
9ea1d86f03 | ||
|
|
ac3e82db4e | ||
|
|
0773938d70 | ||
|
|
9bacce22a2 | ||
|
|
7f8d68b666 | ||
|
|
c8c1e5116c | ||
|
|
4ec8de973f | ||
|
|
5bfcea3d0c | ||
|
|
0a1b4ab21f | ||
|
|
5f575b8442 | ||
|
|
a1348cdf00 | ||
|
|
2f5e1f7945 | ||
|
|
22ae8166d3 | ||
|
|
af6bc6369d |
+4
-6
@@ -1,11 +1,9 @@
|
|||||||
## Features
|
## Features
|
||||||
|
|
||||||
* When `transport.wireProtocol = "v2"` is enabled, ordinary UDP proxy work connection payloads now use wire protocol v2 message framing. This keeps UDP message payloads aligned with the negotiated frpc/frps wire protocol.
|
* `transport.wireProtocol = "v2"` now also applies to UDP-based proxy payloads, including ordinary UDP and SUDP, so their payload framing is consistent with the selected wire protocol.
|
||||||
* SUDP proxy payloads now also follow the connection wire protocol. SUDP v2 endpoints use wire protocol v2 message framing, while v1/default endpoints continue to use the legacy message codec. When the SUDP proxy frpc and visitor frpc use mixed v1/v2 wire protocols, frps bridges UDPPacket messages between the two codecs.
|
* Improved SUDP compatibility during mixed `transport.wireProtocol` deployments, allowing frps to bridge payloads between v1/default and v2 SUDP clients.
|
||||||
|
* XTCP work connection `NatHoleSid` messages now follow the selected `transport.wireProtocol`.
|
||||||
|
|
||||||
## Compatibility Notes
|
## Compatibility Notes
|
||||||
|
|
||||||
* The default/empty `transport.wireProtocol` and `transport.wireProtocol = "v1"` continue to use the legacy message codec for ordinary UDP and SUDP proxy payloads.
|
* When enabling `transport.wireProtocol = "v2"` for SUDP, upgrade both the proxy and visitor frpc instances first, or keep them on `v1` until both sides are upgraded.
|
||||||
* Raw stream proxy paths such as TCP, HTTP, and STCP remain unframed and are not affected by the UDP/SUDP payload framing change.
|
|
||||||
* Direct NAT hole UDP sid probing packets are not changed by this release.
|
|
||||||
* `transport.wireProtocol = "v2"` requires peers to use versions that support the same wire v2 payload semantics. Mixing a newer peer that sends v2-framed UDP or SUDP payloads with an older v2-capable peer that still expects the legacy payload codec can break that proxy traffic. During rolling upgrades, upgrade both SUDP proxy and visitor frpc instances before enabling `transport.wireProtocol = "v2"` for SUDP, or keep those clients on `transport.wireProtocol = "v1"` until both sides are upgraded.
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
package version
|
package version
|
||||||
|
|
||||||
var version = "0.69.0"
|
var version = "0.69.1"
|
||||||
|
|
||||||
func Full() string {
|
func Full() string {
|
||||||
return version
|
return version
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -158,7 +160,7 @@ webServer.port = %d
|
|||||||
framework.NewRequestExpect(f).PortName(portName).Ensure()
|
framework.NewRequestExpect(f).PortName(portName).Ensure()
|
||||||
})
|
})
|
||||||
|
|
||||||
ginkgo.It("baseline frps rejects current frpc forced to v2", func() {
|
ginkgo.It("baseline frps handles current frpc forced to v2 according to baseline support", func() {
|
||||||
portName := port.GenName("CompatBaselineFRPSForcedV2")
|
portName := port.GenName("CompatBaselineFRPSForcedV2")
|
||||||
clientConf := tcpClientConfig("tcp", portName, `
|
clientConf := tcpClientConfig("tcp", portName, `
|
||||||
transport.wireProtocol = "v2"
|
transport.wireProtocol = "v2"
|
||||||
@@ -170,6 +172,21 @@ transport.wireProtocol = "v2"
|
|||||||
consts.DefaultServerConfig,
|
consts.DefaultServerConfig,
|
||||||
[]string{clientConf},
|
[]string{clientConf},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// frp v0.69.0 added control connection wireProtocol v2 support, so
|
||||||
|
// baseline frps v0.69.0 and newer should accept a current frpc forced
|
||||||
|
// to v2. Older known baselines still must reject the unsupported protocol.
|
||||||
|
// For custom baselines, the version is unknown and the binary may be either
|
||||||
|
// side of the support boundary, so this versioned expectation is skipped.
|
||||||
|
supportsV2, knownVersion := baselineSupportsControlWireProtocolV2(compatCtx.BaselineVersion)
|
||||||
|
if !knownVersion {
|
||||||
|
ginkgo.Skip(fmt.Sprintf("baseline version %q is not semver; skip versioned forced-v2 expectation", compatCtx.BaselineVersion))
|
||||||
|
}
|
||||||
|
if supportsV2 {
|
||||||
|
framework.NewRequestExpect(f).PortName(portName).Ensure()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
expectProcessExit(clientProcesses[0], 5*time.Second)
|
expectProcessExit(clientProcesses[0], 5*time.Second)
|
||||||
framework.NewRequestExpect(f).PortName(portName).ExpectError(true).Ensure()
|
framework.NewRequestExpect(f).PortName(portName).ExpectError(true).Ensure()
|
||||||
})
|
})
|
||||||
@@ -199,6 +216,39 @@ func expectProcessExit(p *process.Process, timeout time.Duration) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func baselineSupportsControlWireProtocolV2(version string) (supports bool, known bool) {
|
||||||
|
version = strings.TrimPrefix(version, "v")
|
||||||
|
parts := strings.Split(version, ".")
|
||||||
|
if len(parts) != 3 {
|
||||||
|
return false, false
|
||||||
|
}
|
||||||
|
|
||||||
|
major, err := strconv.Atoi(parts[0])
|
||||||
|
if err != nil {
|
||||||
|
return false, false
|
||||||
|
}
|
||||||
|
minor, err := strconv.Atoi(parts[1])
|
||||||
|
if err != nil {
|
||||||
|
return false, false
|
||||||
|
}
|
||||||
|
patch, err := strconv.Atoi(parts[2])
|
||||||
|
if err != nil {
|
||||||
|
return false, false
|
||||||
|
}
|
||||||
|
|
||||||
|
return compareSemanticVersion(major, minor, patch, 0, 69, 0) >= 0, true
|
||||||
|
}
|
||||||
|
|
||||||
|
func compareSemanticVersion(major, minor, patch int, baseMajor, baseMinor, basePatch int) int {
|
||||||
|
if major != baseMajor {
|
||||||
|
return major - baseMajor
|
||||||
|
}
|
||||||
|
if minor != baseMinor {
|
||||||
|
return minor - baseMinor
|
||||||
|
}
|
||||||
|
return patch - basePatch
|
||||||
|
}
|
||||||
|
|
||||||
type wireClientInfo struct {
|
type wireClientInfo struct {
|
||||||
ClientID string `json:"clientID"`
|
ClientID string `json:"clientID"`
|
||||||
WireProtocol string `json:"wireProtocol"`
|
WireProtocol string `json:"wireProtocol"`
|
||||||
|
|||||||
Reference in New Issue
Block a user