centos 7 洋葱路由Tor 搭建探索

1,775 阅读4分钟

洋葱路由

前言

最近准备在服务器上跑爬虫,首先要解决的问题就是IP的问题。常见的解决IP的方式是购买代理池服务,但是对于个人来说不友好,费用烧不起。因此, tor 洋葱路由代理就在这时派上了用场。

正文

准备

  • 安装 tor

服务器上装的是Centos 7 系统,在这里就只记录Centos 7 的安装方式。其它系统的安装方式大同小异,具体可以google一下。

  • 首先 update 一下 yum 源,添加 tor 的 repo
sudo yum install epel-release sudo yum install tor
  • 安装完成以后,启动 tor 服务
sudo systemctl start tor # 启动 tor 服务 
sudo systemctl enable tor # 设置开机自启 
sudo systemctl status tor # 查看 tor 运行状态,显示为 active 表示启动成功,服务正在运行
  • 配置 tor 服务 这一步网上的教程里面一般讲的不是很详细,中间遇到的坑会比较多。
  • 先测试一下是否可以连接 tor 代理服务
sudo yum install nc echo -e 'AUTHENTICATE' | nc 127.0.0.1 9051

不出意外,输出应该是 Connection refused

这里使用的 netcat 用来测试 tor 代理端口的连接情况,具体关于 netcat 的介绍,可以 google 一下

要解决上面的问题,我们需要先配置一下 tor 服务的 ControlPort

echo "ControlPort 9051" >> /etc/tor/torrc 
# 这里的端口可以自定义,设置完成后记得打开防火墙打开该端口的监听

Tor 的配置文件目录为 etc/tor/torrc,可以使用 vim 在配置文件末尾添加或者只用命令写入文件末尾(vim 修改避免命令不熟悉出错)。重启 tor 服务

sudo systemctl restart tor

再用 netcat 测试一遍

echo -e "AUTHENTICATE" | nc 127.0.0.1 9051 
# 输出 515 Authentication failed: Wrong length on authentication cookie.

网上很多教程在设置完 ControlPort 这一步就停止了,其实这里还有一个坑,就是我们要设置一个 HashedControlPortPassword,即端口密码。这个密码是 tor 通过 hash 生成的密码。生成方式非常简单,使用 tor 来生成即可:

echo HashedControlPassword $(tor --hash-password "my password" | tail -n 1) >> /etc/tor/torrc 
# 使用 tor --hash-password + 你设置的密码生成 hash 密码,然后追加写入到配置文件的最后一行

这里建议命令使用不熟悉的还是用 vim 的方式手动写入,免得少打一个 “>” 符号,把文件覆盖掉了。

查看一下写入情况:

tail -n -2 /etc/tor/torrc 
# ControlPort 9051 
# HashedControlPassword 16:........ 
# 看到上面那两行,即表示写入成功,我们重启 tor 服务 systemctl restart tor

再次使用 netcat 测试一下:

echo -e 'AUTHENTICATE "my password"' | nc 127.0.0.1 9051 
# 250 OK

至此,配置已经大功告成。

  • 测试 tor 服务的使用

    • 测试一下服务器的公网IP和使用 tor 代理访问的 IP,看看 tor 服务是否生效
    curl http://icanhazip.com 
    # 你的公网 IP 
    torify curl http://icanhazip.com 
    # tor 代理访问的 IP
    
    • 切换 IP 测试:这里有两种方式,第一种是通过命令行进行切换:
    echo -e 'AUTHENTICATE "my password"\r\nsignal NEWNYM\r\nQUIT' | nc 127.0.0.1 9051 
    # 第一段 echo -e 'AUTHENTICATE "my password"' 为测试服务连通性 
    # signal NEWNYM 命令表示 切换IP 
    # QUIT 命令表示 断开连接
    
    • 再运行一次上面的命令看下IP有没有成功切换
    torify curl http://icanhazip.com 
    # 如无意外,这次输出的 IP 应该是成功切换后的 IP
    
    • 使用 python 脚本来进行切换
    pip3 install stem python3 
    # 运行 python shell,如未安装 python 请先安装 
    >>> from stem import Signal 
    >>> from stem.control import Controller 
    >>> with Controller.from_port(port=9051) as controller: 
            controller.authenticate() 
            controller.signal(Signal.NEWNYM) 
    >>>
    

通过 stem 库,可以使用 python 与 tor 服务进行交互,有关 stem 的使用,可以查看一下文档

至此, tor 代理配置全部完成。

搭配 privoxy食用

privoxy 是何方神圣,详情Google一下

  • 安装 privoxy
yum install privoxy
  • 配置 privoxy 服务并启动
echo "forward-socks5t / 127.0.0.1:9050 ." >> /etc/privoxy/config 
systemctl enable privoxy 
systemctl start privoxy 
systemctl status privoxy
  • 尝试通过 privoxy 使用 tor
torify curl http://icanhazip.com/ curl -x 127.0.0.1:8118 http://icanhazip.com/ 
# 不出意外的话,两个命令的输出应该一致,说明 privoxy 配置服务成功 
# privoxy 默认使用 8118 端口监听服务,使用前请先检查 8118 端口是否被其他服务占用
  • 用 python 测试一下搭配 privoxy 后的食用效果
import requests 
from stem import Signal 
from stem.control import Controller 

def switch_proxy(): 
    with Controller.from_port(port=9051) as controller: 
        controller.authenticate(password="my password") 
        controller.signal(Signal.NEWNYM) 
        
for i in range(10): 
    switch_proxy() 
    resp = requests.get('http://icanhazip.com/', proxies={'http': '127.0.0.1:8118'})
    resp.text.strip()
  • bonus:使用 toripchanger 切换代理
pip3 install toripchanger 
python3 
>>> from toripchanger import TorIpChanger 
>>> import os 
>>> """# 这里如果不想把密码写在代码里,可以在环境变量中配置 export tor_password="my password" tor_ip_changer=TorIpChanger(tor_password=os.getenv('tor_password'), tor_port=9051,local_http_proxy='127.0.0.1:8118'))""" 
>>> tor_ip_changer.get_current_ip() # 查看当前 IP 
>>> tor_ip_changer.get_new_ip() # 查看新切换的 IP
  • 指定特定的地区 IP

/etc/tor/torrc 文件中 添加以下语句

ExcludeNodes {cn},{hk},{mo},{kp},{ir},{sy},{pk},{cu},{vn} # 表示排除这些国家/地区的节点 
StrictNodes 1 # 表示强制执行

备注:关于 privoxy 中的 echo "forward-socks5t / 127.0.0.1:9050 ." >> /etc/privoxy/config,9051 端口是用于 tor 代理的 ControlPort,9050 端口为代理的 SocketPort 的默认值。 以上,请使用科学上网,否则 tor 代理无法正常使用