我们将所有操作系统流量打包在Tor中



文章中描述的所有内容都通过GitHub上的Toroxy工具实现
最近,在线匿名性已经引起了激烈的争论。 可以从不同级别收集有关从本地设备访问Internet资源的数据,以建立用户的“模型”,这以后可以对他使用(或可以对他使用),这不是秘密。 因此,不足为奇的是,越来越多的活动Internet用户对代理和匿名化机制的需求深信不疑。 在这方面,有越来越多的新VPN客户端,但是,如实践所示,并不是所有的VPN客户端都可以真正被信任:不是所有的东西都开箱即用,要么只有HTTP流量被匿名化,要么实现质量差强人意;或者开发人员通过合并有关其用户的数据来犯错。

在本文中,我们将尝试从许多软件组件中组装出自己的UI工具,这将使我们能够完全匿名化本地系统的流量,并防止在任何工作阶段“侦听”渠道上的泄漏。

我们的主要目标是利用现成的工具“构建”可靠的实用程序。 显然,在合理的时间内从头开始创建高质量工具的想法充满了错误,因此选择现成的组件,然后正确地连接它们会更快,更可靠!

工具应该能够做什么?

  1. 将目标系统的所有流量重定向到中间节点(最好是几个)以可靠地屏蔽源
  2. 跟踪可能的匿名违规,更正并使用UI通知进行报告

用于创建工具的选定组件:

  • r
  • iptables
  • python3
  • 系统的

通过将所有组件混合在称为“ Linux”的外壳中,我们绝对可以得到有价值的东西,这将有助于实现最终目标。

组件#1:Tor


围绕此组件,将构建其余的工具基础结构。 Tor提供了一种机制,该机制是任何VPN客户端的一部分—一种机制,用于通过匿名给外部观察者的中间节点包装流量(在此类节点3的标准配置中)。

默认情况下,安装后来自标准批处理存储库的Tor客户端开始侦听端口9050,该端口接受任何可以进行袜子的客户端。 问题是,除了我们系统中的袜子流量外,应用程序还会产生大量其他流量,这些流量无法使用此协议。 在这方面,首先,在本地系统内,您必须为任何新的网络连接切入Tor网络的窗口。 这很简单,只需在torrc配置中提高透明代理即可

/etc/tor/torrc ... TransPort 9040 #           python ControlPort 9051 ... 

应特别注意UDP流量。 事实是,洋葱路由原则基于“流”的概念,如您所知,该流仅存在于TCP中。 通过Tor发送UDP数据包,目标系统将无法接收响应,因为该响应数据包将找不到返回路径。 但是,尽管有这种特殊性,我们仍然有机会对DNS查询进行匿名化,众所周知,该DNS查询是通过UDP执行的,同时还包括.onion解析:

 /etc/tor/torrc ... AutomapHostsOnResolve 1 DNSPort 53 ... 

这样,就可以在环回中打开对Tor的访问。

组件2:Iptables


由于我们的任务是隐藏整个系统中外部观察者的真实流量来源,并且Tor中的窗口已经打开,因此仅保留将所有流量包装在此窗口中。 与Linux内核捆绑在一起的系统防火墙将帮助我们:

 #  tcp iptables -t nat -A OUTPUT -p tcp --syn -j REDIRECT --to-ports $TRANS_PORT #   udp (dns only) iptables -t nat -A OUTPUT -p udp --dport 53 -j REDIRECT --to-ports 53 iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #       iptables -A OUTPUT -j REJECT ip6tables -A OUTPUT -j REJECT 

在这一阶段,我们得到了一个可以有效掩盖所有传出流量的实用程序,但这只是工作的一半。

组件3:python +桌面环境用户界面


每次,从控制台进行手动配置(即使它将是bash脚本的启动)都会很累人,因此是时候开始编写一个小型实用程序了,该实用程序将在以下方面为我们提供帮助:

  1. 自动配置
  2. 随时在Tor中更改您的身份
  3. 监视iptables规则完整性,如果违反则重写
  4. 跟踪您当前的身份(IP)
  5. 带有图形通知的前两个段落的通知

