智能拨号器配置

智能拨号器会搜索一种策略,以便为给定测试网域列表解除 DNS 和 TLS 屏蔽。它接受一个配置,其中描述了可供选择的多种策略。

智能拨号器的 YAML 配置

智能拨号器采用的配置采用 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 服务器的主机名:端口。默认值为 name:443。

DNS-over-TLS 解析器 (DoT)

tls:
  name: dns.google
  address: 8.8.8.8
  • name:DoT 服务器的域名。
  • address:DOT 服务器的主机名:端口。默认值为 name:853。

UDP 解析器

udp:
  address: 8.8.8.8
  • address:UDP 解析器的主机:端口。

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 策略必须先失败/超时。

回退字符串应满足以下条件:

  • 有效的 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 部分。由于 JSON 与 YAML 兼容,因此您可以直接将 Psiphon 配置复制并粘贴到 fallback 部分,如下所示:
fallback:
  - psiphon: {
      "PropagationChannelId": "FFFFFFFFFFFFFFFF",
      "SponsorId": "FFFFFFFFFFFFFFFF",
      "DisableLocalSocksProxy" : true,
      "DisableLocalHTTPProxy" : true,
      ...
    }

如何使用智能拨号器

如需使用智能拨号器,请创建 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.

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