Conntrack NEW pe un pachet ACK: ce nu dovedește
Un ACK etichetat NEW înseamnă că urmăritorul nu avea stare potrivită, nu că VPN-ul a deschis o sesiune. Citește hook-ul, tuple-ul și fereastra de captură.
În jurnalul paravanului de foc există o linie la care nu te așteptai: un pachet ACK, stare conntrack NEW, o adresă sursă care nu este a ta, port de destinație deschis. Tentația este să o citești ca o conexiune nouă de intrare pe care nimeni nu a autorizat-o. Ce spune de fapt linia este mai îngust: când acel pachet a ajuns la acest hook, urmăritorul nu avea stare potrivită, iar pachetul purta un ACK. Sunt două fapte despre două lucruri diferite, și niciunul nu este transcrierea completă a unei strângeri de mână. Aceasta este ordinea pe care o parcurg înainte de a trage o concluzie.
Începe cu pachetul, nu cu verdictul
Separă observațiile înainte de a le interpreta. Fanioanele TCP descriu acest pachet, starea urmăritorului descrie ce știa la acel hook, iar captura ta descrie doar fereastra pe care ai înregistrat-o.
Confundarea acestor trei este modul în care un ACK devine „furnizorul a lăsat pe cineva să intre”.
Ce înseamnă NEW de fapt la hook
potrivirea conntrack din iptables documentează NEW ca un pachet care începe o conexiune, sau unul asociat unei conexiuni care nu a văzut încă trafic în ambele direcții. ESTABLISHED înseamnă că urmăritorul a văzut pachete în ambele direcții. Niciuna dintre definiții nu spune că pachetul era un SYN, nici că a sosit fără istoric.
Un urmăritor care începe să observe un flux la mijloc clasifică următorul pachet după ce știe, iar asta poate fi nimic. Este o afirmație despre memoria urmăritorului, nu despre intenția gazdei îndepărtate.
Urmărirea laxă explică majoritatea surprizelor cu ACK
Nucleul documentează nf_conntrack_tcp_loose, ceea ce permite urmăritorului să preia conexiuni TCP al căror început nu l-a văzut. Cu setarea la valoarea implicită, un ACK din mijlocul fluxului poate fi adoptat ca flux stabilit. Dezactivează-l și același pachet va fi mai probabil clasificat ca INVALID în loc de NEW. Ambele rezultate descriu regulile urmăritorului, nu istoricul aplicației.
Deci verifică această setare înainte de a construi o teorie pe etichetă.
Elimină cauzele plictisitoare în această ordine
Majoritatea evenimentelor NEW-pe-ACK pe care le-am urmărit s-au încheiat cu una dintre acestea, și toate sunt ieftin de verificat:
- Tabelul conntrack a fost golit, sau urmăritorul a fost repornit.
- Gazda a fost repornită, sau fluxul s-a mutat în alt namespace sau dispozitiv.
- Rutarea asimetrică a scos SYN-ul pe o cale pe care nu o captezi.
- NAT a rescris tuple-ul, deci intrarea nu mai corespunde cu ce ai citit.
- Captura a început târziu și nu a văzut niciodată începutul.
Fiecare dintre ele scoate pachetele anterioare din câmpul vizual al urmăritorului și le lasă intacte pe cele ulterioare. O repornire sau o golire a tabelului se confirmă cel mai ușor din uptime și jurnale. Rutarea asimetrică apare ca o captură unidirecțională. NAT este cel viclean, pentru că tuple-ul pe care urmăritorul l-a salvat nu este tuple-ul tipărit în jurnal.
Notează pe care dintre ele le-ai eliminat și cum, înainte de a merge mai departe.
Citește tuple-ul, interfața și hook-ul
O intrare conntrack este cheiată după adrese, porturi și protocol, deci orice traducere schimbă care intrare se potrivește. Notează și interfața și hook-ul, pentru că un pachet văzut pe interfața greșită sau după un alt lanț îți spune că traseul nu este cel din diagramă. Când evenimentul implică un VPN, decide dacă te uiți la pachetul interior sau la purtătorul exterior. Apoi compară cu ce a înregistrat gateway-ul pentru același tuple din cinci părți.
Două vederi ale unui flux care nu sunt de acord sunt mai informative decât oricare dintre ele singură.
Când merită escaladat
Escaladează când poți arăta un serviciu care este accesibil și nu ar trebui să fie, împreună cu fluxul, politica ce l-a permis și dovezi de la ambele capete. Nu raporta un defect al furnizorului pe baza unei singure etichete de stare sau a unei capturi parțiale, pentru că acel raport va fi închis cu explicația pe care tocmai ai citit-o. Dacă serviciul este într-adevăr expus, proprietarul acelei granițe este persoana potrivită să îl repare, iar o mapare de porturi delegată sau un ascultător neintenționat este o cauză mai probabilă decât un bug.
Apoi închide golul de vizibilitate care a lăsat un singur pachet să pară o sesiune întreagă.