出乎意料的冒险

出乎意料的冒险

Spotify 如何帮助您研究守护进程、RFC、网络并推广开源。 或者,如果您无法付款,但您确实想要一些优质商品,会发生什么情况。

开始

第三天,人们注意到 Spotify 正在根据 IP 地址的国家/地区显示广告。 另据指出,在一些国家,广告根本不进口。 例如,在白俄罗斯共和国。 然后,一个“绝妙”的计划被制定出来,禁止非高级账户中的广告。

关于 Spotify 的一些知识

一般来说,Spotify 有一个奇怪的政策。 为了购买高级服务,我们的兄弟必须变得非常扭曲:将他的个人资料中的位置更改为海外,寻找一张合适的礼品卡,只能通过 PayPal 支付,PayPal 最近表现得很奇怪,想要一堆文件。 总的来说,这也是一次冒险,但顺序不同。 虽然,大多数人这样做是为了移动版本,但我对此不感兴趣。 因此,以下所有内容仅适用于桌面版本。 而且,不会有功能的扩展。 只是剪掉一些多余的。

为什么这么复杂?

当我在 Spotify 配置中注册袜子代理数据时,我也是这么认为的。 问题是,使用登录名和密码进行的袜子身份验证不起作用。 另外,开发人员经常围绕代理做一些事情:要么允许它,然后禁止它,或者破坏它,这会引起场外的大量讨论。

我们决定不再依赖不稳定的函数,而是寻找更可靠、更有趣的东西。

在这里,读者一定会问:为什么不采取 ssh 有钥匙 -D 就这样结束了吗? 而且,总的来说,他是对的。 但是,首先,这仍然需要妖魔化并与 autossh 交朋友,以免出现连接中断的情况。 其次:它太简单而且无聊。

为了

像往常一样,让我们​​从左到右、从上到下描述实现“简单”想法所需的一切。

首先你需要一个代理

并且同时有多种选择:

  • 您可以从开放的代理列表中获取。 便宜(或者更确切地说是免费),但绝对不可靠,并且此类代理的生命周期趋于零。 因此,有必要为代理列表找到/编写一个解析器,按所需的类型和国家/地区对其进行过滤,并且在 Spotify 中替换找到的代理的问题仍然悬而未决(好吧,也许通过 HTTP_PROXY 传输并为二进制文件创建自定义包装器,以便所有其他流量不会发送到那里)。
  • 您可以购买类似的代理并避免上述大多数问题。 但以代理的价格,你可以立即在 Spotify 上购买溢价,这对于最初的任务来说是不切实际的。
  • 举起你的。 正如您可能猜到的,这是我们的选择。

纯属偶然,您可能有一个朋友的服务器位于白俄罗斯共和国或其他小国家。 您需要使用它并在其上推出所需的代理。 特别的鉴赏家可以满足于有一个路由器的朋友 DD-WRT 或类似的软件。 但有 他的 美好的世界 而这个世界显然不符合这个故事的框架。

所以,我们的选择: Squid - 不鼓舞人心,而且我不需要 HTTP 代理,周围已经有太多这种协议了。 在袜子领域,除了 还没发货。 因此,我们就接受吧。

不要等待 Dante 的安装和配置手册。 他 只是谷歌搜索 并且不是特别感兴趣。 在最低配置中,您需要投入各种 client pass, socks pass,正确注册接口并且不要忘记添加 socksmethod: username。 在这种形式中,为了进行身份验证,将从系统用户处获取徽标密码。 还有关于安全的部分:禁止访问本地主机、限制用户等等——这纯粹是个人问题,取决于个人偏执。

部署面向网络的代理

该剧分两幕。

第一幕

我们已经整理好了代理,现在我们需要从全球网络访问它。 如果您在所需国家/地区有一台具有白色 IP 的机器,那么您可以安全地跳过这一点。 我们没有(如上所述,我们住在朋友家里),而且最近的白色 IP 在德国的某个地方,所以我们将研究网络。

