Avanture iz vedra neba

Avanture iz vedra neba

Kako vam Spotify može pomoći da proučavate demone, RFC-ove, mreže i promovirate open source. Ili šta se dešava ako ne možete da platite, ali zaista želite neke vrhunske dobrote.

Начало

Trećeg dana je uočeno da Spotify prikazuje reklame na osnovu zemlje IP adrese. Također je primjećeno da u nekim zemljama oglašavanje uopće nije uvezeno. Na primjer, u Republici Bjelorusiji. A onda je skovan "briljantan" plan da se onemogući oglašavanje na ne-premium računu.

Malo o Spotifyju

Uopšteno govoreći, Spotify ima čudnu politiku. Naš brat se mora prilično izokrenuti da bi kupio premium: promijeni lokaciju na svom profilu u inozemstvo, potraži odgovarajuću poklon karticu koja se može platiti samo PayPal-om, koji se u posljednje vrijeme ponaša čudno i traži gomilu dokumenata. Generalno, i to je 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. Štaviše, neće biti proširenja funkcija. Samo odrežem neke od dodatnih.

Zašto je to tako komplikovano?

I ja sam tako mislio kada sam registrirao socks-proxy podatke u Spotify konfiguraciji. Ispostavilo se da je problem u tome što autentifikacija u čarapama koristeći login i lozinku ne radi. Osim toga, programeri redovno rade nešto oko proxyja: ili ga dozvoljavaju, a zatim ga zabranjuju ili ga razbijaju, što dovodi do čitavih panela diskusija na off-site-u.

Odlučeno je da se ne oslanjaju na nestabilne funkcije i da se pronađe nešto pouzdanije i zanimljivije.

Negdje ovdje čitatelj mora pitati: zašto ne uzeti ssh sa ključem -D i to je kraj? I generalno će biti u pravu. Ali, prvo, ovo još uvijek treba demonizirati i sprijateljiti se sa autossh-om, 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 implementaciju naše “jednostavne” ideje.

Prvo vam treba proxy

I postoji mnogo alternativa odjednom:

  • možete jednostavno otići i uzeti sa otvorenih proxy lista. Jeftino (ili bolje rečeno uzalud), ali apsolutno nepouzdano i vijek trajanja takvih proksija teži nuli. Stoga bi bilo potrebno pronaći/napisati parser za proxy liste, filtrirati ih po željenom tipu i zemlji, a pitanje zamjene pronađenog proxyja u Spotifyju ostaje otvoreno (pa, možda preko HTTP_PROXY prenesite i kreirajte prilagođeni omot za binarni fajl tako da se sav drugi promet ne šalje tamo).
  • Možete kupiti sličan proxy i spasiti se većine gore opisanih problema. Ali po cijeni proxyja, možete odmah kupiti premium na Spotifyju, a to nije praktično za originalni zadatak.
  • Podigni svoje. Kao što ste verovatno pretpostavili, ovo je naš izbor.

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

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

Nemojte čekati Danteov priručnik o instalaciji i konfiguraciji. On samo guglam i nije od posebnog interesa. U minimalnoj konfiguraciji morate ubaciti sve vrste client pass, socks pass, ispravno registrirajte interfejse i ne zaboravite dodati socksmethod: username. U ovom obliku, za autentifikaciju, logopass će biti preuzet od korisnika sistema. A dio o sigurnosti: zabrana pristupa lokalnom hostu, ograničavanje korisnika itd. - ovo je čisto individualno, ovisno o ličnoj paranoji.

Postavite proxy okrenut prema mreži

Predstava je u dva čina.

Prvi čin

Sredili smo proxy, sada mu trebamo pristupiti sa globalne mreže. Ako imate mašinu sa bijelim IP-om u željenoj zemlji, onda možete sigurno preskočiti ovu tačku. Nemamo ga (mi smo, kao što je gore pomenuto, hostovani kod prijatelja), a najbliži bijeli IP je negdje u Njemačkoj, pa ćemo proučavati mreže.

Dakle, da, pažljivi čitalac će se ponovo zapitati: zašto ne uzmete lajk za postojeću uslugu ngrok ili slično? I opet će biti u pravu. Ali ovo je servis, opet ga treba demonizirati, može i koštati i generalno nije sportski. Stoga ćemo izraditi bicikle od otpadnog materijala.

