Tag Archives: computers

ipv6 & ipsec & bugs

Mai anul trecut la inceput de vara ma jucam io in niste masini virtuale cu Layer2 peste Layer3 in Linux. Anul asta am gasit un client unde sa bag jucaria in productie sa vad ca toate treburile merg cum trebuie si pe bune :)

Eh, pentru ca atunci cand ai optiuni multe iti vin idei, am zis ce-ar fi daca intre 2 gateway-uri de VPN as face io conexiunea pe IPV6 in loc de IPv4, ca e bine sa fim pregatiti de viitor :))

Am pus io doua CentOS 7, configurat interfete & shit, am pus libreswan, am facut un tunel IPSec si am dat ping6 intre cele doua masini si a mers jucaria (tcpdump zicea ca vede ESP pe fir).

Ca oricem om prevazator, zic sa dau reboot ca poate am uitat sa configurez ceva sa porneasc la boot si daca ramai fara curent sau s-o panica kernelul de singuratate, sa mearga treaba cand dai restart de la buton.

Si dau io restart si evident ca pula tunel. ipsec status zicea ca e in CONNECTING, da nici in loguri si nici pe fir nu vedeam vreun pachet plecat la alalalt gateway. Ce-are, ce-are. Dat restart la libreswan, o lua. Am zis ca poate e vreo problema cu libreswan, ca mai dadusem de una draguta un pic inainte.

Aia draguta era misto, ca fix imediat dupa boot nu voia sa ridice tunelul de nici un fel. ipsec auto –up $nume_conexiune zicea ca nici una din cheile RSA nu e buna de folosit pentru autentificare, insa fara a modifica nimic, dupa un libreswan restart brusc deveneau bune cheile.

De draci ajunsesem la o varianta taraneasca, dupa pornirea sistemului sa-si dau un start/stop manual s-o ia.

Hai ca zic merge tunelul, sa fac niste teste de trafic cu ping6 sa vad daca MTU-ul e cum trebuie, dau io ping6 -s 1500 si timeout. Pe la vreo 1300 bytes si ceva payload mergea. Pun de mana MTU-ul la 9000 (ca interfete gigabit) si dau iar ping6, si iar timeout. Mai dau si un restart lu’ libreswan (ca vorba aia: when in doubt, restart) ca poate fiind pornit se uita o data la MTU si dupa aia o tine cumva cont de el. tcpdump zicea ca pachetele pleaca da nu ajung.

Uite asa m-am trezit io in zona crepusculara, unde lucrurile in teorie trebuiau sa mearga iar in practica erau diferite de teorie. Si e frustrant ca zici ca, mortii ma-sii, e un VPN, mai mult de cateva ore n-are ce sa ia, ca doar ma dau cu IPsec pe Linux de cand eram mic si stiam ce fac.

Dupa o zi de injuraturi, am oprit IPSec, si zic hai ca in clar tre sa mearga cacatul si o iau dupa aia pe dos sa vad unde se strica. Intre astea doua masini aveam un switch ca sa simulez realitatea. Si zic sa pun un cablu direct intre ele sa elimin orice element in plus care ar putea sa induca erori.

Evident, cu cablu direct mergea treaba de n’avea aer. Acuma switch-ul avea porturi gigabit si cablurile erau bagate in el in porturile alea. Si totusi ce n’avea switch-ul pe porturile gigabit? Jumbo frames in pizda ma-sii. Jumbo frames n-avea. Ca HP in vasta sa inteligenta s-a gandit ca probabil nu sunt bune si n-a implementat suport pentru ele in switch. Si uite asa ai conexiune la gigabit da cu frame-uri de maxim 1504 bytes, sa incapa si un VLAN tag acolo da nimic in plus.

Dupa dracii cu HP, m-am intors la problema initiala, de ce ma-sa dupa reboot n-o ia tunelul. S-a facut tarziu si m-am dus sa dorm.

Evident ca n-am dormit ca ma rodea problema, mi-am facut repede un laborator cu doua CentOS 7 si zic sa incerc strongswan in loc de libreswan, ca poate o avea ala suport mai bun pentru ce fac. Suport in a vorbi cu framework-ul de XFRM din kernel unde se intampla magia.

