Puncte:2

iptables/nftables: cum să excludeți tot traficul redirecționat de la urmărirea conexiunii pe un router?

drapel ua

O cutie Linux are mai multe interfețe de rețea. Redirecționarea IP este activată pentru IPv4 și IPv6.

Aș dori să protejez serviciile care rulează pe router prin intermediul unui firewall cu stare. Pentru aceasta, urmărirea conexiunii trebuie să fie activată. În același timp, aș dori să exclud tot traficul care este redirecționat de la o interfață la alta din urmărirea conexiunii.

Pentru firewall-ul cu stare, aș folosi de obicei lanțurile INPUT și OUTPUT ale tabelului de filtre. Traficul redirecționat va merge către lanțul FORWARD. Dar AFAIK nu există nicio modalitate de a marca traficul ca neurmărit în lanțul FORWARD. O astfel de logică trebuie să meargă la lanțul PREROUTING din tabelul brut. Dar, cred, în lanțul PREROUTING încă nu s-a decis dacă traficul este redirecționat sau nu.

Urmărirea conexiunii are multe dezavantaje, cum ar fi căderile de pachete atunci când lista conexiunilor urmărite a atins dimensiunea maximă.

Care este cel mai simplu mod de a exclude traficul redirecționat (și numai traficul redirecționat) din urmărirea conexiunii?

A.B avatar
drapel cl
A.B
Puteți oferi aspectul rețelei dvs. (`ip -br link; ip -br address; ip -4 route; ip -6 route`) și să specificați dacă există vreun NAT de așteptat?
drapel ua
Luați în considerare doar un router cu două interfețe, eth0 și eth1 cu adrese 192.168.1.1/24 și 192.168.2.1/24.
Puncte:1
drapel cl
A.B

Pentru un set de reguli generice, se poate întreba nftables pentru a efectua o căutare a rutei în avans utilizând fib expresie în loc să așteptați ca stiva de rutare să o facă. Aceasta permite implicarea (viitorul) ieșire interfața deși nu există încă (decizia de rutare nu a avut loc), cu prețul unei căutări suplimentare. Apoi, dacă rezultatele indică că pachetul va fi direcționat, împiedicați urmărirea folosind a fără urmă afirmație.

EXPRESII FIB

fib {saddr | daddr | marca | iif | oif} [. ...] {oif | oifname | tip}

A fib expresia interoghează fib (bază de informații de redirecționare) către obține informații precum indexul interfeței de ieșire un anumit adresa ar folosi. Intrarea este un tuplu de elemente care este folosit ca intrare la fib funcții de căutare.

NOTRACK DECLARAȚIE

Declarația notrack permite dezactivarea urmăririi conexiunii pentru anumite pachete.

fără urmă

Rețineți că pentru ca această declarație să fie eficientă, trebuie aplicată la pachete înainte de a contratrack se întâmplă căutarea. Prin urmare, trebuie să stea într-un lanţ cu oricare prerutare sau ieșire cârlig și o prioritate cârlig de -300 sau mai puțin.

Deci, ar trebui să faceți o verificare „simplu” a rutei de la prerutare, folosind doar adresa de destinație ca selector și verificați existența unei interfețe de ieșire (pachetele non-rutabile sau pachetele destinate gazdei nu vor rezolva niciunul). Există o excepție pentru uite (loopback) interfață pentru a o menține urmărită: în timp ce reprezintă trafic local, un pachet trimis (prin ieșire cale) de la gazdă la sine se întoarce prin prerutare cale și are o interfață de ieșire de uite de asemenea. Deoarece pachetul de ieșire a creat deja un contratrack intrare, mai bine păstrați acest lucru consistent.

nft adaugă tabel ip fără stat
nft add chain ip stateless prerouting '{ tip filter hook prerouting priority -310; acceptarea politicii; }'
nft add rule ip prerouting fără stat iif != lo fib daddr oif există notrack

Înlocuirea ip familia cu inet Familia combo ar trebui să extindă același comportament generic la IPv4+IPv6.

Pentru a fi mai specific, s-ar putea specifica viitoarea interfață de ieșire cu fib daddr oif eth1 de exemplu, care este mai mult sau mai puțin echivalentul oif eth1, dar disponibil și în prerutare.

