Pelepasan proxy MTProto tidak resmi dengan Python, fitur protokol

gambar

Baru-baru ini, pengembang Telegram telah memposting kode sumber dari server proxy yang berjalan pada protokol MTProto. Artikel-artikel tentang fitur - fitur perakitan dan pengemasan ulang kontainer dengan dok diterbitkan di hub . Server proxy resmi, ditulis dalam C, mengejutkan dengan jumlah kode - sekitar 23 ribu baris. Pada saat yang sama, dan kadang-kadang sedikit lebih awal, beberapa implementasi alternatif muncul, tetapi tidak ada yang mendukung kemungkinan mengiklankan saluran mereka.

Pada artikel ini, saya ingin, pertama, untuk berbicara tentang fitur protokol yang kurang dikenal untuk berkomunikasi server proxy dengan server eksternal dan, kedua, untuk berbicara tentang pengembangan kami sendiri - implementasi server proxy dengan Python, yang baru saja mencapai rilis dan tersedia untuk semua orang di bawah Lisensi MIT gratis.

Fitur interaksi server proxy dengan server eksternal


  1. Server proxy resmi tidak berinteraksi dengan server telegram secara langsung, tetapi menggunakan setidaknya satu lapisan proxy lagi untuk ini. Kami akan memanggil mereka proxy-menengah , daftar mereka tersedia di core.telegram.org/getProxyConfig dan core.telegram.org/getProxyConfigV6 . Koneksi IPv6 belum didukung oleh server proxy resmi.
  2. Untuk mengenkripsi data antara server proxy dan proxy tengah, digunakan kunci yang diperoleh dari alamat IP kedua node. Oleh karena itu, server proxy untuk menyambungkan ke proxy-tengah harus mengetahui alamat ip eksternal, jika tidak, kunci enkripsi pada satu dan sisi lain akan berbeda. Selain itu, nomor port dari kedua node dan rahasia bersama, tersedia di core.telegram.org/getProxySecret, berpartisipasi dalam pembentukan kunci. Pengembang Telegram merekomendasikan memperbarui rahasia ini sekali sehari.
  3. Saat menghubungkan server proxy ke proxy menengah, yang pertama mentransfer waktunya. Jika waktu berbeda lebih dari beberapa menit, sisi kedua menutup koneksi.
  4. Saat mengirim pesan dari klien ke proxy tengah, pesan tersebut dibungkus dengan panggilan RPC ke protokol MTProto. Dalam setiap panggilan RPC tersebut, proksi menambahkan beberapa argumen: ip dan port kedua node, pengenal koneksi acak, serta tag server proxy yang digunakan untuk menampilkan saluran iklan dalam aplikasi. Argumen tambahan ini menempati sekitar 96 byte. Karena fitur ini, tidak akan mungkin untuk menunjukkan saluran iklan ketika bekerja secara langsung, bukan melalui proxy tengah.
  5. Server Telegram β€œpercaya” informasi tentang klien ip yang diterima dari server proxy. Alamat-alamat ini dapat dilihat pada informasi sesi (persegi panjang digambar):
    gambar

  6. Satu koneksi TCP antara server proxy dan proxy tengah mengirimkan pesan dari pengguna yang berbeda. Dalam permintaan dan tanggapan ada argumen "pengidentifikasi koneksi acak", yang diperlukan agar data dapat mencapai klien yang tepat.
  7. Server proxy tidak dapat mendekripsi data klien, tetapi dapat membedakan pesan biasa dari file yang dikirimkan. Juga, dia tahu ukuran setiap pesan.

Fuf, saya harap tidak bosan dengan detail teknis. Sekarang harus jelas mengapa dalam banyak proksi alternatif tidak ada dukungan iklan - mereka mengirim pesan langsung ke server telegram, melewati proxy menengah. Ternyata jauh lebih mudah. Bagian kedua dari artikel ini menjelaskan implementasi tidak resmi pertama dari server proxy yang bekerja melalui proxy menengah. Saat ini, dalam domain publik Anda dapat menemukan tiga implementasi seperti: resmi, di Erlang dan yang ini.

Implementasi proxy python


Awalnya, server proxy ditulis untuk memahami fitur-fitur protokol dan merupakan pengembangan proyek lain - proxy kaus kaki asinkron, yang ditulis, pada gilirannya, untuk "menyentuh" ​​async / menunggu dengan Python.

Secara bertahap, proyek mulai memiliki pengguna yang dibanjiri dengan pertanyaan, laporan bug, dan permintaan fitur. Setelah perbaikan, proyek memasuki tahap pengujian dan stabilisasi beta, yang berlangsung sekitar seminggu dan melibatkan lima server dengan konfigurasi yang berbeda.

Sebelum saya berbicara tentang fitur-fitur yang belum dimiliki oleh server proxy resmi, tetapi proxy alternatif memiliki (dan tetap diam tentang fungsi-fungsi yang tidak dimiliki proxy resmi pada alternatif), saya akan berbicara tentang hal yang banyak orang pikirkan ketika mereka menyebutkan kata Python .

Performa


Untuk pengujian kinerja, mesin virtual digunakan dalam cloud konfigurasi minimal: 1 CPU, 1024MB RAM.

Pada pengujian sintetis, server proxy dapat mengirimkan sekitar 240 megabit / detik atau 3000 pesan / detik. Saat menggunakan implementasi alternatif dari event-loop di C, yang disebut uvloop, dan juga saat menggunakan interpreter PyPy, data kinerja berbeda (semua pengukuran adalah per detik):
gambar

