Avanture iz vedra neba

Avanture iz vedra neba

Kako vam Spotify može pomoći u proučavanju demona, RFC-ova, mreža i promoviranju otvorenog koda. Ili što se događa ako ne možete platiti, ali stvarno želite vrhunske stvari.

početak

Trećeg dana primijećeno je da Spotify prikazuje reklame na temelju zemlje IP adrese. Također je primijećeno da u nekim zemljama oglašavanje uopće nije uvezeno. Na primjer, u Republici Bjelorusiji. A onda je skovan "briljantan" plan za onemogućavanje oglašavanja na nepremium računu.

Malo o Spotifyju

Općenito govoreći, Spotify ima čudnu politiku. Naš brat se mora dobro zeznuti da bi kupio premium: promijeniti mjesto u profilu u inozemstvo, potražiti odgovarajuću poklon karticu koja se može platiti samo PayPalom, koji se zadnje vrijeme čudno ponaša i traži hrpu dokumenata. Općenito, to je također avantura, ali drugačijeg reda. Iako većina ljudi to radi zbog mobilne verzije, mene to ne zanima. Stoga će sve ispod pomoći samo u slučaju desktop verzije. Štoviše, neće biti proširenja funkcija. Samo odsiječem neke od dodatnih.

Zašto je tako komplicirano?

I ja sam tako mislio kad sam registrirao socks-proxy podatke u Spotify konfiguraciji. Ispostavilo se da je problem u tome što provjera autentičnosti u Socksu pomoću prijave i lozinke ne radi. Osim toga, programeri redovito rade nešto oko proxyja: ponekad ga dopuštaju, ponekad zabranjuju, ponekad ga krše, što dovodi do čitavih panela rasprava izvan stranice.

Odlučeno je ne oslanjati se na nestabilne funkcije i pronaći nešto pouzdanije i zanimljivije.

Negdje se ovdje čitatelj mora zapitati: zašto ne uzeti ssh s ključem -D i to je kraj? I, općenito, bit će u pravu. Ali, prvo, ovo još uvijek treba demonizirati i sprijateljiti se s autosshom, kako ne bi razmišljali o pokidanim vezama. I drugo: previše je jednostavno i dosadno.

U redu

Kao i obično, idemo s lijeva na desno, odozgo prema dolje i opišemo sve što nam je potrebno za provedbu naše “jednostavne” ideje.

Prvo vam je potreban proxy

I postoji mnogo alternativa odjednom:

  • možete samo otići i uzeti s otvorenih proxy popisa. Jeftino (ili bolje rečeno za ništa), ali apsolutno nepouzdano i životni vijek takvih proxyja teži nuli. Stoga bi bilo potrebno pronaći/napisati parser za proxy liste, filtrirati ih po željenoj vrsti i zemlji, a ostaje otvoreno pitanje zamjene pronađenog proxyja u Spotify (dobro, možda kroz HTTP_PROXY prijenos i stvaranje prilagođenog omotača za binarnu datoteku tako da se sav ostali promet ne šalje tamo).
  • Možete kupiti sličan proxy i spasiti se od većine gore opisanih problema. Ali po cijeni proxyja, možete odmah kupiti premium na Spotifyju, a to nije praktično za izvorni zadatak.
  • Podigni svoje. Kao što ste vjerojatno pogodili, ovo je naš izbor.

Čisto slučajno se može ispostaviti da imate prijatelja sa serverom u Republici Bjelorusiji ili nekoj drugoj maloj zemlji. Morate ovo upotrijebiti i na njemu postaviti željeni proxy. Posebni znalci mogu se zadovoljiti s prijateljem s uključenim ruterom DD-WRT ili sličan softver. Ali tamo njegov predivan svijet a taj svijet očito ne staje u okvire ove priče.

Dakle, naše opcije: Squid - nije inspirativno i ne želim HTTP proxy, već ima previše ovog protokola. A u području ČARAPA nema ništa razumno osim Dante još nisu isporučeni. Stoga, uzmimo.

Ne čekajte Danteov priručnik za instalaciju i konfiguraciju. On samo guglam i nije od posebnog interesa. U minimalnoj konfiguraciji morate ubaciti sve vrste client pass, socks pass, ispravno registrirajte sučelja i ne zaboravite dodati socksmethod: username. U ovom obliku, za provjeru autentičnosti, logopass će se uzeti od korisnika sustava. A dio o sigurnosti: zabrana pristupa localhostu, ograničavanje korisnika itd. - to je čisto individualno, ovisno o osobnoj paranoji.

Postavite proxy prema mreži

Predstava je u dva čina.

Čin prvi

Sredili smo proxy, sada mu moramo pristupiti s globalne mreže. Ako imate stroj s bijelim IP-om u željenoj zemlji, tada možete sigurno preskočiti ovu točku. Mi ga nemamo (mi smo, kao što je gore spomenuto, smješteni kod prijatelja), a najbliži bijeli IP je negdje u Njemačkoj, pa ćemo proučiti mreže.

