Smart Dialer 配置

Smart Dialer 可针对特定的测试网域列表,搜索可绕过 DNS 和 TLS 封锁的策略。它需要用到包含多种策略的配置,以便从中选择一种策略。

适用于 Smart Dialer 的 YAML 配置

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:DoH 服务器的 host:port。默认为 name:443。

DNS-over-TLS 解析器 (DoT)

tls:
  name: dns.google
  address: 8.8.8.8
  • name:DoT 服务器的域名。
  • address:DoT 服务器的 host:port。默认为 name:853。

UDP 解析器

udp:
  address: 8.8.8.8
  • address:UDP 解析器的 host:port。

TCP 解析器

tcp:
  address: 8.8.8.8
  • address:TCP 解析器的 host:port。

TLS 配置

  • tls 字段用于指定要测试的 TLS 传输列表。
  • 每个 TLS 传输都以一个字符串表示,用于指定要使用的传输方式。
  • 例如,override:host=cloudflare.net|tlsfrag:1 指定了使用 Cloudflare 域名前置和 TLS 分片进行传输。如需了解详情,请参阅配置文档

后备配置

所有无代理策略均无法连接时,将使用后备配置。例如,该配置可指定备份代理服务器,用于尝试建立用户请求的连接。由于需要先等待其他 DNS/TLS 策略尝试失败/超时,才会使用后备配置,所以后备配置会增加启动延迟。

后备字符串应为:

  • configurl 中定义的有效 StreamDialer 配置字符串。
  • 作为 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 配置添加到 Smart Dialer 配置的 fallback 部分。由于 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.

这是一个基本示例,可能需要根据具体应用场景进行调整。