Fac repede o configuratie si dau reboot la un nod, si dupa reboot pula tunel. Dupa niste tcpdump ma loveste problema: Cand un neighbor IPv6 vrea sa afle ce adresa MAC are alt neighbor, trimite pe multicast FF02::1 un mesaj de Neighbor Solicitation (echivalent de mesajul trimis pe broadcast in IPV4 pentru a afla MAC-ul unui computer din reteaua locala) si primeste unicast un raspuns.

Ce se intampla in kernel in combinatie cu IPSec-ul: pachetele de solicitation plecau cum trebuie si ajungeau la alalalt nod, ala raspundea unicast si nodul care a trimis solicitarea le ignora pentru ca… tananana… se astepta sa fie criptate conform configuratiei (SA-urile erau facute intre 2 /128).

Acu la 2 noaptea stiam care e problema, sa o si rezolv:

conn ipv6nd
   auto=route
   keyexchange=ikev2
   authby=never
   type=passthrough
   leftsubnet=2001:abc:def:ffff::2/128[ipv6-icmp/136]

Unde leftsubnet reprezinta IP-ul aluilalt gateway, iar pe ala se face pe dos configuratia. Et voila, merg chestiile dupa configuratia asta.

Ce inseamna ce-am facut mai sus? Inseamna ca sistemul va accepta pachete ICMPv6 Neighbor Advertisement necriptate. E important ca regula asta sa fie scrisa prima in config ca sa aiba precedenta fata de urmatoarele. E ca la firewall, de sus in jos :)

Asa, acu c-am rezolvat-o, am trecut la pasul urmator. Tipul conexiunii era de tip transport, ca aveam treaba sa protejeze doar traficul intre cele 2 gateway-uri.

Peste am facut un tunel L2TPv3 si cateva sesiuni sa car niste VLAN-uri dintr-o parte in alta. Pe fiecare cap aveam o interfata fizica cu tag-uri de VLAN, una de pseudowire, ambele bagate intr-un bridge.

Pe o interfata de bridge am pus o adresa IPv4, la fel si pe alalalt gateway si minune… mergea ping-ul intre ele. Scopul declarat fiind sa le folosesc pe post de adrese de management pe un VLAN de management.

Cu experimentul pe IPv4 reusit, am pus un set de adrese IPv6 pe interfetele de bridge asteptand acelasi rezultat. Si-am asteptat, si-am asteptat… cum asteapta un caine parasit stapanii care nu se mai intorc.

Pentru ca IPv6 e special, cand ai o adresa pusa pe interfata de bridge, neighbor solicitation nu se duce doar pe interfetele de compun bridge-ul, ci pe toate interfetele din sistem, mai putin pe alea de pseudowire.

Aci ma panicasem un pic, ca sa nu pot sa fac management pe IPv6 nu era un capat de lume, da incepusem sa ma gandesc ca daca se intampla la fel si pe trafic intre 2 host-uri din acelasi VLAN care trec prin jucaria mea?

Well, aci am avut noroc si asta nu se intampla. De aflat am aflat testand si injurand iar HP-ul ca are ceva cu pachetele de IPv6 multicast si nu merge Neighbor Discovery. O sa investighez daca intr-o versiune mai noua de firmware au facut lucrurile sa mearga.

De ramas am ramas la strongswan din mai multe motive:

  • pare mai robust fata de libreswan
  • suporta DH Group 19/20/21 (curbe eliptice, chei mai mici, securitate mai mare)
  • suporta chei de tip ECDSA (cu ocazia asta mi-am facut si niste certificate digitale pe 521biti de tip Elliptic Curve)
  • nu are dilemele lui libreswan cu cheile (ba sunt bune, ba nu sunt bune)
  • merge OK partea de fragmentare a pachetelor care depasesc MTU la nivel de IKE (e misto sa dai ping cu -s 65000 si sa mearga fara sa faci nimic)
  • are suport de TFC (traffic flow confidentiality) pe IKEv2 in mod tunel. Asta inseamna ca face padding pana la MTU-ul interfetei si indiferent de cat trafic ai de fapt, unu care sta cu urechea pe fir va vedea mereu pachete de 9000 bytes (in cazul gigabit ethernet), fara sa stie exact cat sunt date utile si cat e gunoi.