所以,是的,细心的读者会再次问:为什么不采用现有的服务,例如 恩格罗克 或类似的? 他会再次正确。 但这是一项服务,它再次需要被妖魔化,它也可能要花钱,而且总的来说它不是体育运动。 因此,我们将用废料制造自行车。

任务:在 NAT 后面很远的地方有一个代理,您需要将其挂在具有白色 IP 且位于世界边缘的 VPS 的端口之一上。

逻辑上假设这可以通过端口转发来解决(通过上述方法实现) ssh),或者通过 VPN 将硬件组合到虚拟网络中。 和 ssh 我们知道如何工作, autossh 拿起来很无聊,所以就拿 OpenVPN 来说吧。

数字海洋有 精彩的手册 在这个问题上。 我没有什么可补充的。 由此产生的配置可以很容易地与 OpenVPN 客户端连接, systemd。 只需将其(配置)放入 /etc/openvpn/client/ 并且不要忘记将扩展名更改为 .conf。 之后,拉取服务 [email protected]别忘了为她做 enable 并庆幸一切都飞走了。

当然,我们需要禁用到新创建的 VPN 的任何流量重定向,因为我们不想通过半个球传递流量来降低客户端计算机的速度。

是的,我们需要在 VPN 服务器上为我们的客户端注册一个静态 IP 地址。 故事稍后会需要用到这一点。 为此,您需要启用 ifconfig-pool-persist, 编辑 ipp.txt,包含在 OpenVPN 中并启用 client-config-dir,并通过添加来编辑所需客户端的配置 ifconfig-push 具有正确的掩码和所需的 IP 地址。

第二幕

现在我们在“网络”上有一台机器,面向互联网,可以用于自私的目的。 即通过它重定向部分流量。

因此,一项新任务:您需要关闭到达具有白色 IP 的 VPS 端口之一的流量,以便该流量进入新连接的虚拟网络,并且响应可以从那里返回。

解决方案:当然可以 iptables! 还要什么时候才能有这么好的机会和他一起练习呢?

所需的配置很快就找到了,在三个小时内,一百个脏话和一些浪费的精力,因为调试网络是一个非常具体的过程。

首先,您需要在内核中启用流量重定向。 这个东西叫做 ipv4.ip_forward 根据操作系统和网络管理器的不同,启用方式略有不同。

其次,您需要在 VPS 上选择一个端口,并将所有进入该端口的流量封装到虚拟子网中。 例如,可以这样完成:

iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 8080 -j DNAT --to-destination 10.8.0.2:8080

在这里,我们将来自外部接口端口 8080 的所有 TCP 流量重定向到 IP 10.8.0.2 和相同端口 8080 的计算机。

对于那些想要了解工作中肮脏细节的人 netfilter, iptables 和一般的路由,绝对有必要考虑 или .

所以,现在我们的数据包飞到虚拟子网并且......它们留在那里。 更准确地说,来自袜子代理的响应通过 Dante 计算机上的默认网关飞回,接收者将其丢弃,因为在网络中,通常不向一个 IP 发送请求并接收来自另一个 IP 的响应。 因此,我们还需要不断地去想象。

因此,现在您需要将所有数据包从代理重定向回虚拟子网,并发送至具有白色 IP 的 VPS。 这里的情况有点糟糕,因为它只是 iptables 我们还不够,因为如果我们在路由之前更正目标地址(PREROUTING),那么我们的包裹就不会飞到互联网上,如果我们不修复它,包裹就会去 default gateway。 因此,您需要执行以下操作:记住链条 mangle,为了通过标记数据包 iptables 并将它们包装在自定义路由表中,该路由表会将它们发送到它们应该去的地方。

说到做到:

iptables -t mangle -A OUTPUT -p tcp --sport 8080 -j MARK --set-mark 0x80
ip rule add fwmark 0x80 table 80
ip route add default via 10.8.0.1 dev tun0 table 80

我们获取传出流量,标记从代理所在端口(在我们的例子中为 8080)发出的所有流量,将所有标记的流量重定向到编号为 80 的路由表(一般来说,该编号不依赖于任何东西,我们只是想要就是这样)并添加一条规则,根据该规则,此表中包含的所有数据包都会飞向 VPN 子网。

