Smart Dialer Config

Der Smart Dialer sucht nach einer Strategie, die DNS und TLS für eine bestimmte Liste von Test-Domains freigibt. Es wird eine Konfiguration benötigt, die mehrere Strategien beschreibt, aus denen ausgewählt werden kann.

YAML config für den Smart Dialer

Die config, die der Smart Dialer auswählt, hat das YAML-Format. Hier ein Beispiel:

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-Konfiguration

  • Das dns-Feld führt eine Liste mit zu testenden DNS-Resolvern auf.
  • Die DNS-Resolver können die folgenden Typen sein:
    • system: Verwenden Sie den System-Resolver. Spezifizieren Sie ihn mit einem leeren Objekt.
    • https: Verwenden Sie einen verschlüsselten DNS-over-HTTPS (DoH)-Resolver.
    • tls: Verwenden Sie einen verschlüsselten DNS-over-TLS (DoT)-Resolver.
    • udp: Verwenden Sie einen UDP-Resolver.
    • tcp: Verwenden Sie einen TCP-Resolver.

DNS-over-HTTPS-Resolver (DoH)

https:
  name: dns.google
  address: 8.8.8.8
  • name: Der Domainname des DoH-Servers.
  • address: Der host:port des DoH-Servers. Die Standardeinstellung von name ist 443.

DNS-over-TLS Resolver (DoT)

tls:
  name: dns.google
  address: 8.8.8.8
  • name: Der Domainname des DoT-Servers.
  • address: Der host:port des DoT-Servers. Die Standardeinstellung von name ist 853.

UDP-Resolver

udp:
  address: 8.8.8.8
  • address: Der host:port des UDP-Resolvers.

TCP-Resolver

tcp:
  address: 8.8.8.8
  • address: Der host:port des TCP-Resolvers.

TLS-Konfiguration

  • Das tls-Feld führt eine Liste mit zu testenden TLS-Transports auf.
  • Jeder TLS-Transport ist ein String, der den zu verwendenden Transport angibt.
  • Beispielsweise spezifiziert override:host=cloudflare.net|tlsfrag:1 einen Transport, der Domain Fronting mit Cloudflare und TLS-Fragmentierung verwendet. In der config-Dokumentation finden Sie weitere Details dazu.

Fallback-Konfiguration

Eine Fallback-Konfiguration wird verwendet, wenn keine der proxylosen Strategien eine Verbindung herstellen kann. Sie kann beispielsweise einen Backup-Proxyserver angeben, der versucht, die Verbindung des Nutzers herzustellen. Die Verwendung einer Fallback-Konfiguration verlangsamt den Start, da zuerst die anderen DNS/TLS-Strategien fehlschlagen/eine Zeitüberschreitung verursachen müssen.

Die Fallback-Strings sollten Folgendes sein:

  • Ein gültiger StreamDialer config-String, wie in configurl definiert.
  • Ein gültiges Psiphon-Konfigurationsobjekt als untergeordnetes Objekt eines psiphon-Feldes.

Shadowsocks-Server-Beispiel

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

SOCKS5-Server-Beispiel

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

Psiphon config-Beispiel

Um das Psiphon-Netzwerk zu nutzen, ist Folgendes nötig:

  1. Sie müssen sich an das Psiphon-Team wenden, um eine Konfiguration zu erhalten, die Ihnen den Zugriff auf deren Netzwerk ermöglicht. Dazu kann ein Vertrag erforderlich sein.
  2. Fügen Sie die erhaltene Psiphon-Konfiguration in den fallback-Abschnitt Ihrer Smart Dialer-Konfiguration ein. Da JSON mit YAML kompatibel ist, können Sie Ihre Psiphon-Konfiguration kopieren und direkt in den fallback-Abschnitt einfügen, wie hier gezeigt:
fallback:
  - psiphon: {
      "PropagationChannelId": "FFFFFFFFFFFFFFFF",
      "SponsorId": "FFFFFFFFFFFFFFFF",
      "DisableLocalSocksProxy" : true,
      "DisableLocalHTTPProxy" : true,
      ...
    }

Verwendung des Smart Dialers

Um den Smart Dialer zu verwenden, erstellen Sie ein StrategyFinder-Objekt. Rufen Sie die NewDialer-Methode auf und übergeben Sie die Liste der Testdomains und die YAML-Konfiguration. Die NewDialer-Methode wird einen transport.StreamDialer zurückgeben, der zur Erstellung von Verbindungen mit der gefundenen Strategie verwendet werden kann. Beispiel:

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.

Dies ist ein einfaches Beispiel, das möglicherweise an Ihren speziellen Anwendungsfall angepasst werden muss.