Cu procesoare care au AES-NI (Intel Ivy Bridge sau mai noi) exista si accelerare hardware pentru criptare, via aesni_intel, mai ales daca AES e folosit in GCM. La fel, functiile de hash pentru integritatea datelor pot fi efectuate direct pe procesor prin sha512-ssse3 daca se foloseste SHA512 la IPSec.

Long story short, merge. Bine, merge da violat un pic tot setup-ul ca am dat de un bug in kernel care e nefixat in toate versiunile cu care am testat, adica de la 3.10 la 4.5 sau 4.10 cat era ultimul din CentOS 7 plus cand am testat.

BUG-ul e super misto: dupa cam o saptamana, moare treaba si fara reboot nu-si revine. Si asta se intampla pe ambele gateway-uri.

Dupa miliarde de draci si debug in fata serverului cu monitor si tastatura ca in vremurile bune, am descoperit problema, si anume un leak in kernel, mai mult de file descriptors din ce am bunghit pana acum.

Ce se intampla, ca e atunci cand se schimba cheile, nu se face free la esp6 si xfrm6 daca pe aceasi masina e si un tunel L2TP pentru setup-ul de pseudowires. Si creste utilizarea modulelor pana se strica jucaria.

[root@vpn-gw-1-1-c7-v ~]# lsmod | grep esp6
esp6 17180 1566 
[root@vpn-gw-1-1-c7-v ~]# lsmod | grep xfrm6
xfrm6_mode_transport 12631 3132

Si cand ajungi la cateva sute sau chiar mii, pocneste si nu mai merge. Si asta doar in combinatie cu modulul de L2TP pentru IPv6.

Pentru a rezolva asta, varianta cea mai buna a fost sa fac o masina virtuala in care sa termin partea de L2TP. Adica pe masina fizica am partea de IPSec intre capete, dupa care pe masina virtuala am facut multe interfete: una de inbound pe unde vin pachetele de L2TP si multe pe care sa scot pachetele in cate in un bridge, VLAN tagged sa le dau mai departe.

Postul asta trebuia sa-l public anul trecut cam acum (28 Septembrie 2016), da am uitat de el, da nu conteaza, ca BUG-ul nu e fixat nici acu si jucaria merge de atunci, line rate, fara nici o problema. Ar fi frumos sa fie si BUG-ul ala fixat pentru simplificarea setup-ului.

Cum setup super perfect nu exista, acum e un pic urata adaugarea de noi VLAN-uri pe acelasi pseudowire, in sensul ca trebuie sa le adaug de mana si sa editez si fisierele de configuratie astfel incat sa fie ce trebuie la reboot. Asta e din cauza ca pe CentOS nu exista script de network pentru a seta interfete de tip l2tp_eth. Insa e OK, ca nu schimb zilnic setari.

#slack

De prin Noiembrie asa de cand sunt intr-un contract nou lucrez intr-o echipa distribuita, fiecare de pe unde apuca. Pentru comunicatie si sincronizare la ce facem folosim Slack.

Slack, pentru comunicatie e asa… “the next best thing since sliced bread”. Poti sa te uiti sa vezi ce au discutat oamenii inainte sa intri pe un canal, ca de exemplu ce zicea lumea inainte sa vii in corporatie. Sa pornesti clientul si sa te lase acolo unde a inceput convorbirea de cand te-ai logat ultima oara.

Se integreaza cu tot felul de aplicatii (gen Dropbox pentru link-uri la poze/documente). Eu sunt mare fan ca pot sa uploadez poze cu diverse chestii, pot sa fac highlight pe text, pot sa editez ce-am scris (in mare parte pentru a corecta typo-uri), pot sa fac echivalentul a preformatted cand am snippet-uri de configuratie sau cod.

Si arata super bine. Fontul la scris, temele, cum sunt aranjate discutiile. Poate nu parea important, da pentru mine conteaza sa nu folosesc aplicatii care-mi displac cum arata.

Ce suge la Slack sunt thread-urile, da ii dau asa doar juma de bila neagra ca abia au fost introduse si probabil o sa le mai schimbe de cateva multe ori pana o sa gaseasca formula sa arate si alea normal si decent.

Nu e Slack o noutate, da voiam de mai demult sa scriu despre un el ca pur si simplu este foarte misto si pentru cine n-o fi auzit de el, recomand cu cea mai mare caldura.

turop