Desigur, dacă topologia este cunoscută dinainte, este posibil să se evite o căutare FIB folosind una sau câteva reguli bazate pe teste de adrese, deoarece rutele sunt apoi cunoscute în avans de către administrator. Ar putea fi necesară evaluarea comparativă a rezultatelor pentru a ști dacă acest lucru este mai interesant decât păstrarea unei metode generice.

De exemplu, cu informațiile furnizate de OP, înlocuind regula anterioară cu:

nft add rule ip apatrid prerouting 'ip daddr != { 192.168.1.1, 192.168.2.1, 127.0.0.0/8 } notrack'

ar trebui să aibă un efect aproape echivalent. 127.0.0.0/8 este prezent din aceleași motive ca mai sus cu uite interfata.

Gestionarea difuzării (cum ar fi 192.168.1.255 primite pe eth0) și multicast (cum ar fi link-local 224.0.0.1 primit pe o interfață) ar putea să nu funcționeze la fel în ambele metode și nici așa cum era de așteptat și ar necesita eventual reguli suplimentare pentru nevoi specifice, în special cu a doua metodă. Deoarece urmărirea difuzării și multicastului este rar utilă, deoarece o sursă de răspuns nu va fi (și nu poate) fi destinația originală a adresei de difuzare sau multicast, astfel încât intrarea conntrack nu va „vedea” niciodată traficul bidirecțional, de obicei nu contează prea mult pentru reguli de stat.


Note

  • Acest lucru nu va fi de obicei compatibil cu NAT cu stare.

    Înțeleg că DNAT către o gazdă de la distanță își va primi traficul de răspuns nu de-NAT și va eșua, iar acel SNAT redirecționat nu se va declanșa deoarece nu a existat contratrack intrare creată. SNAT folosit rar în calea de intrare ar trebui să fie bine, iar o combinație de DNAT + SNAT (folosind o sursă de adresă locală) ar putea funcționa, de asemenea, de atunci, atât în ​​direcția originală, cât și în direcția de răspuns, este implicată o destinație locală, deci un contratrack intrarea ar trebui să fie întotdeauna creată sau căutată corect.

  • set de reguli standard

    Folosind reguli reale iptables sau nftables (în propriul său tabel diferit) poate fi apoi făcut ca de obicei, inclusiv regulile stateful pentru gazda în sine. Deoarece traficul direcționat nu va crea contratrack intrările, regulile care implică un astfel de trafic ar trebui să fie doar apatride și să nu folosească niciunul CT expresie pentru că nu s-ar potrivi niciodată.

  • verificarea comportamentului

    Se poate verifica comportamentul general chiar și fără reguli adecvate pentru firewall prin:

    • folosind un manechin CT regula pentru a fi sigur ca contratrack facilitate este înregistrată în spațiul de nume actual al rețelei.

      nft adăugați tabel ip mytable
      nft add chain ip mytable mychain '{ tip filter hook prioritate prerouting -150; acceptarea politicii; }'
      nft add rule ip mytable mychain ct state nou
      
    • folosește contratrack instrument de urmărire a evenimentelor:

      conttrack -E
      
    • genera trafic de la distanță

      NOU contratrack apoi vor fi create intrări pentru traficul care urmează să fie primit de router, dar nu pentru traficul direcționat.

drapel ua
Acea expresie fib este exact ceea ce căutam. Verificarea dacă daddr este o adresă locală ar putea funcționa. Dar având în vedere că unele adrese (de exemplu, unele IPv6) se pot schimba în timp, acest lucru mi se pare nepractic.
drapel ua
Dacă ar fi o rută inaccesabilă? Se potrivește și traficul `fib daddr oif exists`?
A.B avatar
drapel cl
A.B
Dacă nu există nicio rută, nu există nicio interfață de ieșire: fără nottrack. Dar, de fapt, în timp ce regulile dinainte de decizia de rutare vor avea `ct state new` potrivesc cu astfel de pachete, conntrack nu îl va confirma pentru că este abandonat la jumătate (în decizia actuală de rutare): `conntrack -E` nu îl va afișa deloc. Deci obiectiv încă atins. (Pe lângă asta, în timpul testelor nu am reușit să fac ca `oif daddr type xxx` să se potrivească așa cum era de așteptat când nu există nicio rută.)

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.