การแนะนำ
ย้อนกลับไปในทศวรรษ 1990 อินเทอร์เน็ตเป็นสถานที่ที่ไม่ปลอดภัย ซึ่งการรับส่งข้อมูลเครือข่ายส่วนใหญ่ไม่มีการเข้ารหัสและติดตามได้ ซึ่งช่วยให้แฮกเกอร์ทำการโจมตีแบบแทรกกลางและรวบรวมข้อมูลส่วนบุคคลได้อย่างง่ายดาย เพื่อแก้ไขปัญหานี้ กลุ่มนักวิจัยจากห้องปฏิบัติการวิจัยกองทัพเรือสหรัฐฯ ได้เริ่มโครงการ The Onion Routing (TOR) ด้วยความตั้งใจที่จะปกปิดตัวตนและรักษาความปลอดภัยการสื่อสารบนอินเทอร์เน็ต
ระเบียบวิธี
TOR อาศัยโมเดลความน่าเชื่อถือแบบกระจายเพื่อรักษาความปลอดภัยการรับส่งข้อมูลเครือข่ายของคุณผ่านทางอินเทอร์เน็ต เป็นวิธีการที่ข้อมูลของคุณได้รับการเข้ารหัสโดยหลายฝ่ายเพื่อให้การปกป้องข้อมูลแบบหลายชั้น (เช่น Onion) ดังนั้นข้อมูลของคุณจะปลอดภัย เว้นแต่จะมีใครสามารถแย่งชิงทุกฝ่ายที่เกี่ยวข้องกับการเข้ารหัสได้
ในทางปฏิบัติ TOR จะเลือกรีเลย์ที่ไม่ซ้ำกัน 3 ตัวที่ดำเนินการโดยหน่วยงานที่แตกต่างกันเพื่อเข้ารหัสและกำหนดเส้นทางการรับส่งข้อมูลเครือข่ายของคุณก่อนที่จะไปถึงจุดหมายปลายทางสุดท้าย
ต่อไปนี้เป็นแผนภาพง่ายๆ เพื่อแสดงวิธีการ
หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ TOR Velentin Quelquejay มีบทความดีๆ เกี่ยวกับเรื่องนี้
สำหรับบทความนี้ ฉันจะมุ่งเน้นไปที่การใช้งานจริงของการกำหนดค่าพร็อกซี TOR ด้วย Python เนื่องจากฉันรู้สึกว่ายังขาดสื่อออนไลน์และการอภิปรายในด้านนี้
เพื่อช่วยให้คุณเรียนรู้ได้อย่างมีประสิทธิภาพมากขึ้น ฉันจึงได้แบ่งบทช่วยสอนนี้ออกเป็น 3 ระดับความยาก ซึ่งครอบคลุมฟีเจอร์ที่มีประโยชน์ของ TOR ซึ่งช่วยให้คุณควบคุมศักยภาพของมันได้อย่างเต็มที่
ข้อกำหนดเบื้องต้น
ก่อนที่จะดำเนินการต่อบทช่วยสอนนี้ ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้งสิ่งต่อไปนี้แล้ว
- หลาม3
- ก้านติดตั้ง Pip
- Git โคลน https://github.com/ohyicong/Tor
การตั้งค่าพื้นฐาน: การกำหนดค่าเริ่มต้น
นี่คือโค้ดที่ง่ายและมีประสิทธิภาพในการสร้างพร็อกซีเซิร์ฟเวอร์ TOR โดยใช้การกำหนดค่าเริ่มต้น:
- สร้างพร็อกซีบนพอร์ตท้องถิ่น 9050
- สร้างการเชื่อมต่อ TOR บนรีเลย์ที่ไม่ซ้ำกัน 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 มากขึ้น ต่อไปนี้คือสาเหตุที่เป็นไปได้บางประการ:
- หลีกเลี่ยงการถ่ายทอดจากบางประเทศเนื่องจากความปลอดภัยทางไซเบอร์/กฎหมาย/เหตุผลทางการเมือง
- การเปลี่ยนอัตราการรีเฟรชที่อยู่ TOR IP
- ใช้วิธีการรับรองความถูกต้องอื่นสำหรับการเชื่อมต่อ TOR
รหัสด้านล่างสร้างพร็อกซีเซิร์ฟเวอร์ TOR บนพอร์ตภายในเครื่อง 9050 โดยมีการกำหนดค่าต่อไปนี้:
- EntryNodes: TOR จะใช้รีเลย์จากฝรั่งเศสเป็นโหนดรายการ
- ExitNodes: TOR จะใช้รีเลย์จากญี่ปุ่นเป็นโหนดทางออก
- StrictNodes: การเชื่อมต่อ TOR จะต้องเป็นไปตามการกำหนดค่าผู้ใช้อย่างเคร่งครัด
- การตรวจสอบสิทธิ์คุกกี้: ใช้การตรวจสอบสิทธิ์คุกกี้
- MaxCircuitDirtiness: รีเฟรช IP ทุกๆ 60 วินาที
- 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 มีหน้าที่เลือกรีเลย์สำหรับสร้างการเชื่อมต่อ อย่างไรก็ตาม อาจมีกรณีที่คุณต้องการเลือกรีเลย์เฉพาะเพื่อเพิ่มความเป็นส่วนตัวและความปลอดภัยทางอินเทอร์เน็ต
ข้อควรพิจารณาในการเลือกรีเลย์ที่ดีมีดังนี้
- ความเร็วเครือข่ายและความน่าเชื่อถือ
- ความน่าเชื่อถือ/ชื่อเสียงของผู้ให้บริการ
- เวลาให้บริการ
หากต้องการค้นหารีเลย์ TOR ที่ดี เราสามารถใช้ https://metrics.torproject.org/rs.html
- ค้นหารีเลย์สาธารณะ โดยส่วนตัวแล้วฉันชอบใช้รีเลย์ที่โฮสต์โดย “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 ฉันจะเขียนมันในอีกไม่กี่สัปดาห์ข้างหน้า! คอยติดตาม :)