Pentru un proiect de-al meu, in scop didactic, am nevoie sa pot emite certificate digitale cat mai usor cu putinta. Si cum tot am inceput sa mai apas butoane si in limbaje de programare, am zis ca ce bine, pot sa scriu ceva simplu pe web.

Asa ca azi am creat turop, o aplicatie web in care cine are nevoie face paste la CSR si primeste un certificat digital inapoi. E mega quick & dirty, in special dirty. Da merge si isi face treaba.

ammit

De ceva vreme am tot cochetat cu invatatul de Python in contextul dezvoltarii de chestii web based (sa le zicem servicii). Pentru ca am tot felul de idei, da nu prea stiu programare, m-am apucat sa fac experimente micute sa inteleg cum functioneaza treburile, cum se leaga componentele intre ele si alte lucruri din astea super de baza.

Unul din experimentele astea se cheama Ammit si  este un URL shortener foarte basic bazat pe Bottle si Redis (via redis-py). Poate fi rulat ca aplicatie UWSGI din nginx. Ce e comis pe GitHub, ruleaza ca si standalone app pentru testare/dezvoltare.

GitHub il folosesc ca sa invat de stuff cu git si version control.

defcamp 2015 (ziua 2)

Ziua a inceput cu “Modern approaches to Wi-Fi attacks” tinuta de un polonez fost militian care a explicat foarte frumos cum poti face brute forcing la parole pentru WPA2 la routere din comert. A vorbit foarte misto si de entropia parolelor si de faptul ca daca un router nu foloseste setari din fabrica si pune utilizatorul sa seteze o parola, parola respectiva tinde sa fie chiar buna si nu foarte simpla. Foarte, foarte misto explicat.

Dupa nenea asta a fost un turc de la KPN Netherlands, care a vrut sa vorbeasca despre “Why nation-state malwares target Telco Networks: Dissecting technical capabilities of Regin and its counterparts”, dar a reusit sa ma plictiseasca si sa ma enerveze maxim. A citit toate slide-urile de le-a avut, foarte monoton, n-a zis nimic interesant, numai generalitati, a pus cateva slide-uri cu acronime si a tinut mortis sa zica de la ceva vine fiecare acronim si dupa aia sa treaca mai departe la alte chestii fara nici o legatura cu ce a citit mai devreme.

Dupa aia am nimerit la “How to mess with Android Intents” tinuta de un romanas de la Intel care a vorbit despre cum poti face DDoS la un telefon cu Android daca il conectezi la computer folosind un cablu USB. Si dupa aia citit help-ul de la programul scris de el si de inca o tanti, tot de la Intel. Nu m-am prins care a fost scopul, ca o data ce ai telefonul fizic in mana…

Am luat o gura de aer si am stat destul de mult si la “Hacking and Securing Network Monitoring Systems: End-to-end walkthrough example on Ganglia” unde un tip (foarte bun pe firmware si chestii conexe) a vorbit despre cum poti cauta servere de monitorizare accesibile din Internet, sa exploatezi cumva interfata web si dupa aia sa ataci serverele stiind ce chestii ruleaza pe ele. #nimicnou (macar aia sunt amuzanti).

Asa a venit pauza de masa si m-am dus cu Sorinache la Beraria Bragadariu la o bere (duh!) si la o portie de coaste. M-am gandit ca un pic de alcool o sa ma faca sa-mi treaca dracii cu prezentarile astora.

Well, dupa ce-am halit si am ajuns inapoi, m-am dus la o prezentare numita “Breaking in Bad (I’m the one who doesn’t knock)” tinuta de un tip de lucreaza la Pwnie Express, cu subiectul “Social Engineering”. Asta e primul tip care a vorbit din experienta, documentat cu filmulete si poze, despre cum se face asa ceva. Omul are har de prezentator, e simpatic si stie cum sa faca o poveste interesanta. Mi-a placut enorm prezentarea lui, pe departe a fost cea mai misto.

Imediat dupa el a urmat “Building a Cyber Security Operations Center” tinuta de un nene din UAE despre cum sa faci un SOC, reglementari, complianta si restul de crapuri de le auzi de la un producator comercial. Eram langa mine cu o fosta colega si i-am zis ca o invit la o apa, si ea “am sa accept”. Cam asta era nivelul de interes si plictiseala.

