Smart Dialer Config

O Smart Dialer (link em inglês) procura uma estratégia que desbloqueie o DNS e o TLS para uma lista específica de domínios de teste. Ele usa uma configuração que descreve várias estratégias para escolher.

Configuração YAML para o discador inteligente

A configuração que o discador inteligente usa está em um formato YAML. 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 a serem testados.
  • 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 DNS sobre HTTPS (DoH) criptografado.
    • tls: use um resolvedor DNS criptografado sobre TLS (DoT).
    • udp: use um resolvedor UDP.
    • tcp: use um solucionador TCP.

Resolvedor DNS sobre HTTPS (DoH)

https:
  name: dns.google
  address: 8.8.8.8
  • name: o nome de domínio do servidor DoH.
  • address: o host:porta do servidor DoH. O padrão é name:443.

Resolvedor DNS por TLS (DoT)

tls:
  name: dns.google
  address: 8.8.8.8
  • name: o nome de domínio do servidor DoT.
  • address: o host:porta do servidor DoT. O padrão é name:853.

Resolvedor UDP

udp:
  address: 8.8.8.8
  • address: o host:porta do resolvedor UDP.

Resolvedor TCP

tcp:
  address: 8.8.8.8
  • address: o host:porta do resolvedor TCP.

Configuração de TLS

  • O campo tls especifica uma lista de transportes TLS a serem testados.
  • Cada transporte TLS é uma string que especifica o transporte a ser usado.
  • Por exemplo, override:host=cloudflare.net|tlsfrag:1 especifica um transporte que usa o fronting de domínio com a Cloudflare e a fragmentação TLS. Consulte a documentação de configuração para mais detalhes.

Configuração substituta

Uma configuração de fallback é usada se nenhuma das estratégias sem proxy conseguir se conectar. Por exemplo, ele pode especificar um servidor proxy de backup para tentar a conexão do usuário. O uso de um substituto será mais lento para começar, já que as outras estratégias DNS/TLS precisam falhar/expirar primeiro.

As strings de substituição precisam ser:

  • Uma string de configuração StreamDialer válida, conforme definido em configurl.
  • Um objeto de configuração válido do Psiphon como filho de um campo psiphon.

Exemplo de servidor Shadowsocks

fallback:
  - ss://Y2hhY2hhMjAtaWV0Zi1wb2x5MTMwNTprSzdEdHQ0MkJLOE9hRjBKYjdpWGFK@1.2.3.4:9999/?outline=1

Exemplo de servidor SOCKS5

fallback:
  - socks5://[USERINFO]@[HOST]:[PORT]

Exemplo de configuração do Psiphon

Para usar a rede Psiphon, você precisa fazer o seguinte:

  1. Entre em contato com a equipe do Psiphon para receber uma configuração que dê acesso à rede. Isso pode exigir um contrato.
  2. Adicione a configuração do Psiphon recebida à seção fallback da configuração do discador inteligente. Como o JSON é compatível com o YAML, você pode copiar e colar a configuração do Psiphon diretamente na seção fallback, como esta:
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 YAML. O método NewDialer retorna um transport.StreamDialer que pode ser usado para criar conexões usando a estratégia encontrada. 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 e pode precisar ser adaptado para seu caso de uso específico.