如上所述,该实用程序将在第一次启动时自行下载所有必需的组件 ,并在随后的启动中将结合iptables配置Tor。

如果要更改外部IP地址,则将与Tor-9051服务端口交互,该端口在开始时就已打开以自动进行IP更改:

 with Controller.from_port(port = 9051) as controller: controller.authenticate() controller.signal(Signal.NEWNYM) 

通过定期读取iptables规则结构并检查其SHA256的总和,可以很平常地(在我们的膝盖上)实施完整性跟踪:

 def rulesOk(self): RULES_CHECKSUM_CMD = "{ iptables-save && ip6tables-save; } | sed s/\-\-uid\-owner\\\\s[0-9]\\\\+\\\\s//g | grep -viE '^#' | grep -viE '^\:' | sort | uniq | sha256sum | cut -d' ' -f 1" checkSum = getoutput(RULES_CHECKSUM_CMD).strip() alright = checkSum == Strings.RULES_CHECKSUM_CORRECT_HASH if not alright: rules = getoutput('iptables-save && ip6tables-save') self.lastSnapshotFileName = "/tmp/broken-rules-%s.log" % time.strftime("%d-%m-%Y_%I-%M-%S") open(self.lastSnapshotFileName, "w").write(rules) return False else: return True 

另外,如果与期望的校验和不一致,则可以将iptables规则转储保存在/tmp/broken-rules-%d-%m-%Y_%I-%M-%S.log以进行进一步处理。 如果事实证明
 rulesOk() == False 
这将启动iptables规则表的重写

通过不断访问提供IP客户端的某些外部资源(例如ident.me ,可以监视当前IP。

好吧,最后,我们将使用DE UI来报告规则或IP更改问题。 每个图形化环境在某种程度上都是唯一的,尤其是在使用守护进程中的UI时,但是在大多数Linux系统上,从Python调用的bash代码将成功显示通知:

 # root UI eval "export $(egrep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep -u $LOGNAME gnome-session)/environ)" export DISPLAY=:0 for USR in `ls /home && echo root` do # ubuntu gnome + root UI export XAUTHORITY=/home/$USR/.Xauthority notify-send -u {0} '{1}' '{2}' # ubuntu parallels for UID in `ls /run/user/` do su $USR -c "DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$UID/bus notify-send -u {0} '{1}' '{2}'" done done 

通过将所有这些结合到200行Python脚本中,我们可以实现目标。 例如,在这里,我们的身份已更新的通知看起来像什么:

图片

这是这样的通知,看起来就像违反了Iptables规则的完整性,表明包含该违规的转储转储:

图片

组件4:systemd


最后,我们绝对希望一次性进行设置,而不考虑将来的安全性,因此可以自动运行并提供服务。 Linux有几个标准的守护程序管理子系统:systemd,sysV,init。 在我们的案例中,由于其配置的灵活性,因此选择了systemd。

假设在上一步中编写的python脚本称为“ toroxy”,并且位于/usr/bin/ ,那么它的自动运行和随后的监视(具有一定的灵活性)可以控制守护程序,如下所示:

 [Unit] Description=Toroxy After=network.target StartLimitIntervalSec=0 [Service] Type=simple Restart=always RestartSec=1 User=root # service toroxy start ExecStart=/usr/bin/toroxy service # service toroxy stop ExecStop=/usr/bin/toroxy stop # service toroxy reload ExecReload=/usr/bin/toroxy switch [Install] #   init 3,       UI     Tor WantedBy=multi-user.target 

几乎所有准备就绪的“工业”操作。 我要添加到该工具中以提高可靠性的最后一点是使用iptables-persistent在系统启动时自动初始化iptables规则(如您所知,iptables规则在重启时会重置):

 iptables-save > /etc/iptables/rules.v4 ip6tables-save > /etc/iptables/rules.v6 netfilter-persistent start && netfilter-persistent save 

结论


因此,我们通过组合各种组件来组装自己的工具,该工具具有相当高的可靠性,能够为网络上的Linux用户提供连续的匿名性。 总之,应该说本文中描述的所有内容都是作为GitHub上可用的Toroxy工具实现的。

Source: https://habr.com/ru/post/zh-CN472606/


All Articles