伟大的! 现在数据包飞回 VPS...并在那里消失。 因为VPS不知道如何处理它们。 因此,如果您不介意的话,您可以简单地将来自虚拟子网的所有流量重定向回 Internet:

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j SNAT --to-source 172.42.1.10

在这里,从 10.8.0.0 子网到达、掩码为 255.255.255.000 的所有内容都被封装在源 NAT 中,并飞向默认接口,该接口将转至 Internet。 需要注意的是,只有当我们透明转发端口时,这个东西才会起作用,也就是说,VPS上的传入端口与我们代理的端口相匹配。 不然你就要多受一点苦。

现在某个地方一切都应该开始工作了。 还剩下一点:不要忘记确保所有配置 iptables и route 重启后没有继续。 为了 iptables 有一些特殊文件,例如 /etc/iptables/rules.v4(对于 Ubuntu 来说),但是对于路由来说,一切都有点复杂。 我把他们推入 up/down OpenVPN 脚本,尽管我认为它们本来可以做得更好。

将来自应用程序的流量封装在代理中

因此,我们有一个在所需国家/地区进行身份验证的代理,可以通过静态白色 IP 地址进行访问。 剩下的就是使用它并重定向来自 Spotify 的流量。 但有一个细微差别,如上所述,Spotify 中代理的登录密码不起作用,因此我们将寻找如何绕过它。

首先,让我们记住 代言人。 很棒的东西,但它的价格和一艘星际飞船一样贵(40 美元)。 有了这笔钱,我们可以再次购买溢价并完成它。 因此,我们将在Mac上寻找更多免费和开放的类似物(是的,我们想在Mac上听音乐)。 让我们发现一个完整的工具: 普罗西马克。 我们会很乐意去戳他。

但这种快乐是短暂的,因为事实证明,你需要在 MacOS 中启用调试模式和自定义内核扩展,提交一个简单的配置,并了解该工具与 Spotify 存在完全相同的问题:它无法使用袜子代理上的登录密码。

在这附近的某个地方,是时候惊慌失措地购买溢价了……但是不行! 让我们尝试要求修复它,它是开源的! 让我们做 。 作为回应,我们得到了一个令人心碎的故事,讲述唯一的维护者如何不再拥有 MacBook,见鬼去吧,没有修复。

我们又会心烦意乱。 但随后我们会记住我们的青春和C,打开Dante的调试模式,挖掘数百KB的日志,转到 RFC1927 有关 SOCKS5 协议的信息,让我们查看 Xcode 并查找问题。 只需纠正客户端提供的用于身份验证的方法代码列表中的一个字符,一切就开始正常工作。 我们很高兴,我们收集了发布二进制文件,我们做到了 拉取请求 我们走进夕阳,前往下一个地点。

自动化

一旦 Proximac 发挥作用,它就需要被妖魔化并被遗忘。 在 MacOS 中可以找到一整套适合于此的初始化系统,即 发射.

我们很快就找到了 手动的 我们知道这根本不是 systemd 这里几乎是一个勺子 xml。 没有适合您的花哨配置,没有类似的命令 status, restart, daemon-reload。 只有硬核类型 start-stop, list-grep, unload-load 还有更多的怪事。 克服我们写的这一切 plist, 加载中。 不起作用。 我们研究调试恶魔的方法,调试它,了解里面有什么 ENV 甚至 PATH 我们没有提供正常的,我们争辩说,我们把它带进来(添加 /sbin и /usr/local/bin)最后我们对自动启动和稳定运行感到满意。

呼气

结果如何? 一周的冒险,一个跪着的动物园,其服务是贴心的,并且做了它所要求的事情。 对可疑的技术领域有一点了解,一点开源知识,并且因为“我做到了!”的想法而脸上露出微笑。

PS:这并不是呼吁抵制资本家、节省比赛费用或完全狡猾,而只是表明研究和开发的可能性,一般来说,你不会想到它们。

来源: habr.com

添加评论