nereus

In ultima vreme, pe unde am apucat, am schimbat certificatele digitale folosite cu cele emise de Let’s Encrypt. Mai ales ca certbot face minuni pus in cron.

In materie de client-to-site VPN, in ultimii ani am tot bagat PaloAlto ca au un client dragut, configurare este usor de facut si merge si pe IPv6 cum trebuie, inclusiv sa aloce adrese de IPv6 pe tunel.

Problema cu asta e ca e un pic obositor la 3 luni sa uploadez de mana certificat nou, ca automat nu stie. Si pe langa asta, are o cretinatate ca vrea parola la cheia privata daca o uploadez si pe aia o data cu certificatul. Si cum certbot nu pune parole la cheile private, ar trebui sa ma dau un pic si cu OpenSSL sa ii pun parola la cheie, s-o concatenez cu certificatul si dupa sa uploadez totul.

Pe langa asta, eu tot cochetez asa sporadic cu programarea, ca e cam complicat sa faci si DevOps fara Dev :)) Ca ma mai scap sa fac si d’astea.

Anyways, long story short, zilele astea am butonat la un mic script/app (ca toate’s app-uri acum) care automatizeaza distractia asta cu Let’s Encrypt si PAN.

Asa a aparut Nereus. Scris in Python, cat se poate de curat si cat am duce pe mine acum capul sa scriu cod curat.

google cloud support

Una din corporatiile pe unde ma mai duc la produs are chestii in GCP. Si pe acolo am facut si eu un proiect sa tin cateva VM-uri, nimic complicat. VM-urile alea trebuie sa vorbeasca cu niste componente care sunt intr-una din locatiile clientului. Pentru asta am facut un tunel IPSec intre GCP si locatie.

Asta se intampla la inceputul lui August. Acu vreo saptamana, intr-o luni, ma suna omenii din locatia respectiva ca “nu mai merge ping-ul din google la ei in locatie”. Ma uit si eu, si chiar nu mai exista conectivitate. Ma uit pe acolo prin dashboard-ul de la GCP, toate verzi. Ma uit la mine, toate verzi.

Au astia la GCP un “Connectivity tester” si alea zicea ca poa sa dea ping. Nu chiar pana la capat, da a dedus el ca ar trebui sa mearga. Nu vroia ping-ul ala sa mearga neam. Am sapat pe acolo prin loguri pana mi-au sarit mucii, nimic util. Zic bine, hai sa pun tcpdump sa vad ce si cum.

Dau ping din locatie intr-un VM din GCP, ajung pachetele la ala, raspunde la ele, la mine in locatia ajungea fix o pula. M-am scremut un pic sa fac o captura de pachete la mine, ca firewall-urile astea enterprise sunt la fel de utile ca igrasia cand ai de debugat, ca abia poti vedea una alta. Nimic util, nici un pachet.

Zic trec la planul B, imi fac un Linux cu Strongswan si vad pe ala ce se intampla, ca macar pot sa-l debughez calumea. Mai fac repede un tunel cu GCP, se ridica imediat, dau ping, la fel, ajungeau cum trebuie pana acolo, cand sa se intoarca… se intorceau prin gura.

Ma zic, nu e de la mine, hai sa vad daca e de la astia. Ca na, se mai strica si cloud-ul din cand in cand si zic poate pot sa-mi zica si mie daca din “Google Cloud VPN” ies pachetele cum trebuie, ca era pe traseu singura necunoscuta.

