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
dnsespecifica 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
tlsespecifica 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:1especifica 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
StreamDialervá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
fallbackda 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.