Perkenalan
Pada tahun 1990-an, internet adalah tempat yang tidak aman karena lalu lintas jaringan sebagian besar tidak terenkripsi dan dapat dilacak, sehingga memungkinkan peretas melakukan serangan man-in-the-middle dan mengumpulkan data pribadi dengan mudah. Untuk mengatasi masalah ini, sekelompok peneliti dari laboratorium penelitian angkatan laut A.S. memulai proyek The Onion Routing (TOR) dengan tujuan untuk menganonimkan dan mengamankan komunikasi di internet.
Metodologi
TOR mengandalkan model kepercayaan terdistribusi untuk mengamankan lalu lintas jaringan Anda melalui internet. Ini adalah metodologi di mana data Anda dienkripsi oleh banyak pihak untuk memberikan perlindungan data berlapis (seperti Onion). Jadi data Anda akan aman, kecuali ada orang yang mampu membajak semua pihak yang terlibat dalam enkripsi tersebut.
Dalam praktiknya, TOR memilih 3 relai unik yang dioperasikan oleh entitas berbeda untuk mengenkripsi dan merutekan lalu lintas jaringan Anda sebelum mencapai tujuan akhir.
Berikut adalah diagram sederhana untuk menggambarkan metodologinya.
Untuk mempelajari lebih lanjut tentang TOR, Velentin Quelquejay memiliki artikel yang bagus untuk itu.
Untuk artikel ini, saya akan fokus pada aspek praktis dalam mengonfigurasi proxy TOR dengan Python karena saya merasa kurangnya materi dan diskusi online di bidang ini.
Untuk membantu Anda belajar lebih efektif, saya telah membagi tutorial ini menjadi 3 tingkat kesulitan, yang mencakup fitur-fitur berguna dari TOR, yang memungkinkan Anda memanfaatkan potensi penuhnya.
Prasyarat
Sebelum melanjutkan tutorial ini, pastikan Anda telah menginstal yang berikut ini.
- Python3
- Batang pemasangan pip
- Klon Git https://github.com/ohyicong/Tor
Pengaturan Dasar: Konfigurasi default
Berikut adalah kode sederhana dan efektif untuk membuat server proxy TOR menggunakan konfigurasi defaultnya:
- Buat proxy pada port lokal 9050
- Buat koneksi TOR melalui 3 relay unik (acak)
- Mengubah alamat IP setiap 10 menit
# complete code found in create_basic_tor_proxy.py import io import os import stem.process import re SOCKS_PORT = 9050 TOR_PATH = os.path.normpath(os.getcwd()+"\\tor\\tor.exe") tor_process = stem.process.launch_tor_with_config( config = { 'SocksPort': str(SOCKS_PORT), }, init_msg_handler = lambda line: print(line) if re.search('Bootstrapped', line) else False, tor_cmd = TOR_PATH )
Untuk memeriksa apakah penyiapan Anda berhasil, Anda dapat membuat permintaan GET ke http://ip-api.com/json/. Jika alamat IP berasal dari negara lain, Anda telah berhasil menyiapkan proxy TOR pertama Anda!
import requests import json from datetime import datetime PROXIES = { 'http': 'socks5://127.0.0.1:9050', 'https': 'socks5://127.0.0.1:9050' } response = requests.get("http://ip-api.com/json/", proxies=PROXIES) result = json.loads(response.content) print('TOR IP [%s]: %s %s'%(datetime.now().strftime("%d-%m-%Y %H:%M:%S"), result["query"], result["country"]))
Ingatlah untuk menghentikan proxy Anda sebelum memulai latihan berikutnya. Berikut adalah perintah untuk menghentikannya.
tor_process.kill()
Pengaturan Menengah: Pilih relai dari negara tertentu
Mungkin ada beberapa contoh di mana Anda memerlukan kontrol lebih besar atas koneksi TOR. Berikut beberapa kemungkinan alasannya:
- Menghindari relay dari negara tertentu karena alasan keamanan siber/hukum/politik.
- Mengubah kecepatan refresh alamat IP TOR.
- Menggunakan metode otentikasi berbeda untuk koneksi TOR
Kode di bawah ini membuat server proxy TOR pada port lokal 9050 dengan konfigurasi berikut:
- EntryNodes: TOR harus menggunakan relay dari Perancis sebagai node masuknya.
- ExitNodes: TOR harus menggunakan relay dari Jepang sebagai exit node-nya.
- StrictNodes: Koneksi TOR harus mengikuti konfigurasi pengguna secara ketat.
- Otentikasi Cookie: Gunakan otentikasi cookie.
- MaxCircuitDirtiness: Segarkan IP setiap 60 detik.
- GeoIPFile: Gunakan file ipv4 geografis yang ditentukan. Dapat diunduh dari https://raw.githubusercontent.com/torproject/tor/main/src/config/geoip
# complete code found in create_intermediate_tor_proxy.py import io import os import stem.process import re import urllib.request SOCKS_PORT = 9050 TOR_PATH = os.path.normpath(os.getcwd()+"\\tor\\tor.exe") GEOIPFILE_PATH = os.path.normpath(os.getcwd()+"\\data\\tor\\geoip") try: urllib.request.urlretrieve('https://raw.githubusercontent.com/torproject/tor/main/src/config/geoip', GEOIPFILE_PATH) except: print ('[INFO] Unable to update geoip file. Using local copy.') tor_process = stem.process.launch_tor_with_config( config = { 'SocksPort' : str(SOCKS_PORT), 'EntryNodes' : '{FR}', 'ExitNodes' : '{JP}', 'StrictNodes' : '1', 'CookieAuthentication' : '1', 'MaxCircuitDirtiness' : '60', 'GeoIPFile' : 'https://raw.githubusercontent.com/torproject/tor/main/src/config/geoip', }, init_msg_handler = lambda line: print(line) if re.search('Bootstrapped', line) else False, tor_cmd = TOR_PATH )
Untuk memeriksa apakah penyiapan Anda berhasil, Anda dapat membuat permintaan GET ke http://ip-api.com/json/. Jika alamat IP berasal dari Jepang dan berubah setiap 60 detik, Anda telah berhasil mengkonfigurasi koneksi TOR Anda.
import requests import time from datetime import datetime PROXIES = { 'http': 'socks5://127.0.0.1:9050', 'https': 'socks5://127.0.0.1:9050' } for i in range(10): response = requests.get("http://ip-api.com/json/", proxies=PROXIES) result = json.loads(response.content) print('TOR IP [%s]: %s %s'%(datetime.now().strftime("%d-%m-%Y %H:%M:%S"), result["query"], result["country"])) time.sleep(60)
Pengaturan Lanjutan: Memilih relai yang andal untuk koneksi TOR Anda.
Pada latihan sebelumnya, TOR bertanggung jawab memilih relay untuk membuat koneksinya. Namun, mungkin ada kalanya Anda ingin memilih relai tertentu untuk meningkatkan anonimitas dan keamanan Anda melalui internet.
Berikut beberapa pertimbangan dalam memilih relay yang baik:
- Kecepatan dan keandalan jaringan
- Kredibilitas/reputasi penyedia
- Waktu aktif layanan
Untuk menemukan relai TOR yang bagus, kita dapat menggunakan https://metrics.torproject.org/rs.html
- Cari relai publik. Secara pribadi saya suka menggunakan relay yang dihosting oleh “Hetzner”, karena mereka adalah penyedia pusat data dengan latar belakang yang kredibel.
2. Salin sidik jari relai
3. Kode ini memungkinkan Anda untuk menggunakan relai yang dipilih sebagai simpul masuk Anda (relai pertama).
# complete code found in create_advanced_tor_proxy.py import io import os import stem.process from stem.control import Controller from stem import Signal import re import requests import json from datetime import datetime import time SOCKS_PORT = 9050 CONTROL_PORT = 9051 TOR_PATH = os.path.normpath(os.getcwd()+"\\tor\\tor.exe") tor_process = stem.process.launch_tor_with_config( config = { 'SocksPort' : str(SOCKS_PORT), 'ControlPort' : str(CONTROL_PORT), 'CookieAuthentication' : '1' , 'EntryNodes' : '9695DFC35FFEB861329B9F1AB04C46397020CE31', 'StrictNodes' : '1' }, init_msg_handler = lambda line: print(line) if re.search('Bootstrapped', line) else False, tor_cmd = TOR_PATH )
4. Untuk memeriksa apakah pengaturan Anda berhasil, Anda dapat membuat daftar sirkuit TOR Anda. Verifikasi bahwa node pertama Anda memiliki sidik jari yang sama dengan konfigurasi Anda.
from stem import CircStatus from stem.control import Controller with Controller.from_port(port = 9051) as controller: controller.authenticate() for circ in sorted(controller.get_circuits()): if circ.status == CircStatus.BUILT: print("Circuit %s (%s)" % (circ.id, circ.purpose)) for i, entry in enumerate(circ.path): div = '+' if (i == len(circ.path) - 1) else '|' fingerprint, nickname = entry desc = controller.get_network_status(fingerprint, None) address = desc.address if desc else 'unknown' print(" %s- %s (%s, %s)" % (div, fingerprint, nickname, address))
Jangan khawatir jika Anda melihat beberapa sirkuit, TOR secara otomatis membuat sirkuit tambahan sebagai cadangan.
Kata-kata terakhir
Saya harap Anda menikmati tutorial praktis ini sama seperti saya. Sangat menyenangkan meneliti TOR dan perpustakaan batang. Sebenarnya ada lebih banyak hal menarik yang bisa kita lakukan dengan TOR, saya akan menulisnya dalam beberapa minggu mendatang! Pantau terus :)