Перейти к основному содержимому

Конфигурация Smart Dialer

Smart Dialer подбирает стратегию, которая позволяет обойти блокировки DNS и TLS для заданного списка тестовых доменов. Резолвер использует конфигурацию, описывающую несколько доступных стратегий.

Конфигурация YAML для Smart Dialer

Конфигурация, которую использует Smart Dialer, задается в формате YAML. Пример:

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

  • Поле dns указывает список DNS-резолверов, которые необходимо протестировать.

  • Каждый DNS-резолвер может относиться к одному из следующих типов:

    • system: используется системный резолвер. Указывается как пустой объект.

    • https: используется зашифрованный резолвер DNS-over-HTTPS (DoH).

    • tls: используется зашифрованный резолвер DNS over TLS (DoT).

    • udp: используется UDP-резолвер.

    • tcp: используется TCP-резолвер.

Резолвер DNS-over-HTTPS (DoH)

https:
name: dns.google
address: 8.8.8.8
  • name: доменное имя сервера DoH.

  • address: адрес сервера в формате host:port. Значение по умолчанию – name:443.

Резолвер DNS-over-TLS (DoT)

tls:
name: dns.google
address: 8.8.8.8
  • name: доменное имя сервера DoT.

  • address: адрес сервера в формате host:port. Значение по умолчанию – name:853.

UDP-резолвер

udp:
address: 8.8.8.8
  • address: адрес резолвера в формате host:port.

TCP-резолвер

tcp:
address: 8.8.8.8
  • address: адрес резолвера в формате host:port.

Конфигурация TLS

  • Поле tls указывает список протоколов TLS, которые необходимо протестировать.

  • Каждый протокол задается строкой, определяющей используемую технологию.

  • Например, override:host=cloudflare.net|tlsfrag:1 обозначает протокол, использующий доменное прикрытие с Cloudflare и фрагментацию TLS. Подробная информация приведена в документации по конфигурации.

Резервная конфигурация

Резервная конфигурация используется, если ни одна из стратегий без прокси-сервера не сработала. Например, можно указать резервный прокси-сервер, через который будет предпринята попытка подключения. Использование резервной конфигурации приведет к более медленному запуску, поскольку сначала должны завершиться неудачей или по таймауту все попытки по DNS- и TLS-стратегиям.

Допустимые строки для резервной конфигурации:

  • Допустимая строка конфигурации StreamDialer, как определено в configurl.

  • Допустимый объект конфигурации Psiphon, вложенный в поле psiphon.

Пример сервера Shadowsocks

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

Пример сервера SOCKS5

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

Пример конфигурации Psiphon

Чтобы использовать сеть Psiphon, необходимо:

  1. Связаться с командой Psiphon, чтобы получить конфигурацию для доступа к их сети. Возможно, для этого потребуется заключить договор.

  2. Добавить полученную конфигурацию Psiphon в раздел fallback конфигурации Smart Dialer. Поскольку JSON-файл совместим с YAML, вы можете вставить конфигурацию Psiphon напрямую в раздел fallback, например:

fallback:
- psiphon: {
"PropagationChannelId": "FFFFFFFFFFFFFFFF",
"SponsorId": "FFFFFFFFFFFFFFFF",
"DisableLocalSocksProxy" : true,
"DisableLocalHTTPProxy" : true,
...
}

Как использовать Smart Dialer

Чтобы использовать Smart Dialer, создайте объект StrategyFinder и вызовите метод NewDialer, передав список тестовых доменов и YAML-конфигурацию. Метод NewDialer вернет transport.StreamDialer, с помощью которого можно будет создавать подключения с использованием подобранной стратегии. Например:

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.

Это базовый пример, который при необходимости можно адаптировать под ваш сценарий использования.