การแนะนำ

ย้อนกลับไปในทศวรรษ 1990 อินเทอร์เน็ตเป็นสถานที่ที่ไม่ปลอดภัย ซึ่งการรับส่งข้อมูลเครือข่ายส่วนใหญ่ไม่มีการเข้ารหัสและติดตามได้ ซึ่งช่วยให้แฮกเกอร์ทำการโจมตีแบบแทรกกลางและรวบรวมข้อมูลส่วนบุคคลได้อย่างง่ายดาย เพื่อแก้ไขปัญหานี้ กลุ่มนักวิจัยจากห้องปฏิบัติการวิจัยกองทัพเรือสหรัฐฯ ได้เริ่มโครงการ The Onion Routing (TOR) ด้วยความตั้งใจที่จะปกปิดตัวตนและรักษาความปลอดภัยการสื่อสารบนอินเทอร์เน็ต

ระเบียบวิธี

TOR อาศัยโมเดลความน่าเชื่อถือแบบกระจายเพื่อรักษาความปลอดภัยการรับส่งข้อมูลเครือข่ายของคุณผ่านทางอินเทอร์เน็ต เป็นวิธีการที่ข้อมูลของคุณได้รับการเข้ารหัสโดยหลายฝ่ายเพื่อให้การปกป้องข้อมูลแบบหลายชั้น (เช่น Onion) ดังนั้นข้อมูลของคุณจะปลอดภัย เว้นแต่จะมีใครสามารถแย่งชิงทุกฝ่ายที่เกี่ยวข้องกับการเข้ารหัสได้

ในทางปฏิบัติ TOR จะเลือกรีเลย์ที่ไม่ซ้ำกัน 3 ตัวที่ดำเนินการโดยหน่วยงานที่แตกต่างกันเพื่อเข้ารหัสและกำหนดเส้นทางการรับส่งข้อมูลเครือข่ายของคุณก่อนที่จะไปถึงจุดหมายปลายทางสุดท้าย

ต่อไปนี้เป็นแผนภาพง่ายๆ เพื่อแสดงวิธีการ

หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ TOR Velentin Quelquejay มีบทความดีๆ เกี่ยวกับเรื่องนี้

สำหรับบทความนี้ ฉันจะมุ่งเน้นไปที่การใช้งานจริงของการกำหนดค่าพร็อกซี TOR ด้วย Python เนื่องจากฉันรู้สึกว่ายังขาดสื่อออนไลน์และการอภิปรายในด้านนี้

เพื่อช่วยให้คุณเรียนรู้ได้อย่างมีประสิทธิภาพมากขึ้น ฉันจึงได้แบ่งบทช่วยสอนนี้ออกเป็น 3 ระดับความยาก ซึ่งครอบคลุมฟีเจอร์ที่มีประโยชน์ของ TOR ซึ่งช่วยให้คุณควบคุมศักยภาพของมันได้อย่างเต็มที่

ข้อกำหนดเบื้องต้น

ก่อนที่จะดำเนินการต่อบทช่วยสอนนี้ ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้งสิ่งต่อไปนี้แล้ว

  1. หลาม3
  2. ก้านติดตั้ง Pip
  3. Git โคลน https://github.com/ohyicong/Tor

การตั้งค่าพื้นฐาน: การกำหนดค่าเริ่มต้น

นี่คือโค้ดที่ง่ายและมีประสิทธิภาพในการสร้างพร็อกซีเซิร์ฟเวอร์ TOR โดยใช้การกำหนดค่าเริ่มต้น:

  1. สร้างพร็อกซีบนพอร์ตท้องถิ่น 9050
  2. สร้างการเชื่อมต่อ TOR บนรีเลย์ที่ไม่ซ้ำกัน 3 ตัว (สุ่ม)
  3. เปลี่ยนที่อยู่ IP ทุก 10 นาที
# 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
)

หากต้องการตรวจสอบว่าการตั้งค่าของคุณสำเร็จหรือไม่ คุณสามารถส่งคำขอ GET ไปที่ http://ip-api.com/json/ หากที่อยู่ IP มาจากประเทศอื่น แสดงว่าคุณตั้งค่าพร็อกซี TOR แรกสำเร็จแล้ว!

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"]))

อย่าลืมหยุดพร็อกซีของคุณก่อนเริ่มแบบฝึกหัดถัดไป นี่คือคำสั่งให้หยุดมัน

tor_process.kill()

การตั้งค่าระดับกลาง: เลือกรีเลย์จากประเทศที่ระบุ