Dau acolo $100 sa pot sa deschid caz, fac cazul cu toate astea si in vreo doua-trei ore asa imi raspunde un baiat ca s-a uitat el prin loguri si problema e ca e de la mine, ca nu stie VPN-ul de la mine sa faca tunele ESP, ca zice clar in loguri ca “ESP_TFC_PADDING_NOT_SUPPORTED” si ca sa il configurez sa faca tunele cum trebuie. Si ii zic, bosulache, ia fii atent aici schema: pleaca pachetele de la mine, ajung la voi, VM-ul meu raspunde la ele, dar de la voi ciuciu, deci nu ca nu fac eu tunelul cum trebuie. Si i-am explicat si ce cacat e TFC, sa nu mai aibe idei pe langa daca mai vede asta vreodata. Asa mult imi displac oamenii astia de la suport pe care-i doare in pula de problema ta si cauta repede “error” in loguri ca poate, poate e de la tine ceva si nu trebuie ei sa faca nimic.

Aproape o zi liniste, gen vreo 21-22h de liniste de puteai sa auzi pachetele pe cablu. Mai bag o fisa si upgradez la $250 sa pot sa apas pe butonul de escalate, in ideea ca o sa ma bage cineva in seama. Intr-o ora-doua asa imi raspunde iar baiatul asta si zice ca da, interesant, dar poate e din cauza ca am firewall pus si de aia nu merge. Ii trimit screenshot cu “n-am nimic pus”, si dupa mai raspunde tot asa un pic cu intarziere ca este posibil sa necesite investigatii amanuntite treaba asta si sa completez un template de sloturi disponibile sa facem un call cu screen sharing sa se uite si aia sa vada ce si cum.

Ne intelegem la un slot orar pe la 10 noaptea la mine si ma paseaza la o alta echipa. Se face ora, intra doi in call si le arat exact ce si cum, fix cat puteam sa vad eu loguri in GCP acolo. O ora jumate si dupa ce am trecut cred ca de 4-5 ori prin fix aceleasi meniuri, loguri, pasi. M-au intrebat si astia daca n-am firewall, le-am aratat ca nici macar iptables nu aveam pe una din masini. Astia foarte “thorough” asa, au vrut sa vada de cel putin vreo 2-3 ori daca chiar n-am firewall pe masini. Si intr-un final mi-au zis ca ei n-au acces asa sa vada ce se intampla cu VPN gateway-ul lor si daca scoate pachete cum trebuie.

Dimineata imi dau mail ca “fii antena, tre sa dezactivezi VPC mode auto, ca de aia nu-ti merge ca ai facut VPN-ul gresit”. Zic babaieti, mergea de vreo luna jumate pana cand brusc n-a mai mers. Si a doua la mana, mai am un VPN facut tot asa, fix in proiectul asta care ala n-a sughitat deloc. Nu mai bine reparati voi ce-ati stricat si sa faceti sa mearga lucrurile asa cum erau inainte?

Si ce sa vezi, alt mesaj cu “Nu, la noi e ok, daca schimbi cum ti-am zis o sa mearga, ca asa cum e acum nu are cum sa mearga”. Le mai dau o data screenshot-ul ala cu alt VPN mergand, l-au ignorat cu succes si au tinut-o pe a lor.

Pentru ca statea productia, am facut ce vroiau ei si a luat-o. Doar, doar sa nu se uite la ei sa vada ce sloboz au stricat si sa repare.

Din tot ce am investigat si asa, parea destul de clar ca era o problema de rutare pe undeva prin burta lu’ GCP, ca pachetele ajungeau teoretic unde trebuie, doar ca nu erau criptate mai departe si trimise la mine.

Am trecut in 3 zile prin 4 oameni, unu’ cu cea mai mare durere posibila in pula, altii doi un fel de Lolek si Bolek, ei nu stiau, da erau convinsi ca nu poa’ sa fie de la ei, si un al treilea la care am tipat ca si asta era “noi nu gresim”. Doar, doar sa nu dea un tcpdump la ei sa vada daca ies pachetele cum trebuie sau daca nu ies, sa vada de ce nu ies.