Am stat un pic dupa pauza sa vad “What’s in a name? DNS use for exfiltration, and monitoring for detection”, motivul fiind ca era tinuta de Teodor Cimpoesu si stiam ca se pricepe la din astea. Dar minune, prezentarea nu a avut titlul asta, s-a schimbat in altceva oribil si pe la jumate asa cand m-am prins ca n-o sa fie nimic interesant, mi-am bagat pula intr-un mod diplomat si m-am dus acasa. Singura parte distractiva a fost asocierea numelui UTI cu “Trusted advisor” si “incredere”. Buna gluma.


Fata de anul trecut, anul asta a supt maxim. Calitatea prezentarilor a fost slaba spre execrabila, iar organizarea foarte defectuoasa. Privind lucrurile si dintr-o perspectiva pozitiva, o sa-mi fac puncte pentru CEH si CISSP :)

defcamp 2015 (ziua 1)

Azi fusei la DefCamp 2015. Am mai fost si anul trecut si mi-a placut, asa ca am zis s-o bifez si anul asta, mai ales ca s-a nimerit sa fiu pe aici. Mai putini cunoscuti ca anul trecut, foarte multi oameni, se pare ca s-au inscris cam 800 la conferinta si anul asta ca noutate au avut 2 sesiuni in paralel. Treaba care a cam supt un pic ca pareau interesante diferite sesiuni paralele. Ma intalnii de dimineata si cu unul cu care am lucrat in Abu Dhabi si cu care am fost foarte amabil, ca sunt trei sferturi somer si cam trebuie sa-mi gasesc chestii de facut :))

Prima prezentare s-a numit “From Hype Hangover to Happy Hacking: Shaping the World through Shaping Actions” si a fost tinuta de un nene de a fondat sau lucreaza la “I am the Cavalary initiative”, un fel de think tank care se focuseaza pe cum poate fiecare sa ajute atunci cand sunt probleme de securitate. Prezentarea in sine a fost foarte misto si aratat binele pe care-l face cercetarea in securitate si cum poate sa “back fire” o data ce presa/media face reportaje bombastice despre diverse vulnerabilitati si lumea se panicheaza complet aiurea.

A doua prezentare, “A new Hope – CTF stories & IoT Hacking” a fost tinuta de Bitdefender (unul din prezentatori a fost Jay, alalalt nu stiu cine era) si s-a vorbit mai mult de Capture the Flag, cam cum vede lumea Internet of Things si problemele de securitate asociate cu asta. Nu imi aduc aminte prea multe detalii, probabil din cauza ca eram inca rupt in gura de somn.

Am vrut sa vad “Building a Weaponized Honeybot”, dar n-a venit prezentatorul, asa ca m-am dus la “Game of Hacks: Play, Hack & Track”, tinuta de un tip de la Checkmarx, despre cum poti invata hack-uri si metode de programare sigure prin jocuri. A facut si un demo live cu platforma la care au participat ~145 persoane din sala. M-am bagat si eu si am ajuns undeva pe locul 30.

Dupa asta am ars-o pana la pranz, ca urmtoarea prezentare mi s-a parut extrem de bullshitista din titlu, si anume “App2Own Bug Bounty Awards, Orange Romania”. A dat securitatea in operatorii mobili…

Dupa pranz m-am dus la “IoT Security”, prezentare tinuta de doi rusi, co-fondatori la un startup de securitate. Background tehnic super misto, insa abilitatile lor de prezentare invers proportionale. M-am plictisit in primele 10 minute si m-am tirat in ailalta sala unde a fost o prezentare numita “Challenges on Reversing Layered Malware” tinuta de un nene de la Fortinet. Foarte misto, foarte tehnica prezentarea, chiar am invatat niste lucruri noi despre cum se impacheteaza malware-ul modern, cum incearca sa detecteze daca ruleaza intr-un debugger sau intr-o masina virtuala.

Urmatoarea prezentare s-a numit “When Steganography Stops Being Cool” tinuta de un spaniol de la Trend Micro. Asta chiar mi-a placut ca a explicat cum malware-ul foloseste metode steganografice de a downloada sau a uploada date in moduri in care nu poate fi detectat de solutiile antimalware existente. Una din metode este de a encoda date in imagini folosind pattern-uri de culoare imperceptibile ochiului uman, insa perfect vizibile unui computer (RGB 255,255,255 este la fel cu RGB 255,255,254 pentru om, insa distinct pentru computer), aflarea centrelor de comanda si control folosind interogari DNS pentru TXT records si multe altele. Chiar mi-a placut foarte mult prezentarea, pot sa zic ca pe ziua de azi a fost cea mai misto.

