洋葱路由
前言
最近准备在服务器上跑爬虫,首先要解决的问题就是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 代理无法正常使用