Bagaimana cara berteman python dengan Internet Tak Terlihat? Dasar-dasar pengembangan aplikasi I2P dalam Python dan asyncio


Proyek Internet Tak Terlihat (selanjutnya hanya I2P) menyediakan platform pengembang untuk mengembangkan aplikasi dengan persyaratan privasi pengguna yang ditingkatkan. Ini adalah jaringan virtual di atas Internet normal di mana node dapat bertukar data tanpa mengungkapkan alamat IP mereka yang sebenarnya. Alih-alih alamat IP di dalam Invisible Internet, koneksi terjadi antara alamat virtual yang disebut I2P Destination. Anda dapat memiliki sejumlah alamat tersebut dan mengubahnya bahkan untuk setiap koneksi, mereka tidak memberikan informasi apa pun kepada pihak lain tentang alamat IP asli klien.


Artikel ini menjelaskan hal-hal dasar yang perlu Anda ketahui untuk menulis aplikasi I2P. Contoh kode disediakan dalam Python menggunakan kerangka kerja asinkron bawaan asyncio.


Mengaktifkan SAM API dan menginstal i2plib


I2P menawarkan beberapa API untuk berinteraksi dengan aplikasi klien. Untuk aplikasi Java, I2CP digunakan, untuk aplikasi client-server biasa, proxy I2PTunnel, HTTP dan Socks dapat digunakan. Kami akan membuat aplikasi dengan Python, jadi pilih SAM . Secara default, di klien Java asli, SAM API dimatikan, jadi Anda harus mengaktifkannya. Buka konsol web router I2P, halaman "I2P internal" -> "Klien". Centang kotak "Run at Startup" dan klik "Start", lalu "Save Client Configuration".



Di C ++, klien i2pd SAM sudah diaktifkan secara default.


Untuk kemudahan penggunaan SAM API, saya menulis perpustakaan Python i2plib . Anda dapat menginstalnya melalui pip atau mengunduh kode sumber dari GitHub.


pip install i2plib 

Karena pustaka ini bekerja dengan kerangka asyncio asyncio bawaan , ingatlah bahwa contoh kode juga diambil dari fungsi asinkron (coroutine) yang bekerja di loop acara. Contoh penggunaan tambahan ada di dalam repositori .


Tujuan dan pembuatan sesi


Pada intinya, I2P Destination adalah sekelompok kunci enkripsi dan penandatanganan data. Kunci publik dari bundel ini diterbitkan pada jaringan I2P dan digunakan sebagai ganti alamat IP untuk membuat koneksi.


Kami akan menghasilkan i2plib.Destination , yang akan kami gunakan di masa depan:


 dest = await i2plib.new_destination() print(dest.base32 + ".b32.i2p") #  base32  

Alamat base32 adalah hash di mana rekan-rekan lain dapat menemukan tujuan Anda di jaringan. Jika Anda berencana untuk menggunakan Tujuan ini dalam program Anda secara berkelanjutan, simpan konten dest.private_key.data ke file lokal.


Sekarang Anda dapat membuat sesi SAM, yang secara harfiah berarti membuat Destinasi ini online secara online:


  session_nickname = "test-i2p" #      nickname _, session_writer = await i2plib.create_session(session_nickname, destination=dest) 

Penting untuk dicatat bahwa Destination akan online selama soket session_writer terbuka. Jika Anda ingin "mematikan" Tujuan ini dari jaringan, panggil session_writer.close ().


Membuat koneksi keluar


Sekarang Destination sedang online, kita dapat menggunakannya untuk berkomunikasi dengan node lain. Misalnya, sambungkan ke simpul "udhdrtrcetjm5sxzskjyr5ztpeszydbh4dpl3pl4utgqqw2v4jna.b32.i2p", kirim permintaan GET HTTP dan baca respons (ada server web "i2p-projekt.i2p"):


 remote_host = "udhdrtrcetjm5sxzskjyr5ztpeszydbh4dpl3pl4utgqqw2v4jna.b32.i2p" reader, writer = await i2plib.stream_connect(session_nickname, remote_host) writer.write("GET /en/ HTTP/1.0\nHost: {}\r\n\r\n".format(remote_host).encode()) buflen, resp = 4096, b"" while 1: data = await reader.read(buflen) if len(data) > 0: resp += data else: break writer.close() print(resp.decode()) 

Terima koneksi masuk


Saat menghubungkan ke host lain, seperti yang Anda lihat, semuanya sederhana, tetapi dengan penerimaan masuk ada satu nuansa. Ketika klien baru terhubung ke Anda, SAM mengirim string ASCII socket dengan Tujuan klien itu. Karena Tujuan dan data dapat dibuat utuh, Anda perlu mempertimbangkan ini.


Inilah tampilan server PING-PONG sederhana, yang menerima koneksi masuk, menyimpan Tujuan klien ke variabel remote_destination, dan mengirim PONG kembali:


 async def handle_client(incoming, reader, writer): """  """ dest, data = incoming.split(b"\n", 1) remote_destination = i2plib.Destination(dest.decode()) if not data: data = await reader.read(BUFFER_SIZE) if data == b"PING": writer.write(b"PONG") writer.close() #  ,        while True: reader, writer = await i2plib.stream_accept(session_nickname) incoming = await reader.read(BUFFER_SIZE) asyncio.ensure_future(handle_client(incoming, reader, writer)) 

Info lebih lanjut


Ini menjelaskan penggunaan protokol Streaming, yang melakukan fungsi TCP / IP pada jaringan I2P. SAM API juga menyediakan kemampuan untuk mengirim dan menerima datagram anonim, mirip dengan protokol UDP. Fungsi ini belum tersedia di i2plib dan akan ditambahkan kemudian.


Ini hanya informasi paling dasar, tetapi sudah cukup untuk memulai proyek Anda di I2P. Internet tidak kasat mata cocok untuk menulis berbagai aplikasi yang pertama-tama penting untuk menjaga privasi pengguna. Jaringan tidak memberlakukan batasan pada pengembang, dapat berupa server-klien atau aplikasi P2P.


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


All Articles