Konfigurasi Smart Dialer

Smart Dialer menelusuri strategi yang membuka blokir DNS dan TLS untuk daftar domain pengujian tertentu. Fungsi ini memerlukan konfigurasi yang menjelaskan beberapa strategi untuk dipilih.

Konfigurasi YAML untuk Smart Dialer

Konfigurasi yang digunakan Smart Dialer memiliki format YAML. Berikut ini contohnya:

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

Konfigurasi DNS

  • Kolom dns menentukan daftar resolver DNS yang akan diuji.
  • Setiap resolver DNS dapat berupa salah satu jenis berikut:
    • system: Menggunakan resolver sistem. Tentukan dengan objek kosong.
    • https: Gunakan pemroses DNS-over-HTTPS (DoH) terenkripsi.
    • tls: Gunakan resolver DNS melalui TLS (DoT) terenkripsi.
    • udp: Menggunakan resolver UDP.
    • tcp: Gunakan TCP resolver.

Resolver DNS-over-HTTPS (DoH)

https:
  name: dns.google
  address: 8.8.8.8
  • name: Nama domain server DoH.
  • address: Host:port server DoH. Defaultnya adalah name:443.

Resolver DNS-over-TLS (DoT)

tls:
  name: dns.google
  address: 8.8.8.8
  • name: Nama domain server DoT.
  • address: Host:port server DoT. Default-nya adalah name:853.

Resolver UDP

udp:
  address: 8.8.8.8
  • address: Host:port resolver UDP.

TCP Resolver

tcp:
  address: 8.8.8.8
  • address: Host:port dari resolver TCP.

Konfigurasi TLS

  • Kolom tls menentukan daftar transport TLS yang akan diuji.
  • Setiap transport TLS adalah string yang menentukan transport yang akan digunakan.
  • Misalnya, override:host=cloudflare.net|tlsfrag:1 menentukan transport yang menggunakan domain fronting dengan Cloudflare dan fragmentasi TLS. Lihat dokumentasi config untuk mengetahui detailnya.

Konfigurasi Penggantian

Konfigurasi penggantian digunakan jika tidak ada strategi tanpa proxy yang dapat terhubung. Misalnya, server proxy ini dapat menentukan server proxy cadangan untuk mencoba koneksi pengguna. Penggunaan penggantian akan lebih lambat untuk dimulai, karena strategi DNS/TLS lainnya harus gagal/waktunya habis terlebih dahulu.

String penggantiannya harus:

  • String konfigurasi StreamDialer yang valid seperti yang ditentukan dalam configurl.
  • Objek konfigurasi Psiphon yang valid sebagai turunan kolom psiphon.

Contoh server Shadowsocks

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

Contoh server SOCKS5

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

Contoh konfigurasi Psiphon

Untuk menggunakan jaringan Psiphon, Anda harus:

  1. Hubungi tim Psiphon untuk mendapatkan konfigurasi yang memberi Anda akses ke jaringan mereka. Hal ini mungkin memerlukan kontrak.
  2. Tambahkan konfigurasi Psiphon yang diterima ke bagian fallback konfigurasi Smart Dialer Anda. Karena JSON kompatibel dengan YAML, Anda dapat menyalin dan menempelkan konfigurasi Psiphon langsung ke bagian fallback, seperti ini:
fallback:
  - psiphon: {
      "PropagationChannelId": "FFFFFFFFFFFFFFFF",
      "SponsorId": "FFFFFFFFFFFFFFFF",
      "DisableLocalSocksProxy" : true,
      "DisableLocalHTTPProxy" : true,
      ...
    }

Cara Menggunakan Smart Dialer

Untuk menggunakan Smart Dialer, buat objek StrategyFinder dan panggil metode NewDialer, dengan meneruskan daftar domain pengujian dan konfigurasi YAML. Metode NewDialer akan menampilkan transport.StreamDialer yang dapat digunakan untuk membuat koneksi menggunakan strategi yang ditemukan. Contoh:

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.

Ini adalah contoh dasar dan mungkin perlu disesuaikan untuk kasus penggunaan spesifik Anda.

Menambahkan strategi penggantian baru

Strategi penggantian digunakan jika tidak ada strategi tanpa proxy yang berhasil. Biasanya, ini adalah proxy yang diharapkan lebih andal.

Untuk menambahkan strategi penggantian baru:

  1. Buat fungsi FallbackParser. Fungsi ini mengambil YAMLNode dan menampilkan transport.StreamDialer serta tanda tangan konfigurasi.
  2. Daftarkan FallbackParser dengan metode mobileproxy.SmartDialerOptions.RegisterFallbackParser.

Misalnya, berikut cara mendaftarkan penggantian yang dikonfigurasi dengan {error: "my error message"} yang selalu menampilkan error saat melakukan panggilan:

func RegisterErrorConfig(opt *mobileproxy.SmartDialerOptions, name string) {
    opt.RegisterFallbackParser(name, func(ctx context.Context, yamlNode smart.YAMLNode) (transport.StreamDialer, string, error) {
        switch typed := yamlNode.(type) {
        case string:
            dialer := transport.FuncStreamDialer(func(ctx context.Context, addr string) (transport.StreamConn, error) {
                return nil, errors.New(typed)
            })
            return dialer, typed, nil
        default:
            return nil, "", fmt.Errorf("invalid error dialer config")
        }
    })
}

func main() {
    // ...
  opts := mobileproxy.NewSmartDialerOptions(mobileproxy.NewListFromLines(*testDomainsFlag), *configFlag)
    opts.SetLogWriter(mobileproxy.NewStderrLogWriter())
    RegisterErrorConfig(opts, "error")
  //...
}