出乎意料的冒險

出乎意料的冒險

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 的路由表(一般來說,該編號不依賴任何東西,我們只是想要to)並添加一條規則,根據該規則,此表中包含的所有資料包都會飛向 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:這並不是呼籲抵制資本家、節省比賽費用或完全狡猾,而只是表明研究和開發的可能性,一般來說,你不會想到它們。

來源: www.habr.com

添加評論