v5.0.66: utls + proxy CONNECT tunnel (DDoS-Guard bypass)
This commit is contained in:
@@ -2,7 +2,7 @@ terraform {
|
|||||||
required_providers {
|
required_providers {
|
||||||
nubes = {
|
nubes = {
|
||||||
source = "terra.k8c.ru/nubes-test/nubes"
|
source = "terra.k8c.ru/nubes-test/nubes"
|
||||||
version = "5.0.65"
|
version = "5.0.66"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bufio"
|
||||||
"context"
|
"context"
|
||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
@@ -130,7 +132,39 @@ func (p *NubesProvider) Configure(ctx context.Context, req provider.ConfigureReq
|
|||||||
// utls: маскируем Go TLS под Firefox, чтобы пройти DDoS-Guard (JA3 fingerprint).
|
// utls: маскируем Go TLS под Firefox, чтобы пройти DDoS-Guard (JA3 fingerprint).
|
||||||
// Стандартный crypto/tls и Chrome блокируются на deck-api-*.ngcloud.ru.
|
// Стандартный crypto/tls и Chrome блокируются на deck-api-*.ngcloud.ru.
|
||||||
transport.DialTLSContext = func(ctx context.Context, network, addr string) (net.Conn, error) {
|
transport.DialTLSContext = func(ctx context.Context, network, addr string) (net.Conn, error) {
|
||||||
|
// Используем прокси если задан (HTTPS_PROXY) — без него API не доступен
|
||||||
dialer := &net.Dialer{Timeout: 30 * time.Second}
|
dialer := &net.Dialer{Timeout: 30 * time.Second}
|
||||||
|
proxyFunc := transport.Proxy
|
||||||
|
target := addr
|
||||||
|
if proxyFunc != nil {
|
||||||
|
proxy, err := proxyFunc(nil)
|
||||||
|
if err == nil && proxy != nil {
|
||||||
|
conn, err := dialer.DialContext(ctx, "tcp", proxy.Host)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
// CONNECT tunnel
|
||||||
|
fmt.Fprintf(conn, "CONNECT %s HTTP/1.1\r\nHost: %s\r\n\r\n", target, target)
|
||||||
|
br := bufio.NewReader(conn)
|
||||||
|
resp, err := http.ReadResponse(br, nil)
|
||||||
|
if err != nil || resp.StatusCode != 200 {
|
||||||
|
conn.Close()
|
||||||
|
return nil, fmt.Errorf("proxy CONNECT failed: %v", err)
|
||||||
|
}
|
||||||
|
host, _, _ := net.SplitHostPort(target)
|
||||||
|
uconn := utls.UClient(conn, &utls.Config{
|
||||||
|
ServerName: host,
|
||||||
|
InsecureSkipVerify: insecureSkipVerify,
|
||||||
|
MinVersion: tls.VersionTLS12,
|
||||||
|
}, utls.HelloFirefox_120)
|
||||||
|
if err := uconn.HandshakeContext(ctx); err != nil {
|
||||||
|
conn.Close()
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return uconn, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Прямое соединение (без прокси)
|
||||||
conn, err := dialer.DialContext(ctx, network, addr)
|
conn, err := dialer.DialContext(ctx, network, addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
version string = "5.0.65"
|
version string = "5.0.66"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|||||||
Reference in New Issue
Block a user