Configurar o Discador Inteligente

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 em configurl (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:

  1. Entrar em contato com a equipe do Psiphon para obter uma configuração que dê acesso à rede deles. Isso pode requerer um contrato.
  2. 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ção fallback, 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.