Tor环境搭建&tor链路IP限定配置
Tor隐匿环境搭建
Author:HJY
[参考链接]
背景信息
- tor的配置文件的路径 /etc/tor
- tor服务的端口为9050,若使用Tor浏览器其配置端口为9150
- tor本质是一个socks代理,而非HTTP代理,代码上需注意,可以使用Polipo实现HTTP代理转Socks代理
环境描述
- 基于ubuntu-1604,命令运行正常
- 网络链路:
- 本机公网IP -> Tor代理 -> 目标网络
- 本机公网IP -> 代理 -> Tor代理 -> 目标网络
注:在中国使用Tor服务,叠加一层前置代理会比较好。而Tor浏览器则是选择获取官方提供的网桥的方式。因此本教程是基于链路2的网络拓扑进行搭建。
安装Tor
- note: 需在超级权限下进行安装
- note: 建议使用代理网络进行安装操作,否则访问源失败
对于Debian系统,安装只需apt install tor
即可,Ubuntu本身的默认源里也存在tor,但比较过时,如果你不在意,那你只需apt-get install tor
即可跳过下面的安装步骤.
Do not use the packages in Ubuntu’s universe. In the past they have not reliably been update.That means you could be missing stability and security fixes
># apt install apt-transport-https
根据当前系统版本添加tor包源,参照官网安装指引,以ubuntu16为例
查看系统版本的命令
> head -n 1 /etc/issue
># vim /etc/apt/sources.list
#添加下面的语句于该文件
deb https://deb.torproject.org/torproject.org xenial main
deb-src https://deb.torproject.org/torproject.org xenial main
添加gpg key(add the gpg key used to sign the packages)
># curl https://deb.torproject.org/torproject.org/A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89.asc | gpg --import
># gpg --export A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89 | apt-key add -
若报错,采用下面的方案进行
1. 下载该文件`A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89.asc`
2. apt-key add A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89.asc
进行安装
># apt update
># apt install tor deb.torproject.org-keyring
=———————————————————————————————-
基本命令
启动服务
> service tor start
检查服务状态
> service tor status
基本配置
vim /etc/tor/torrc
SocksPort 9050 #本机连接
SocksPort 192.168.1.223:9100 #暴露给局域网其他机器连接
Socks5Proxy 127.0.0.1:10809 #配置前置socks5代理
OutboundBindAddress 192.168.1.223 #对于多网卡设备,指定接口IP给其所在的局域网使用(未验证,可以不添加)
# NewCircuitPeriod 3600 #Tor每隔NUM秒尝试新建链路,默认30秒,为避免IP变换频繁导致账号被封,这里设为1小时,但这种策略对于tor是建议的--无效
ExitNodes {us} #未添加strict模式,尽可能以美国作为出口节点
ExcludeExitNodes {cn} #未添加strict模式,尽可能排除中国作为出口节点
语句 | 功能说明 |
---|---|
Socks5Proxy host[:port] | 配置前置代理 |
SocksPort | 配置监听端口 |
NewCircuitPeriod | 配置线路变更时间 |
ExcludeExitNodes | 出口节点排除 |
ExitNodes | 出口节点范围选择 |
StrictNodes | 强制执行节点设置,不管是否能连成功 |
=———————————————————————————————-
测试方式
查看本机的网络服务状态,9050为tor监听端口
> netstat -lnt
验证ip,原本上网ip
> curl ipinfo.io #不使用tor
> torsocks curl ipinfo.io #使用tor
python脚本测试
import requests
proxies = {
'http':"socks5//127.0.0.1:9050",
'https':'socks5://127.0.0.1:9050'
}
url = 'http://httpbin.org/get'
res = requests.get(url,proxies=proxies)
if res.status_code == 200:
print(res.text)
else:
print('failed')
局域网内其它PC_浏览器测试
- 连接其代理地址:192.168.1.223
- 勾选使用socks代理时的DNS查询
- 访问IP查询网站whoer
关于Tor
如何维持一个固定的出口IP?
理论上,使用Tor访问每个域名,获得该域名独属的线路,一个线路默认维持10分钟
思路一:基于tor ExitNodes参数
可以发现我们出口IP可以在上面的网站中提供的IP找到,那么如果强制指派该节点,是否就固定了IP.
国内博文或者是大多数国外的论坛几乎不提及ExitNodes的这个用法,大多以限定出口节点的区域的形式,即
ExitNodes {us}
但我注意到关于文档的说明提到:
A list of identify fingerprints,country codes,and
address patterns
of nodes to use as exit node–that is,
a node that delivers traffic for you outside the Tor network.
我们忽略了IP address这种使用模式!
评注:这方面的资料基本没有,毕竟这种实现本身已经违背了Tor的设计初衷。那么Tor浏览器登录检测IP变化的这一类网站是怎么避免不被强制logout甚至封号的呢?关于这一点,reddit上有这样一则信息configure_tor_to_change_ip_every_minute,其原文如下:
Originally Tor would rotate circuits every ten minutes. The Tor Browser now operates differently and changes circuits every two hours, but also uses a unique circuit for every site. One reason for this is because some sites don’t respond well to a user’s IP changing in the middle of a single session. With circuit isolation, there’s not much security benefit to rotating more quickly. In fact it can introduce additional risks, since by rotating quickly you’re more likely to land on a malicious relay. Plus if your short-lived circuit behavior is detected, that might in itself be identifying (not deanonymizing, but still a risk).
其提到最初Tor是每十分钟改变一次链路,而Tor浏览器如今虽然仍对每一个网站使用不同的链路,但是每一个网站本身则每两个小时更换一次链路。做出这样的改变的原因之一是出于考虑到某些站点对于用户客户端与站点的单一会话过程中更换IP这一情况不能正常响应,正常比如强制登出。
强制指派并使用单一出口节点,以IP的方式
ExitNodes 199.249.230.78
当然,这种方法也有不妥的时候:
-
并不是每一个circuit(理解为中继节点服务器)都用于向Tor网络之外传送网络流量。如果你强制指定的这个出口节点不支持访问80端口或443端口, 那你便不能访问网页。规避这个问题的策略也很简单,一个是你预先采用不强制情况下访问网页得到的IP作为出口节点,另外一种则是使用下面提供的网址进行查询该节点服务器是否支持访问目标网站的目标端口。
-
如果这个节点服务器不能使用时,需要我们变更IP,这一点如果有必要,我们可以用脚本进行实现,大致的思路是以即时或预先的方式获取备用的IP,检测到服务不能正常访问时,终止tor服务,并修改配置文件,再重启服务。
-
如果这个出口节点被监听,那么我们的做法就相当于把所有的鸡蛋都放在同一篮子里。
思路二:基于tor的链路更新参数
这种方案,说实话收效甚微。