M-au umplut de spume, ca in primul rand i-a durut fix in cur de problema, probabil daca nu dadeam mai multi bani sa pot apasa butonul de escalate raspundea baiatul ala cand ii mai venea lui cheful, probabil peste cateva zile dupa ce-si facea siesta. In al doilea rand au facut tot posibilul sa nu investigheze ceva pe partea lor. In al treilea rand ca mi-au dat un workaround pe post de solutie, desi nu cred ca a fost vreun mesaj in care sa nu le amintesc ca “a mers si brusc n-a mai mers”. Si in al patrulea rand pentru “stonewalling” si faptul ca desi le aratam ca merge ce ziceau ei ca nu merge, insistatau ca nu are cum – ba cu poza in fata gen, ei erau cu “nu merge, ti se pare”.

Ca si cu multe altele, e bine sa n-ai probleme cu cloud-ul, ca daca ai, o sugi cu gratie ca nu-i pasa nimanui de la suport sa-ti rezolve problema.

sapte tricouri

Anu’ trecut, dupa ce a inceput balamcul, m-a mancat in cur sa ma mut #pafranta pentru un contract. Pentru ca COVID19, am zis ca stau la hotel ca nu era sigura treaba cu cat o sa stau p’acolo si cum evolueaza lucrurile si tot asa.

Long story short, am ajuns sa stau vreo aproape noua luni in hotel.

Am plecat io d’acasa cu doua geamantane cu haine. Bine, 1 jumate, ca aialalta jumate era plina cu masti ca nu stiam cum sa zic masca in franceza si nici unde sa le gasesc si nici daca o sa ramana aia fara cum s-a mai intamplat. Sa fiu sigur cum se duce.

Din cauza de niste cretini cu care trebuia sa interactionez zilnic, am ajuns sa folosesc din geamanatanul ala jumate de haine doar vreo 7 tricouri + sosetele si chilotii aferenti. Si o bluza pentru cand era iarna.

Am avut cre’ca cel mai mare ROI pe niste haine cumparate vreodata, ca le-am purtat de au inceput sa se rupa si sa arate ca alea scumpe deja rupte de prin magazine. Cel mai mandru sunt de bluza aia ca s-a tocit maxim la maneci si arata misto de tot.

Anyway, ideea era ca nu-ti trebuie prea multe sa traiesti si nu-i pasa nimanui ca porti aceleasi haine un an sau oricat le-ai purta, chiar si intr-un mediu din asta de business.

Important e sa nu puti.

mortal kombat

Filmu asta e aproape la fel de prost ca serialul ala din ’96-’98 sau cand a fost si cu Mortal Kombat: Anihillation la un loc. Ba da’ prost rau. La modul ala in care trailerul a fost mai misto decat tot filmul pus cap la cap.

Si futu-i in gura de hoti, incepe bine filmul, cu Hiroyuki Sanda pe post de Hanzo Hasashi, si eram “sa vezi ce jmecherie de film cu asta pe post de Scorpion”. Si cam atat fu misto, ca lupta cu Subzero incepu bine si se termina mega prost si dupa aia tot filmul fu din ce in ce mai prost pana la final.

Astora de au facut filmul ar trebui sa le dea cineva un premiu pentru filme proaste, gen Oscar sau ceva. Ba fu atat de prost ca pana si un film din ala cu Steven Seagal gras si cu paru’ vopsit are un scenariu mai bun.

viva l’italia

SImpatic film, asa pentru o sambata seara de carantina frantuzeasca. Mai ales ca pot sa si pricep un picut asa din ce zic astia fara subtitrare.

E amuzant cu fiecare limba are “Capra crapa piatra’n patru”, si intr-o scena asa au tradus din italiana, si ca nu intelegeam, am dat-o pe engleza subtirarea, si acolo o bagau pe aia cu “sea shells on sea shores” :))

automation

Cateodata mai am si zile din alea in care chiar trebuie sa muncesc, nu doar sa am opinii despre ce ar trebui altii sa faca. Da stiu, maxim de trist, da’ cateodata mai trag paiu’ scurt…