Pa da, pažljivi čitatelj opet će se zapitati: zašto ne uzmete postojeću uslugu poput ngrok ili slično? I opet će biti u pravu. Ali ovo je usluga, opet je treba demonizirati, može i koštati i općenito nije sportska. Stoga ćemo izraditi bicikle od otpadnog materijala.

Zadatak: postoji proxy negdje daleko iza NAT-a, trebate ga objesiti na jedan od portova VPS-a koji ima bijeli IP i nalazi se na rubu svijeta.

Logično je pretpostaviti da se to može riješiti ili prosljeđivanjem porta (koje se provodi kroz gore spomenuti ssh), ili kombiniranjem hardvera u virtualnu mrežu putem VPN-a. S ssh znamo raditi, autossh Dosadno je uzeti, pa uzmimo OpenVPN.

DigitalOcean ima divan manul po ovom pitanju. Nemam mu što dodati. A rezultirajuća konfiguracija može se vrlo lako povezati s OpenVPN klijentom i systemd. Samo ga stavite (config). /etc/openvpn/client/ i ne zaboravite promijeniti ekstenziju u .conf. Nakon toga povucite uslugu [email protected]ne zaboravi to učiniti za nju enable i raduj se što je sve odletjelo.

Naravno, trebamo onemogućiti svako preusmjeravanje prometa na novostvoreni VPN, jer ne želimo smanjiti brzinu na klijentskom stroju propuštanjem prometa kroz pola lopte.

I da, moramo registrirati statičku IP adresu na VPN poslužitelju za našeg klijenta. Ovo će biti potrebno malo kasnije u priči. Da biste to učinili, morate omogućiti ifconfig-pool-persist, Uredi ipp.txt, uključeno uz OpenVPN i omogućiti client-config-dir, te urediti konfiguraciju željenog klijenta dodavanjem ifconfig-push s ispravnom maskom i željenom IP adresom.

Čin drugi

Sada imamo stroj na "mreži" koji je okrenut prema Internetu i može se koristiti u sebične svrhe. Naime, kroz njega preusmjeriti dio prometa.

Dakle, novi zadatak: morate isključiti promet koji dolazi na jedan od VPS portova s ​​bijelim IP-om tako da taj promet ide na novopovezanu virtualnu mrežu i da se odgovor može vratiti od tamo.

Rješenje: naravno iptables! Kad ćeš inače imati tako divnu priliku vježbati s njim?

Potrebna konfiguracija može se pronaći dosta brzo, za tri sata, stotinjak psovki i pregršt potrošenih živaca, jer debugovanje mreža vrlo je specifičan postupak.

Prvo morate omogućiti preusmjeravanje prometa u kernelu. Ova stvar se zove ipv4.ip_forward i omogućen je malo drugačije ovisno o OS-u i mrežnom upravitelju.

Drugo, trebate odabrati priključak na VPS-u i omotati sav promet koji ide prema njemu u virtualnu podmrežu. To se može učiniti, na primjer, ovako:

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

Ovdje preusmjeravamo sav TCP promet koji dolazi na port 8080 vanjskog sučelja na stroj s IP 10.8.0.2 i istim portom 8080.

Za one koji žele prljave detalje posla netfilter, iptables i usmjeravanje općenito, apsolutno je potrebno razmotriti ovo ili ovo.

Dakle, sada naši paketi lete u virtualnu podmrežu i... tamo ostaju. Točnije, odgovor od socks proxyja leti natrag kroz default gateway na stroju s Danteom i primatelj ga ispušta, jer u mrežama nije uobičajeno slati zahtjev na jednu IP adresu, a primati odgovor s druge. Stoga, trebamo nastaviti dočaravati.

Dakle, sada trebate preusmjeriti sve pakete s proxyja natrag u virtualnu podmrežu prema VPS-u s bijelim IP-om. Ovdje je situacija malo gora, jer je jednostavno iptables nećemo imati dovoljno, jer ako ispravimo odredišnu adresu prije usmjeravanja (PREROUTING), tada naš paket neće letjeti na Internet, a ako to ne popravimo, paket će otići na default gateway. Dakle, trebate učiniti sljedeće: zapamtite lanac mangle, kako bi označili pakete kroz iptables i zamotajte ih u prilagođenu tablicu usmjeravanja koja će ih poslati kamo trebaju ići.

Rečeno, učinjeno:

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

Uzimamo odlazni promet, označavamo sve što leti iz porta na kojem se nalazi proxy (8080 u našem slučaju), preusmjeravamo sav označeni promet u tablicu usmjeravanja s brojem 80 (općenito, broj ne ovisi ni o čemu, samo smo htjeli do) i dodajte jedno pravilo, prema kojem svi paketi uključeni u ovu tablicu lete u VPN podmrežu.