Dupa aceea a urmat una legata de firmware reverse engineering, numita “(In)Security of Embedded Devices Firmware – Fast and Furious at Large Scale”. Tipul care prezinta stie despre ce vorbeste, a avut o prezentare foarte misto anul trecut, insa cea de anul asta nu mi s-a parut foarte interesanta. Pe la jumate m-a luat somnul si m-am dus spre casa.

Cam asta a fost prima zi la DefCamp. Maine se arata o zi mai interesanta si chiar sper sa fie asa.

Aseara am nimerit la cina prezentatorilor si se pare ca international este foarte bine vazut DefCamp, era un nene (fost profesor universitar) din San Francisco care venise special pana aici sa fie prezent sa vada cum e. La fel si unii din Albama si South Carolina.

Cateva chestii mai mult organizatorice:

  • Varianta cu sesiuni paralele suge, ca trebuie sa alegi intre una si alta.
  • Cafeaua a fost putina si s-a terminat repede, abia a iesit cam un pahar de fiecare pentru aia de beau cafea.

pyodbc & centos 6

Pe CentOS 6, versiunea de pyodbc este 2.1.7 si are un mic bug atunci cand are de interoperat cu baze de date care tin mortis sa dea datele encoded UTF-16 si face double-encoding la orice rezultat primit de la baza de date in urma unei interogari, daca ruleaza pe un sistem pe 64 de biti (cam asta am inteles io din descrierea problemei).

Descrierea BUG-ului se afla la https://code.google.com/p/pyodbc/issues/detail?id=78 iar rezolvarea se face prin modificarea unei singure linii de cod si stergerea unei litere :)

La http://www.imacandi.net/sin/blog/wp-content/uploads/2015/09/pyodbc-2.1.7-1.el6.x86_64.rpm se gaseste un RPM cu pyodbc patchuit si recompilat.

Cu ocazia asta mi-am adus aminte si de cum se foloseste rpmbuild.

double failures

In anii astia de acum (adica 2014/2015) eu nu pricep de ce vreun producator de echipamente ar face doar echipamente cu o interfata “IN” si una “OUT” si desi face clustering, nu poti face agregare in nici un fel astfel incat sa ai protectie in caz de pica switch-ul A si echipamentul B (incrucisat adica). Complicat nu este, mai ai un nivel de abstractizare cu impact minim ca toti linucsii astora de fac “appliance”-uri stiu de bonding si alte crapuri.

Srsly, nu pricep de ce toti zic, eh, lasa ca te descurci tu cum faci asta, noi nu vrem sa te ajutam in nici un fel, noi punem cat mai putine interfete pe chipamente si aia e.

Scapi de nenumarate griji cu un setup din asta, se pot strica chestii si poti sa-ti vezi de ale tale pana ai timp sa le repari tot asa… dar nu, s-au gandit unii ca de ce sa fie simplu cand poate sa fie complicat.

Asta e un rant de voiam sa-l zic de mai demult, de prin mai, da a trebuit sa fixez ce era muit si am uitat de el. Priorities, priorities.

ip number

Well, se pare ca m-am prostit si am descoperit niste roti patrate. Noroc ca #mumu e vigilent si imi zice cand sunt prost. Cred ca trebui sa raman la consultanta, nu la chestii din astea de implementare.

SELECT city,country FROM geoip_v4 WHERE
ip_from <= inet_aton('10.20.30.40')
AND
ip_to >= inet_aton('10.20.30.40');

Dar pentru istorie, ca sa mai rada si altii de ce chestii debitez cateodata, ramane si textul initial, cu mentiunea:

<rpetre> ce credeai ca e formula aia magica de ip to number? :)

Exista niste unii, care se cheama IP2Location de vand informatii de IP GeoLocation, adica pe scurt iti zic in ce oras/tara este inregistrat un subnet. Ei datele astea le dau CSV sa le incarci in ce vrei tu si dupa aia sa faci cautari in ele.