Zadatak: postoji proxy negdje daleko iza NAT-a, potrebno ga je 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 bilo prosljeđivanjem portova (koje se implementira kroz gore navedene ssh), ili kombinovanjem hardvera u virtuelnu mrežu putem VPN-a. WITH ssh znamo kako da radimo, autossh Dosadno je uzimati, pa uzmimo OpenVPN.

DigitalOcean ima divan manul po ovom pitanju. Nemam šta da dodam. I rezultirajuća konfiguracija može se prilično lako povezati s OpenVPN klijentom i systemd. Samo ga ubacite (konfiguraciju). /etc/openvpn/client/ i ne zaboravite promijeniti ekstenziju na .conf. Nakon toga povucite servis openvpn-client@openvpn-client-config-name.servicene zaboravi to učiniti za nju enable i raduj se što je sve odletjelo.

Naravno, moramo onemogućiti svako preusmjeravanje prometa na novokreirani VPN, jer ne želimo smanjiti brzinu na klijentskoj mašini propuštanjem prometa kroz pola lopte.

I da, moramo registrirati statičku IP adresu na VPN serveru za našeg klijenta. Ovo će biti potrebno malo kasnije u priči. Da biste to uradili, morate omogućiti ifconfig-pool-persist, uredi ipp.txt, uključen u OpenVPN i omogući client-config-dir, plus uredite konfiguraciju željenog klijenta dodavanjem ifconfig-push sa ispravnom maskom i željenom IP adresom.

Drugi čin

Sada imamo mašinu na “mreži” koja je okrenuta ka Internetu i može se koristiti u sebične svrhe. Naime, preko njega preusmjeriti dio prometa.

Dakle, novi zadatak: potrebno je da isključite promet koji dolazi na jedan od VPS portova sa bijelim IP-om kako bi taj promet išao na novospojenu virtuelnu mrežu i odatle se mogao vratiti odgovor.

Rješenje: naravno iptables! Kada ćete još imati tako divnu priliku da vježbate s njim?

Potrebna konfiguracija se može pronaći prilično brzo, za tri sata, stotinu psovki i pregršt potrošene živce, jer je otklanjanje grešaka u mrežama vrlo specifična procedura.

Prvo, morate omogućiti preusmjeravanje prometa u kernelu. Ova stvar se zove ipv4.ip_forward i omogućen je malo drugačije u zavisnosti od OS-a i upravitelja mreže.

Drugo, morate odabrati port na VPS-u i sav promet koji ide na njega umotati u virtuelnu podmrežu. To se može uraditi, 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 eksternog interfejsa na mašinu sa IP 10.8.0.2 i istim portom 8080.

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

Dakle, sada naši paketi lete do virtuelne podmreže i... ostaju tamo. Tačnije, odgovor sa socks proxy-a leti nazad kroz podrazumevani gateway na mašini sa Danteom i primalac ga ispušta, jer u mrežama nije uobičajeno da se pošalje zahtev na jednu IP adresu, a dobije odgovor od druge. Stoga, moramo nastaviti sa dočaravanjem.

Dakle, sada trebate preusmjeriti sve pakete sa proxyja nazad u virtuelnu podmrežu prema VPS-u sa bijelim IP-om. Ovdje je situacija malo gora, jer je tako iptables nećemo imati dovoljno, jer ako ispravimo odredišnu adresu prije rutiranja (PREROUTING), tada naš paket neće letjeti na internet, a ako ga ne popravimo, paket će otići na default gateway. Dakle, trebate učiniti sljedeće: zapamtite lanac mangle, kako bi se paketi označili iptables i umotajte ih u prilagođenu tabelu usmjeravanja koja će ih poslati tamo gdje trebaju ići.

Ne pre rečeno nego urađeno:

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 saobraćaj, označavamo sve što leti sa porta na kojem se nalazi proxy (8080 u našem slučaju), preusmjeravamo sav označeni promet na tabelu rutiranja sa 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.