Sjajno! Sada paketi lete natrag prema VPS-u... i tamo umiru. Jer VPS ne zna što bi s njima. Stoga, ako se ne trudite, možete jednostavno preusmjeriti sav promet koji stiže iz virtualne podmreže natrag na Internet:

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

Ovdje se sve što stigne iz podmreže 10.8.0.0 s maskom 255.255.255.000 zamota u izvorni-NAT i leti na zadano sučelje koje je okrenuto prema Internetu. Važno je napomenuti da će ova stvar raditi samo ako port prosljeđujemo transparentno, odnosno da dolazni port na VPS-u odgovara portu našeg proxyja. Inače ćete morati trpjeti još malo.

Negdje bi sada sve trebalo početi funkcionirati. I još samo malo: ne zaboravite provjeriti jesu li sve konfiguracije iptables и route nije nastavio nakon ponovnog pokretanja. Za iptables postoje posebne datoteke poput /etc/iptables/rules.v4(u slučaju Ubuntua), ali za rute je sve malo kompliciranije. Gurnuo sam ih unutra up/down OpenVPN skripte, iako mislim da su mogle biti bolje napravljene.

Zamotajte promet iz aplikacije u proxy

Dakle, imamo proxy s autentifikacijom u željenoj zemlji, dostupan preko statične bijele IP adrese. Preostaje ga samo iskoristiti i tamo preusmjeriti promet sa Spotifyja. Ali postoji nijansa, kao što je gore spomenuto, lozinka za prijavu na proxy u Spotifyju ne radi, pa ćemo tražiti kako to zaobići.

Za početak, prisjetimo se o opunomoćenik. Super stvar, ali košta kao zvjezdani brod (40$). S ovim novcem opet možemo kupiti premium i završiti s tim. Stoga ćemo potražiti više besplatnih i otvorenih analoga na Macu (da, želimo slušati glazbu na Macu). Otkrijmo cijeli jedan alat: proksimak. I rado ćemo ga otići bocnuti.

Ali radost će biti kratkog vijeka, jer se ispostavilo da morate omogućiti debug mod i prilagođena proširenja jezgre u MacOS-u, arhivirati jednostavnu konfiguraciju i shvatiti da ovaj alat ima potpuno isti problem kao Spotify: ne može proći autentifikaciju pomoću prijava-lozinka na socks-proxyju.

Negdje ovdje došlo je vrijeme da poludite i kupite premium... ali ne! Pokušajmo tražiti da se to popravi, to je open source! Učinimo ulaznica. A kao odgovor dobivamo srceparajuću priču o tome kako jedini održavatelj više nema MacBook i kvragu s njim, a ne popravak.

Opet ćemo se uzrujati. Ali onda ćemo se sjetiti svoje mladosti i C-a, uključiti debug mod u Danteu, kopati po stotinama kilobajta zapisa, otići na RFC1927 za informacije o SOCKS5 protokolu, pogledajmo Xcode i pronađimo problem. Dovoljno je ispraviti jedan znak u popisu kodova metoda koje klijent nudi za autentifikaciju i sve počinje raditi kao podmazano. Radujemo se, prikupljamo binarne datoteke izdanja, jesmo zahtjev za povlačenjem i idemo u zalazak sunca i idemo do sljedeće točke.

Automatizirajte to

Nakon što Proximac proradi, treba ga demonizirati i zaboraviti. Postoji jedan cijeli sustav inicijalizacije koji je prikladan za to, a nalazi se u MacOS-u, naime lansirand.

Brzo ga nalazimo priručnik a mi razumijemo da to uopće nije systemd a ovdje je skoro lopatica i xml. Nema otmjenih konfiguracija za vas, nema sličnih naredbi status, restart, daemon-reload. Samo hardcore vrsta start-stop, list-grep, unload-load i mnoge druge neobičnosti. Prevladavajući sve ovo pišemo plist, Učitavam. Ne radi. Proučavamo metodu otklanjanja pogrešaka demona, otklanjamo pogreške, razumijemo što je tamo ENV čak PATH nismo isporučili normalnu, svađamo se, donosimo (dodaje /sbin и /usr/local/bin) i konačno smo zadovoljni autostartom i stabilnim radom.

Izdahnite

Kakav je rezultat? Tjedan avanture, klečeći zoološki vrt od usluga koje su srcu drage i rade ono što se od njih traži. Malo znanja iz sumnjivih tehničkih područja, malo open sourcea i osmijeh na licu od pomisli "Uspio sam!"

PS: ovo nije poziv na bojkot kapitalista, na štednju na šibicama ili na totalno lukavstvo, već samo naznaka mogućnosti istraživanja i razvoja tamo gdje ih, uglavnom, ne očekujete.

Izvor: www.habr.com

Dodajte komentar