Ketika menguji pada pengguna nyata, ternyata server seperti itu cukup untuk melayani 4.000 pengguna atau 8.000 dengan nyaman saat menggunakan PyPy. Kejutan besar adalah bahwa tidak peduli bagaimana server uji diiklankan di saluran berbahasa Rusia, masih 89% pengguna berasal dari Iran (mungkin untuk negara lain jumlah pengguna yang dilayani secara bersamaan akan berbeda). Ini terlihat seperti ini:

gambar

Saya bertanya kepada beberapa administrator server lain - situasinya sama. Mungkin ini disebabkan oleh fakta bahwa di Rusia, telegram berfungsi dengan baik tanpa server proxy. Di Iran, server uji diblokir untuk publik beberapa jam setelah pembuatannya.

gambar

Server memuat dengan 2.000 pengguna. Momen pemblokiran server untuk warga Iran terlihat jelas.

Oleh karena itu, kinerja CPU bukanlah hambatan pada simpul uji. Dengan 10.000 klien, memori kemungkinan akan habis.

Penggunaan simultan beberapa core CPU tidak diterapkan (halo, GIL).

Fitur yang belum dimiliki server proxy resmi


Bekerja pada protokol IPv6.
Server proxy tanpa konfigurasi tambahan dapat menggunakan IPv6 untuk koneksi keluar. Koneksi IPv6 tidak diblokir di Rusia (untuk saat ini).

Mode operasi tanpa proxy tengah
Jika iklan saluran tidak diperlukan, proksi secara otomatis terhubung langsung ke server telegram, melewati proxy tengah. Lebih cepat dan lebih dapat diandalkan.

Juga, " mode cepat " opsional diterapkan, ketika pesan dari server Telegram ke proksi dan dari proksi ke klien dienkripsi dengan kunci yang sama. Dengan demikian, proksi tidak perlu mengenkripsi ulang pesan - proxy mengirimkannya apa adanya. Ini seharusnya tidak mempengaruhi keselamatan. Dalam kasus apa pun, administrator proksi tidak memiliki akses ke pesan pengguna.

Perbarui daftar proxy menengah dan rahasia sekali sehari.
Server proxy resmi untuk memperbarui daftar proxy tengah merekomendasikan untuk memulai ulang wadah buruh pelabuhan sekali sehari, yang mengatur ulang semua koneksi. Koneksi baru tidak dapat dibuat jika, misalnya, server diblokir di negara tersebut. Versi Python secara berkala mengunjungi situs dan memperbarui daftar.

Multi-platform
Semua platform yang menjalankan Python didukung. Ternyata menjalankannya bahkan di iPad, namun, koneksi masuk eksternal diblokir oleh perangkat. Windows didukung secara terpisah, itu mengejutkan saya, berapa banyak orang yang meluncurkan proxy di bawah OS ini. Meskipun di bawah Windows Anda dapat menjalankan klien resmi jika Anda menggunakan teknologi virtualisasi atau buruh pelabuhan.

Kemampuan berjalan dengan mudah tanpa buruh pelabuhan.
Jika (tiba-tiba) ada orang yang tidak suka buruh pelabuhan, proxy dapat diluncurkan tanpa itu. Anda perlu menentukan setidaknya dua parameter dalam file konfigurasi: port dan secret, Anda juga dapat mengatur tag iklan opsional, kemudian jalankan perintah: python3 mtprotoproxy.py. Namun, dalam hal ini, Anda harus berpikir tentang autorun di OS, misalnya, menulis unit-file untuk systemd. Anda juga perlu menginstal pycrypto atau pycryptodome, tanpanya ia akan bekerja, tetapi sangat lambat.

Dalam hal buruh pelabuhan, kontainer dapat dibangun kembali dengan perintah buruh pelabuhan - membangun -.

Fitur dijadwalkan untuk rilis berikutnya


Membatasi kecepatan mengunduh file besar.
Saat mengunduh file besar, Anda dapat, di tingkat TCP, β€œmeminta” proxy tengah atau server Telegram untuk mengirim data lebih lambat. Sekarang ini dilakukan dengan menetapkan nilai kecil buffer terima, yang juga menghemat memori server.

Streaming pesan.
Sekarang, semua server proxy yang dikenal bekerja dengan proxy-tengah terlebih dahulu membaca pesan dari klien dan baru kemudian mengirimkannya. Ukuran satu pesan dapat mencapai 1MB. Memori diperlukan untuk penyimpanannya dan penundaan transmisi sedikit meningkat. Anda dapat mentransfer data streaming. Ini akan menyulitkan kode, tetapi akan mengurangi konsumsi memori dalam kasus terburuk.

Ubah panjang paket untuk memotong filter sepanjang paket .
Saya tidak berhasil masuk ke rilis.

Instalasi dan peluncuran


  1. git clone -b stable github.com/alexbers/mtprotoproxy.git; cd mtprotoproxy
  2. (opsional, disarankan) tentukan PORT , USERS , dan AD_TAG di config.py
  3. docker-compose up --build -d (atau python3 mtprotoproxy.py, jadi tanpa buruh pelabuhan)
  4. (opsional, menampilkan tautan dari formulir tg: //) log penyusun docker

gambar

Implementasi lain dari proxy MTProto dengan dukungan untuk iklan saluran:


Ucapan Terima Kasih
seriyps - untuk bantuan pengujian pada pengguna nyata
shifttstas - untuk tips buruh pelabuhan
forst (github) - untuk ide dan implementasi pekerjaan pada IPv6
p1ratrulezzz (github) - untuk tips dan artikel tentang proyek ini
freekzy (github) - untuk patch bug dengan handle bocor

UPD: repositori yang mengkompilasi implementasi yang berbeda dari proksi MTProto : github.com/mtProtoProxy

Source: https://habr.com/ru/post/id414139/


All Articles