Pentru ca nu toate bazele de date au IP/subnet ca tip de data, daca te uiti dupa o singura adresa IP si tu tii subnet-uri in DB trebuie sa faci niste programare la mijloc sa afli de al cui sunbnet apartine o adresa IP. Asa ca oamenii astia au inventat ei o chestie de se cheama IP number: adica transformi 1.2.3.4 intr-un numar dupa o formula si dupa aia vezi tu cam intre ce valori se situeaza numarul ala in baza de date si afli cum ii cheama pe aia de-l utilizeaza si unde sunt inregistrati.

In baza de date informatiile sunt tinute sub forma de IP_FROM, IP_TO, CITY, COUNTRY plus alte chestii irelevante pentru post-ul asta. IP_FROM e numarul de la care “pleaca” un subnet si IP_TO numarul unde se “termina” subnetul. Formula dupa care se calculeaza IP number este:

X = A x (256*256*256) + B x (256*256) + C x 256 + D

In SQL (PostgreSQL* compatibil), un lookup dupa 10.20.30.40 se transforma in:

SELECT city, country FROM geoip_v4

WHERE ip_from <= 

((split_part('10.20.30.40','.',1)::INT * (256*256*256))
+
(split_part('10.20.30.40','.',2)::INT * (256*256))
+
(split_part('10.20.30.40','.',3)::INT * 256)
+
split_part('10.20.30.40','.',4)::INT)

AND ip_to >=

((split_part('10.20.30.40','.',1)::INT * (256*256*256))
+
(split_part('10.20.30.40','.',2)::INT * (256*256))
+
(split_part('10.20.30.40','.',3)::INT * 256)
+
split_part('10.20.30.40','.',4)::INT)

<= si >= ajuta sa faci match pe adresa de retea si pe broadcast daca stii exact unde ma-sa se termina subnet-ul pe care-l cauti si daca chiar vrei asta, altfel e bine doar cu < si >.

Cast-ul la INT l-am pus ca baza de date imi facea cast in FLOAT dupa care il compara cu INT si ca sa-l compare mai facea un cast din FLOAT in INT. Am sarit un pas, ca profilerul pentru acelasi query zicea ca dureaza ~500msec sa se uite in 11M de inregistrari (beware of my small data) pentru VARCHAR::INT si vreo 45sec sa se uite tot acolo dupa VARCHAR::FLOAT::INT. E un pic dubios rezultatul de la profiler pentru ca nu cred ca dureaza asa mult sa te faci ca n-ai nimic dupa virgula, dar si faptul ca daca rulezi un query cu cele doua variante diferenta ochiometrica intre ele e de maxim 2 secunde.

Pe de alta parte, nu-s mare fan ideii de “la mine pe laptop merge”, mai adaugati voi hardware sa mearga repede si la voi.

ssh trick

Am un setup care ruleaza niste scripturi in cron care iau niste fisiere dintr-o parte si le muta in alta (asta fiind varianta scurta). Fisierele sunt aduse de la distanta pe sistem.

Catch-ul cu asta e ca daca fac un scp si ma prinde cron-ul la jumate de transfer, se mucifica operatiile de dupa, ca o sa ajung sa am un fisier intr-o stare nu tocmai cunoscuta. Asta s-ar putea rezolva verificand cumva integritatea fisierului inainte de a incerca sa-l mut, insa mi s-a parut un pic peste mana (ca trebuie sa adaug si partea de integritate la fisier, sa verific ce si cum si parca e prea multa bataie de cap).

Partea buna in schimb e ca daca pe Linux (cred ca pe *NIX in general) vrei sa muti un fisier dintr-o parte in alta pe aceeasi partitie, operatia este atomica, asa ca solutia de a ma asigura ca fisierul ala fie a ajuns tot intr-un director sau nu, este:

ssh user@host "cat - > ~/file1 ; mv ~/file1 ~/work/file1"  < file1

Ce face treaba asta? Un cat peste o conexiune ssh si apoi muta fisierul scris initial in ~/ intr-un alt director numit ~/work.

Nu este chiar perfect pentru ca presupune ca ssh nu se strica in timp ce se transfera fisierul. Treaba asta insa se poate fixa send-side verificand codul de eroare intors de ssh care va fi non-zero daca orice din tot lantul ala de comenzi nu functioneaza si atunci poti sa mai bagi o fisa cu transferul.

Nu e cine stie ce descoperire, dar pot sa-mi fac treaba elegant :)