Odlično! Sada paketi lete nazad prema VPS-u... i tamo umiru. Jer VPS ne zna šta da radi sa njima. Stoga, ako se ne trudite, možete jednostavno preusmjeriti sav promet koji stiže iz virtualne podmreže nazad 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 sa maskom 255.255.255.000 umotava u source-NAT i leti do defaultnog interfejsa, koji je okrenut na Internet. Važno je napomenuti da će ova stvar funkcionirati samo ako transparentno proslijeđujemo port, odnosno dolazni port na VPS-u odgovara portu našeg proxyja. U suprotnom ćete morati još malo patiti.

Negdje sada sve treba da proradi. I samo malo ostaje: ne zaboravite provjeriti da li su sve konfiguracije iptables и route nije nastavio nakon ponovnog pokretanja. Za iptables postoje posebni fajlovi poput /etc/iptables/rules.v4(u slučaju Ubuntua), ali za rute je sve malo komplikovanije. Gurnuo sam ih unutra up/down OpenVPN skripte, mada mislim da su mogle biti i pristojnije urađene.

Zamotajte promet iz aplikacije u proxy

Dakle, imamo proxy sa autentifikacijom u željenoj zemlji, dostupan preko statičke bijele IP adrese. Ostaje samo da ga koristite i tamo preusmjerite promet sa Spotifyja. Ali postoji nijansa, kao što je gore spomenuto, lozinka za prijavu za proxy u Spotifyju ne radi, pa ćemo potražiti kako da je zaobiđemo.

Za početak, prisjetimo se o proxy. Odlična stvar, ali košta koliko i zvjezdani brod (40 dolara). Sa ovim novcem ponovo možemo kupiti premium i završiti s tim. Stoga ćemo tražiti više besplatnih i otvorenih analoga na Mac-u (da, želimo da slušamo muziku na Mac-u). Otkrijmo jedan cijeli alat: proximac. I mi ćemo ga rado bocnuti.

Ali radost će biti kratkog vijeka, jer se ispostavilo da morate omogućiti način za otklanjanje grešaka i prilagođene ekstenzije kernela u MacOS-u, datoteku jednostavne konfiguracije i shvatiti da ovaj alat ima potpuno isti problem kao Spotify: ne može proći autentifikaciju pomoću login-password na socks-proxy.

Negdje ovdje je vrijeme da se izbezumite i kupite premium... ali ne! Pokušajmo tražiti da se to popravi, to je open source! Hajdemo ulaznica. A kao odgovor dobijamo srceparajuću priču o tome kako jedini održavalac više nema MacBook i dovraga s njim, ne popravku.

Opet ćemo biti uznemireni. Ali onda ćemo se prisjetiti naše mladosti i C, uključiti mod za otklanjanje grešaka u Danteu, kopati po stotinama kilobajta dnevnika, otići na RFC1927 za informacije o SOCKS5 protokolu, pogledajmo Xcode i pronađemo problem. Dovoljno je ispraviti jedan znak u listi metodskih kodova koje klijent nudi za autentifikaciju i sve počinje da radi kao sat. Radujemo se, prikupljamo binarno izdanje, to radimo pull request i idemo u zalazak sunca i idemo na sledeću tačku.

Automatiziraj

Kada Proximac proradi, treba ga demonizirati i zaboraviti. Postoji jedan cijeli sistem inicijalizacije koji je pogodan za ovo, a koji se nalazi u MacOS-u, naime launchd.

Brzo ga nađemo priručnik a mi razumemo da to uopšte nije systemd a ovdje je to skoro mjerilo i xml. Nema fensi konfiguracija za vas, nema komandi poput status, restart, daemon-reload. Samo hardkor start-stop, list-grep, unload-load i još mnogo neobičnosti. Prevazilazeći sve ovo pišemo plist, učitavanje. Ne radi. Proučavamo metodu otklanjanja grešaka demona, otklanjamo greške, razumijemo šta je tu ENV даже PATH nismo isporučili normalnu, svađamo se, donosimo (dodajemo /sbin и /usr/local/bin) i konačno smo zadovoljni autostartom i stabilnim radom.

Izdahni

šta je rezultat? Sedmica avanture, klečeći zoološki vrt od servisa koji je srcu drag i radi ono što se od njega traži. Malo znanja u sumnjivim tehničkim oblastima, malo otvorenog koda 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, generalno, ne očekujete.

izvor: www.habr.com

Dodajte komentar