洋葱网络 Tor


1. 简介

洋葱网络是一种匿名通信技术,保护消息发送者和接受者的隐私,隐藏数据报文通过网络时所经过的路线。经过多层加密的通信数据在由若干个被称为洋葱路由器组成的通信通道上传输,每个洋葱路由器去掉一个加密层,以得到下一条路由信息,然后将数据发往下一个洋葱路由器,不断重复,直到数据到达目的地。该机制可以防止参与数据传输的路由节点获知消息发送者/接受者信息或者窃取数据包正文。

Tor 是一个占主导地位的对洋葱网络的实现,官网 https://www.torproject.org/。

2. 部署

可以通过 Ubuntu 软件包管理器直接下载安装,命令为 sudo apt-get install tor

Tor 配置文件路径为 /etc/tor/torrc,主要配置内容如下:

  • ControlPort 控制程序访问的端口

  • SocksPort (Default: 9050) 应用程序连接端口

  • NewCircuitPeriod NUM (Default: 30 seconds) 尝试新建链路的时间间隔

  • MaxCircuitDirtiness NUM (Default: 10 minutes) 链路有效时间,超出视为链路老化

  • KeepalivePeriod NUM (Default: 5 minutes) 连接维护时间间隔,保证有效连接的存在和无效连接的删除

配置示例如下:

ControlPort 9051
NewCircuitPeriod 10
MaxCircuitDirtiness 10
KeepalivePeriod 1

运行命令 sudo /etc/init.d/tor restart 启动洋葱网络。

3. 测试代码

import os
import requests
import requesocks
import itertools
import time

url = 'http://api.ipify.org?format=json'

def getip_requests(url):
    print "(+) Sending request with plain requests..."
    r = requests.get(url)
    print "(+) IP is: " + r.text.replace("\n", "")

def getip_requesocks(url):
    print "(+) Sending request with requesocks..."
    session = requesocks.session()
    session.proxies = {'http': 'socks5://127.0.0.1:9050', 'https': 'socks5://127.0.0.1:9050'}
    r = session.get(url)
    print "(+) IP is: " + r.text.replace("\n", "")

def main():
    print "Running tests..."
    getip_requests(url)
    getip_requesocks(url)
    for i in itertools.count(1):
        getip_requesocks(url)
        time.sleep(10)

if __name__ == "__main__":
    main()