Lo Smart Dialer cerca una strategia per sbloccare il DNS e il TLS per un elenco specificato di domini di test. Richiede una configurazione che descriva più strategie tra cui scegliere.
Configurazione YAML per lo Smart Dialer
La configurazione per lo Smart Dialer deve essere in formato YAML. Ecco un esempio:
dns:
- system: {}
- https:
name: 8.8.8.8
- https:
name: 9.9.9.9
tls:
- ""
- split:2
- tlsfrag:1
fallback:
- ss://Y2hhY2hhMjAtaWV0Zi1wb2x5MTMwNTprSzdEdHQ0MkJLOE9hRjBKYjdpWGFK@1.2.3.4:9999/?outline=1
Configurazione DNS
- Il campo
dns
specifica un elenco di resolver DNS da testare. - Ogni resolver DNS può essere di uno dei tipi seguenti:
system
: usa il resolver di sistema. Va specificato con un oggetto vuoto.https
: usa un resolver DNS over HTTPS (DoH) crittografato.tls
: usa un resolver DNS over TLS (DoT) crittografato.udp
: usa un resolver UDP.tcp
: usa un resolver TCP.
Resolver DNS over HTTPS (DoH)
https:
name: dns.google
address: 8.8.8.8
name
: il nome di dominio del server DoH.address
: l'indirizzo host:porta del server DoH. Il valore predefinito èname
:443.
Resolver DNS over TLS (DoT)
tls:
name: dns.google
address: 8.8.8.8
name
: il nome di dominio del server DoT.address
: l'indirizzo host:porta del server DoT. Il valore predefinito èname
:853.
Resolver UDP
udp:
address: 8.8.8.8
address
: l'indirizzo host:porta del resolver UDP.
Resolver TCP
tcp:
address: 8.8.8.8
address
: l'indirizzo host:porta del resolver TCP.
Configurazione TLS
- Il campo
tls
specifica un elenco di trasporti TLS da testare. - Ogni trasporto TLS è una stringa che specifica il trasporto da utilizzare.
- Ad esempio,
override:host=cloudflare.net|tlsfrag:1
specifica un trasporto che usa il domain fronting con Cloudflare e la frammentazione TLS. Vedi la documentazione sulla configurazione per maggiori dettagli.
Configurazione di fallback
La configurazione di fallback viene utilizzata se nessuna delle strategie senza proxy consente la connessione. Ad esempio, può specificare un server proxy di backup per tentare la connessione dell'utente. L'utilizzo di una strategia di fallback richiede più tempo, perché viene avviata dopo il timeout o l'esito negativo delle altre strategie DNS/TLS.
Le stringhe della configurazione di fallback devono essere:
- Una stringa di configurazione
StreamDialer
valida come definito inconfigurl
. - Un oggetto di configurazione Psiphon valido come elemento secondario di un campo
psiphon
.
Esempio di server Shadowsocks
fallback:
- ss://Y2hhY2hhMjAtaWV0Zi1wb2x5MTMwNTprSzdEdHQ0MkJLOE9hRjBKYjdpWGFK@1.2.3.4:9999/?outline=1
Esempio di server SOCKS5
fallback:
- socks5://[USERINFO]@[HOST]:[PORT]
Esempio di configurazione Psiphon
Per utilizzare la rete Psiphon dovrai:
- Contattare il team di Psiphon per ottenere una configurazione di accesso alla loro rete. Può essere necessario stipulare un contratto.
- Aggiungere la configurazione di Psiphon alla sezione
fallback
della configurazione del tuo Smart Dialer. Poiché JSON è compatibile con YAML, puoi copiare e incollare la configurazione di Psiphon direttamente nella sezionefallback
, in questo modo:
fallback:
- psiphon: {
"PropagationChannelId": "FFFFFFFFFFFFFFFF",
"SponsorId": "FFFFFFFFFFFFFFFF",
"DisableLocalSocksProxy" : true,
"DisableLocalHTTPProxy" : true,
...
}
Come utilizzare lo Smart Dialer
Per utilizzare lo Smart Dialer, crea un oggetto StrategyFinder
e chiama il metodo NewDialer
, passando l'elenco dei domini di test e la configurazione YAML.
Il metodo NewDialer
restituirà un oggetto transport.StreamDialer
che può essere utilizzato per creare connessioni mediante la strategia trovata. Ad esempio:
finder := &smart.StrategyFinder{
TestTimeout: 5 * time.Second,
LogWriter: os.Stdout,
StreamDialer: &transport.TCPDialer{},
PacketDialer: &transport.UDPDialer{},
}
configBytes := []byte(`
dns:
- system: {}
- https:
name: 8.8.8.8
- https:
name: 9.9.9.9
tls:
- ""
- split:2
- tlsfrag:1
fallback:
- ss://Y2hhY2hhMjAtaWV0Zi1wb2x5MTMwNTprSzdEdHQ0MkJLOE9hRjBKYjdpWGFK@1.2.3.4:9999/?outline=1
`)
dialer, err := finder.NewDialer(
context.Background(),
[]string{"www.google.com"},
configBytes
)
if err != nil {
// Handle error.
}
// Use dialer to create connections.
Questo è un esempio di base e può essere necessario adattarlo al tuo caso d'uso specifico.