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.

  1. Python3
  2. Batang pemasangan pip
  3. 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:

  1. Buat proxy pada port lokal 9050
  2. Buat koneksi TOR melalui 3 relay unik (acak)
  3. 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:

  1. Menghindari relay dari negara tertentu karena alasan keamanan siber/hukum/politik.
  2. Mengubah kecepatan refresh alamat IP TOR.
  3. Menggunakan metode otentikasi berbeda untuk koneksi TOR

Kode di bawah ini membuat server proxy TOR pada port lokal 9050 dengan konfigurasi berikut:

  1. EntryNodes: TOR harus menggunakan relay dari Perancis sebagai node masuknya.
  2. ExitNodes: TOR harus menggunakan relay dari Jepang sebagai exit node-nya.
  3. StrictNodes: Koneksi TOR harus mengikuti konfigurasi pengguna secara ketat.
  4. Otentikasi Cookie: Gunakan otentikasi cookie.
  5. MaxCircuitDirtiness: Segarkan IP setiap 60 detik.
  6. 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:

  1. Kecepatan dan keandalan jaringan
  2. Kredibilitas/reputasi penyedia
  3. Waktu aktif layanan

Untuk menemukan relai TOR yang bagus, kita dapat menggunakan https://metrics.torproject.org/rs.html

  1. 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 :)