The Smart Dialer searches for a strategy that unblocks DNS and TLS for a given list of test domains. It takes a config describing multiple strategies to pick from.
YAML config for the Smart Dialer
The config that the Smart Dialer takes is in a YAML format. Here is an example:
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
DNS Configuration
- The
dns
field specifies a list of DNS resolvers to test. - Each DNS resolver can be one of the following types:
system
: Use the system resolver. Specify with an empty object.https
: Use an encrypted DNS over HTTPS (DoH) resolver.tls
: Use an encrypted DNS over TLS (DoT) resolver.udp
: Use a UDP resolver.tcp
: Use a TCP resolver.
DNS-over-HTTPS Resolver (DoH)
https:
name: dns.google
address: 8.8.8.8
name
: The domain name of the DoH server.address
: The host:port of the DoH server. Defaults toname
:443.
DNS-over-TLS Resolver (DoT)
tls:
name: dns.google
address: 8.8.8.8
name
: The domain name of the DoT server.address
: The host:port of the DoT server. Defaults toname
:853.
UDP Resolver
udp:
address: 8.8.8.8
address
: The host:port of the UDP resolver.
TCP Resolver
tcp:
address: 8.8.8.8
address
: The host:port of the TCP resolver.
TLS Configuration
- The
tls
field specifies a list of TLS transports to test. - Each TLS transport is a string that specifies the transport to use.
- For example,
override:host=cloudflare.net|tlsfrag:1
specifies a transport that uses domain fronting with Cloudflare and TLS fragmentation. See the config documentation for details.
Fallback Configuration
A fallback configuration is used if none of the proxyless strategies are able to connect. For example it can specify a backup proxy server to attempt the user's connection. Using a fallback will be slower to start, since first the other DNS/TLS strategies must fail/timeout.
The fallback strings should be:
- A valid
StreamDialer
config string as defined inconfigurl
. - A valid Psiphon configuration object as a child of a
psiphon
field.
Shadowsocks server example
fallback:
- ss://Y2hhY2hhMjAtaWV0Zi1wb2x5MTMwNTprSzdEdHQ0MkJLOE9hRjBKYjdpWGFK@1.2.3.4:9999/?outline=1
SOCKS5 server example
fallback:
- socks5://[USERINFO]@[HOST]:[PORT]
Psiphon config example
To use the Psiphon network, you will need to:
- Reach out to the Psiphon team to obtain a config that gives you access to their network. This may require a contract.
- Add the received Psiphon config to the
fallback
section of your Smart Dialer config. Since JSON is compatible with YAML, you can copy and paste your Psiphon config directly into thefallback
section, like this:
fallback:
- psiphon: {
"PropagationChannelId": "FFFFFFFFFFFFFFFF",
"SponsorId": "FFFFFFFFFFFFFFFF",
"DisableLocalSocksProxy" : true,
"DisableLocalHTTPProxy" : true,
...
}
How to Use the Smart Dialer
To use the Smart Dialer, create a StrategyFinder
object and call the
NewDialer
method, passing in the list of test domains and the YAML config.
The NewDialer
method will return a transport.StreamDialer
that can be used
to create connections using the found strategy. For example:
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.
This is a basic example and may need to be adapted for your specific use case.