อาจมีบางกรณีที่คุณต้องการการควบคุมการเชื่อมต่อ TOR มากขึ้น ต่อไปนี้คือสาเหตุที่เป็นไปได้บางประการ:

  1. หลีกเลี่ยงการถ่ายทอดจากบางประเทศเนื่องจากความปลอดภัยทางไซเบอร์/กฎหมาย/เหตุผลทางการเมือง
  2. การเปลี่ยนอัตราการรีเฟรชที่อยู่ TOR IP
  3. ใช้วิธีการรับรองความถูกต้องอื่นสำหรับการเชื่อมต่อ TOR

รหัสด้านล่างสร้างพร็อกซีเซิร์ฟเวอร์ TOR บนพอร์ตภายในเครื่อง 9050 โดยมีการกำหนดค่าต่อไปนี้:

  1. EntryNodes: TOR จะใช้รีเลย์จากฝรั่งเศสเป็นโหนดรายการ
  2. ExitNodes: TOR จะใช้รีเลย์จากญี่ปุ่นเป็นโหนดทางออก
  3. StrictNodes: การเชื่อมต่อ TOR จะต้องเป็นไปตามการกำหนดค่าผู้ใช้อย่างเคร่งครัด
  4. การตรวจสอบสิทธิ์คุกกี้: ใช้การตรวจสอบสิทธิ์คุกกี้
  5. MaxCircuitDirtiness: รีเฟรช IP ทุกๆ 60 วินาที
  6. GeoIPFile: ใช้ไฟล์ ipv4 ทางภูมิศาสตร์ที่ระบุ สามารถดาวน์โหลดได้จาก 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
)

หากต้องการตรวจสอบว่าการตั้งค่าของคุณสำเร็จหรือไม่ คุณสามารถส่งคำขอ GET ไปที่ http://ip-api.com/json/ หากที่อยู่ IP มาจากญี่ปุ่นและเปลี่ยนแปลงทุกๆ 60 วินาที แสดงว่าคุณกำหนดค่าการเชื่อมต่อ TOR สำเร็จแล้ว

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)

การตั้งค่าขั้นสูง: การเลือกรีเลย์ที่เชื่อถือได้สำหรับการเชื่อมต่อ TOR ของคุณ

ในแบบฝึกหัดก่อนหน้านี้ TOR มีหน้าที่เลือกรีเลย์สำหรับสร้างการเชื่อมต่อ อย่างไรก็ตาม อาจมีกรณีที่คุณต้องการเลือกรีเลย์เฉพาะเพื่อเพิ่มความเป็นส่วนตัวและความปลอดภัยทางอินเทอร์เน็ต

ข้อควรพิจารณาในการเลือกรีเลย์ที่ดีมีดังนี้

  1. ความเร็วเครือข่ายและความน่าเชื่อถือ
  2. ความน่าเชื่อถือ/ชื่อเสียงของผู้ให้บริการ
  3. เวลาให้บริการ

หากต้องการค้นหารีเลย์ TOR ที่ดี เราสามารถใช้ https://metrics.torproject.org/rs.html

  1. ค้นหารีเลย์สาธารณะ โดยส่วนตัวแล้วฉันชอบใช้รีเลย์ที่โฮสต์โดย “Hetzner” เนื่องจากพวกเขาเป็นผู้ให้บริการศูนย์ข้อมูลที่มีพื้นฐานที่น่าเชื่อถือ

2. คัดลอกลายนิ้วมือของรีเลย์

3. รหัสนี้จะอนุญาตให้คุณใช้รีเลย์ที่เลือกเป็นโหนดรายการของคุณ (รีเลย์ที่ 1)

# 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. หากต้องการตรวจสอบว่าการตั้งค่าของคุณสำเร็จหรือไม่ คุณสามารถแสดงรายการวงจร TOR ของคุณได้ ตรวจสอบว่าโหนดที่ 1 ของคุณมีลายนิ้วมือเดียวกันกับการกำหนดค่าของคุณ

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))

ไม่ต้องกังวลหากคุณเห็นวงจรบางส่วน TOR จะสร้างวงจรเพิ่มเติมโดยอัตโนมัติเพื่อสำรอง

คำพูดสุดท้าย

ฉันหวังว่าคุณจะเพลิดเพลินกับบทช่วยสอนที่ใช้งานได้จริงนี้มากเท่ากับฉัน การค้นคว้าเกี่ยวกับ TOR และไลบรารีต้นกำเนิดเป็นเรื่องสนุก จริงๆ แล้วยังมีสิ่งที่น่าสนใจอีกมากมายที่เราสามารถทำได้ด้วย TOR ฉันจะเขียนมันในอีกไม่กี่สัปดาห์ข้างหน้า! คอยติดตาม :)