Cand am mult de lucru, mai ales pe implementari, incerc s-o dau pe automatizare cat se poate de mult din vreo doua motive mari si late:

  • sa nu-mi pierd mintile
  • sa nu gresesc prea mult ca mi-am pierdut mintile

Pentru asta ma dau in general cu Python ca mi-e la indemana si so far mi se pare tata’lor la structuri de date. Adica pentru ca pentru un fisier de intrare de genul:

smc3r01-t1,11.12.13.14,tf
snc4l01-t1,15.16.17.18,t
snt3b02-e1,19.20.21.22,f
tmc5o04-c1,23.24.25.26,tf

pot sa scot o structura de date de tip key/value intr-o linie de cod (bine, 3, da’ oricum):

#!/usr/bin/python3
import csv

with open('t.csv', mode='r') as t_infile:
  reader = csv.reader(t_infile)
  t_nodes = {rows[0]: [rows[1], rows[2]] for rows in reader}

Si dupa aia sa fac chestii cu t_nodes gen:

for n in t_nodes:
  print(n,t_nodes[n][0],t_nodes[n][1])

Pentru ca de fapt t_nodes arata de fapt asa:

{'smc3r01-t1': ['11.12.13.14', 'tf'],'snc4l01-t1': ['15.16.17.18', 't'], 'snt3b02-e1': ['19.20.21.22', 'f'], 'tmc5o04-c1': ['23.24.25.26', 'tf']}

Pai sa ai un key/value store (sau dictionary cum ii zice de fapt) in 3 linii de cod in care valorile sa fie o lista, genius. Sa nu mai zic ca poti avea un dictionare de dictionare pentru cand lucrurile chiar sunt complicate.

Exemplul asta l-am dat ca ca mi-a dat clientul un Excel cu cateva mii de linii si un alt Excel cu doar cateva sute de linii si mi-a zis sa fac sa fie bine :)

Varianta aia indiana era sa zic ca mai am nevoie de cativa oameni care sa utilizeze un GUI, unde dureaza minim 30-40 de secunde de dat click-uri, introdus date si validat sumar pentru fiecare linie din aia din fisier, si asta dupa ce intri intr-un ritm cat de cat decent de lucru.

Varianta mea dureaza 2 secunde pe linie ca e API-ul un pic incet. Si nici nu face greseli. Scriptul meu adica, ca API-ul nu e scris de mine sa fie perfect =)))

Alteori lucrurile sunt mai complicate decat a citi stuff dintr-un CSV, dar alea’s povesti pentru alte alta data.

O alta chestie de vreau sa zic, ca tot am adus vorba de Python, ala de a inventat f” string sa aiba noroc de-un harem de tinere si sa dea la buci pana o sa-i cada pula, ca e absolut geniala functionalitatea asta.

def mkgeneric(what, element):
  if element == '':
      return f' {what} "Any"'
  if len(element.split(',')) == 1:
      return f' {what} "{element.strip()}"'
  if len(element.split(',')) > 1:
      element = element.split(',')
      el = []
      for i in range(len(element)):
          el.append(f'{what}.{i+1} "{element[i].strip()}"')
      return ' '.join(el)

Fara asta scriam la .format() de-mi ieseau ochii, asa il bag direct pe unde trebuie fara nici o treaba, si asta e un exemplu simplu…

Tot pentru automatizare, dar mai mult pentru prototipare (da’ gay mai e cuvantul asta in romana) folosesc Postman, care este genial – mai ales ca poate sa iti zica si cam cum ar trebui sa arate codul intr-un limbaj de programare, gen Python, pentru ce incerci sa faci.


Pe langa treaba de mai sus, cu Postman poti face super debugging cand vrei sa vorbesti cu un API. M-a scos de cateva ori cand vorbeam cu API-uri necunoscute si cu documentatie scrisa de autisti…

Si e bun si cand iti faci singur API si vrei sa-l validezi ca si merge :))

Long story short, lucrurile devin un pic mai usoare daca le faci programatic.