O Discador Inteligente procura uma estratégia de desbloqueio de DNS e TLS para uma lista de domínios de teste. Ele aceita configurações que descrevem várias estratégias opcionais.
Configuração do YAML para o Discador Inteligente
As configurações que o Discador Inteligente aceita devem estar no formato YAML. Veja um exemplo:
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
Configuração do DNS
- O campo
dns
especifica uma lista de resolvedores de DNS para testar. - Cada resolvedor de DNS pode ser de um dos seguintes tipos:
system
: use o resolvedor do sistema. Especifique com um objeto vazio.https
: use um resolvedor criptografado de DNS sobre HTTPS (DoH).tls
: use um resolvedor criptografado de DNS sobre TLS (DoT).udp
: use um resolvedor de UDP.tcp
: use um resolvedor de TCP.
Resolvedor de DNS sobre HTTPS (DoH)
https:
name: dns.google
address: 8.8.8.8
name
: o nome de domínio do servidor de DoH.address
: o host:porta do servidor de DoH. O padrão éname
:443.
Resolvedor de DNS sobre TLS (DoT)
tls:
name: dns.google
address: 8.8.8.8
name
: o nome de domínio do servidor de DoT.address
: o host:porta do servidor de DoT. O padrão éname
:853.
Resolvedor de UDP
udp:
address: 8.8.8.8
address
: o host:porta do resolvedor de UDP.
Resolvedor de TCP
tcp:
address: 8.8.8.8
address
: o host:porta do resolvedor de TCP.
Configuração de TLS
- O campo
tls
especifica uma lista de transportes de TLS para testar. - Cada transporte de TLS é uma string que especifica o transporte a ser usado.
- Por exemplo,
override:host=cloudflare.net|tlsfrag:1
especifica um transporte que usa domain fronting com Cloudflare e fragmentação de TLS. Confira a documentação de configuração (em inglês) para mais detalhes.
Configuração alternativa
Uma configuração alternativa é usada se a conexão não for possível com nenhuma das estratégias sem proxy. Por exemplo, ela pode especificar um servidor proxy de backup para tentar conectar o usuário. Ao usar uma configuração alternativa, o início será mais lento, já que primeiro as outras estratégias de DNS/TLS precisam falhar ou exceder o tempo limite.
As strings alternativas devem ser:
- Uma string de configuração
StreamDialer
válida conforme definido emconfigurl
(em inglês). - Um objeto de configuração Psiphon como filho de um campo
psiphon
.
Exemplo de servidor do Shadowsocks
fallback:
- ss://Y2hhY2hhMjAtaWV0Zi1wb2x5MTMwNTprSzdEdHQ0MkJLOE9hRjBKYjdpWGFK@1.2.3.4:9999/?outline=1
Exemplo de servidor do SOCKS5
fallback:
- socks5://[USERINFO]@[HOST]:[PORT]
Exemplo de configuração do Psiphon
Para usar a rede Psiphon, você vai precisar:
- Entrar em contato com a equipe do Psiphon para obter uma configuração que dê acesso à rede deles. Isso pode requerer um contrato.
- Adicionar a configuração do Psiphon que você recebeu à seção
fallback
da sua configuração do Discador Inteligente. Já que JSON e YAML são compatíveis, você pode copiar e colar sua configuração do Psiphon diretamente na seçãofallback
, assim:
fallback:
- psiphon: {
"PropagationChannelId": "FFFFFFFFFFFFFFFF",
"SponsorId": "FFFFFFFFFFFFFFFF",
"DisableLocalSocksProxy" : true,
"DisableLocalHTTPProxy" : true,
...
}
Como usar o Discador Inteligente
Para usar o Discador Inteligente, crie um objeto StrategyFinder
e chame o
método NewDialer
, transmitindo a lista de domínios de teste e a configuração do YAML.
O método NewDialer
vai retornar um transport.StreamDialer
que pode ser usado
para criar conexões usando a estratégia encontrada. Por exemplo:
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.
Este é um exemplo básico. Adapte-o ao seu caso de uso específico.