Puncte:14

Blocați 1,4 milioane de adrese IP pe VPS

drapel be

Cum pot bloca o listă de aproximativ 1,4 milioane de adrese IP? Am încercat deja să o fac cu iptables PREROUTING, cum ar fi:

-A PREROUTING -d IP_HERE/32 -j DROP

Dar cu atâtea înregistrări, lățimea de bandă îmi scade ca nebun când fac un test de viteză.

Fără IP-uri blocate în iptables:

1 Gb/s

Cu IP-uri blocate în iptables:

3 Mb/s la vârf.

Vreau să folosesc XDP_DROP ca aici (ultimul pas): https://blog.cloudflare.com/how-to-drop-10-million-packets/

Dar nu am idee cum să folosesc asta. :/ (Sunt foarte prost la programare)

Există alternative la această abordare?

drapel pk
Putem întreba de ce doriți să blocați 1,4 milioane de IP-uri? Sunt multe IP-uri. Ar putea fi mai ușor să vă asigurați că serverul dvs. este securizat.
peterh avatar
drapel vn
Există un lucru nou numit **ipset**. Nu știu, dar ar putea merita încercat. Este noul cadru de firewall în Linux, de fapt, iptables astăzi este doar un strat de compatibilitate peste ipset.
drapel aq
Dacă încercați să blocați IP-urile în funcție de locație/țară, vă rugăm să spuneți, există soluții la acest lucru care nu implică milioane de intrări iptable.
drapel pk
De asemenea, vă rugăm să nu blocați IP-urile în funcție de locație/țară fără un motiv foarte întemeiat. Nu doar „oh, există hackeri în acea țară”
ilkkachu avatar
drapel co
@peterh, vrei să spui nftables? Cred că ipset există de ceva vreme, iar AFAIK este vorba doar despre reguli care implică, ei bine, un set de adrese
TooTea avatar
drapel cn
@peterh ipset-urile sunt incluse în kernel începând cu [2.6.39](https://kernelnewbies.org/Linux_2_6_39#IPset), lansat acum zece ani. Ele existau deja înainte ca un patch extern.
user26742873 avatar
drapel cn
@user253751 Poate că operațiunea blochează întreaga UE pentru legea cookie-urilor? :P
peterh avatar
drapel vn
@TooTea Ok, mulțumesc. Ceea ce este interesant pentru mine, modul în care ipset-ul potrivește un ip cu un ipset (care este probabil un set de ips cu mască). Folosește un copac sau hash intern? Dacă da, va fi foarte rapid. Cu iptables, singura modalitate de a potrivi un ip cu un set de reguli este căutarea liniară, deoarece Turing.
jcaron avatar
drapel me
Sunt adresele IP cu adevărat adrese IP individuale sau fac parte dintr-un număr limitat de intervale?
drapel be
IP-urile sunt individuale și majoritatea sunt proxy
mckenzm avatar
drapel in
Desigur, ar trebui să fie un indice hashed (sau altfel va fi destul de dezechilibrat). „viteza fulgerului” conform referinței din răspunsul lui @Cyrbil.
Puncte:32
drapel in

Ar trebui să te uiți ipset.

De pe site-ul oficial:

Ipset poate fi instrumentul potrivit pentru tine [...] pentru a stoca mai multe adrese IP sau numere de porturi și potrivi cu colecția de către iptables.

[...] (Ipset) poate stoca adrese IP, rețele, numere de porturi (TCP/UDP), adrese MAC, nume de interfețe sau combinații ale acestora într-un mod care asigură viteza fulgerului atunci când se potrivește o intrare cu un set.

Pentru a-l folosi, trebuie să creați un ipset, adaugă IP-uri și creați un iptables regula pentru a se potrivi cu ipset:

ipset crea lista neagră hash:ip hashsize 1400000
ipset adauga lista neagra <ADRESA IP>
iptables -I INPUT -m set --match-set lista neagră src -j DROP

Un exemplu real de utilizare poate fi găsit Aici. Observați că folosește restaurare ipset în loc să treci prin fiecare IP într-o buclă pentru că este mult mai rapid.

Dacă lista dvs. de IP-uri are suprapuneri, poate doriți să-l preprocesați pentru a le converti intervale de IP acolo unde este posibil. Aici este un exemplu de instrument pentru a face acest lucru. Nu vă va aduce performanțe mai bune ipset dar va reduce dimensiunea listei dvs.


Pe o notă laterală, din punct de vedere al performanțelor, este foarte rapid și scala fără penalizare. Dupa cum Cloudflaremențiunea de pe blog, există abordări mai rapide de nivel scăzut; dar este mult mai complex și adaugă doar câțiva octeți pe secundă, ceea ce, dacă nu ai amploarea și ambiția unui furnizor de cloud, nu merită efortul.

iBug avatar
drapel tr
Procesarea IP-urilor individuale în intervale este cu siguranță o necesitate. Apoi puteți folosi `hash:net` pentru set și o performanță chiar mai bună.
Puncte:20
drapel za

Frame challenge - care este lista mai scurtă, adresele autorizate sau blocate?

În loc să refuzați 1,4 milioane, permiteți pur și simplu aproximativ duzina de IP-uri pe care doriți să le permiteți și respingeți totul implicit.

drapel fr
Acest lucru sună mai degrabă ca și cum ar vrea să blocheze un set predefinit de „IP-uri proaste”. Pentru majoritatea aplicațiilor, un sistem de listă albă probabil că nu va fi util
Puncte:15
drapel in

Dacă adresele IP funcționează într-un interval bine definit, atunci puteți utiliza ufw ca asta pentru a bloca traficul:

sudo ufw deny de la 192.0.0.0/8 la orice

Exemplul de mai sus blochează tot traficul de la 192.0.0.1 la 192.255.255.254, care rezultă la 16.777.214 de adrese și acest lucru are un efect zero (observabil) asupra debitului rețelei.

Atâta timp cât lista dvs. de IP este operabilă pentru a genera intervale de IP, acest lucru poate funcționa pentru dvs.

drapel mx
Să presupunem cu toții că OP dorește să blocheze adresele care nu se află într-un interval.
iBug avatar
drapel tr
UFW este, așa cum se descrie, un frontend pentru iptables. Acest lucru îi face performanța și mai proastă decât întreținerea manuală a lanțurilor iptables.
drapel in
De ce _mai rău_? Nu este ca și cum regulile iptables apelează la ufw, este doar un front-end pentru configurarea lor în primul rând. Evident, nici nu va fi _mai bine_, totuși.
iBug avatar
drapel tr
@Useless UFW creează mai multe lanțuri pentru fiecare pachet de parcurs, în timp ce regulile menținute manual pot fi *mult* mai simple și, prin urmare, mai performante.
drapel in
Așa că spuneți „ufw generează reguli prea simple și le puteți crea manual pe altele mai bune” sau așa ceva. Performanța proprie a UFW nu este o problemă, iar faptul că este un front-end nu face automat regulile sale proaste. Nu este mai rău decât regulile scrise de mână care _nu_ folosesc în mod inteligent lanțurile.
Nate T avatar
drapel it
@inutil deoarece este un frontend, de fiecare dată când apare o solicitare. este procesat de `ufw` care apoi apelează la `iptables` în culise. Odată ce `iptables` a corelat ip-ul cu regulile enumerate, trebuie să transmită aceste informații înapoi către `ufw`, ceea ce ar permite sau respinge. Acesta este fluxul tipic fe/be. Decuparea lui `ufw` elimină jumătate din pași. Acestea fiind spuse, creșterea/scăderea performanței ar depinde nu de câte ip-uri sunt blocate, ci de câte solicitări vin de fapt.
drapel in
@NateT Am subliniat deja că nu este absolut adevărat. `ufw` oferă doar o interfață simplă pentru `iptables`, care în sine doar configurează regulile în modulul netfilter `ip_tables`. Activitatea de filtrare a pachetelor nu curge niciodată de la modulul de kernel `ip_tables` către componenta spațiului utilizator `iptables`, cu atât mai puțin frontend-ul `ufw` pentru asta.
Nate T avatar
drapel it
Atunci NU ESTE UN FRONTEND. Aplicația 1 care actualizează magazinul de date aplicația 2 nu face din aplicația 1 un „front end” pentru aplicația 2. Dacă ambele aplicații nu sunt apelate în ordinea pe care am descris-o, o puteți numi oricum doriți (numiți-o „Nancy în rochia ei roșie” pentru tot ce îmi pasă), dar numirea acesteia un front-end într-o discuție despre viteza-algoritmului nu este niciodată o idee bună. Utilizatorii acestei rețele sunt mereu critici pentru că sunt prea pretențioși în privința termenilor, dar ^acesta^ este ceea ce poate face un termen ușor folosit greșit. @inutil
Nate T avatar
drapel it
Dacă am înțeles greșit, vă rugăm să descrieți fluxul evenimentelor. Dacă ambele aplicații sunt utilizate, ambele ocupă memorie și resurse temporale, chiar dacă imprimă doar Hello World pe consolă. Știi ce? Îl voi căuta ca să nu fii nevoit să-l tastați. oricum sunt curios acum. Singura excepție la care mă pot gândi este cazul în care iptables nu este apelat deloc și numai datele sale sunt utilizate/actualizate. În acest caz, ^^^
Puncte:13
drapel jp

Puteți minimiza căutările pentru a câștiga mai multă viteză structurarea arborilor regulile tale. Puteți, de exemplu, să o faceți pe baza primei părți a IP-ului, de exemplu. /8 ca astfel:

iptables -N rule8_192_0_0_0
iptables -N rule8_172_0_0_0
iptables -N regula8_10_0_0_0

iptables -A INPUT -s 192.0.0.0/8 -j rule8_192_0_0_0
iptables -A INPUT -s 172.0.0.0/8 -j rule8_172_0_0_0
iptables -A INPUT -s 10.0.0.0/8 -j rule8_10_0_0_0

iptables -A rule8_192_0_0_0 -s 192.168.2.3 -j DROP
iptables -A rule8_172_0_0_0 -s 172.16.2.3 -j DROP
iptables -A rule8_10_0_0_0 -s 10.10.2.3 -j DROP
Puncte:4
drapel tr

Există o altă îmbunătățire care vă rezolvă în mod direct problema de 3 Mb/s:

iptables -I INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Acest lucru permite conexiunilor stabilite să parcurgă cât mai puține reguli iptables posibil, deși utilizarea ipset pentru a îmbunătăți viteza de căutare a adresei IP este încă necesară pentru conexiuni noi să se stabilească mai repede.

Indiferent câte alte reguli ai, aceasta este una bună de implementat ca primă regulă.

Puncte:1
drapel us

Acest lucru nu folosește iptables, ci tabelul de rutare a nucleului ip, poate merita să îl încercați și să verificați performanța:

ruta ip adaugă gaură neagră IPv4/32

IIRC ar trebui să fie mai rapid decât filtrarea cu iptables, dar nu am făcut niciodată un benchmark cu 1,4 milioane de IP-uri :)

Puncte:1
drapel fr

XDP_DROP este probabil exagerat, cu excepția cazului în care intenționați să rulați aceste liste de blocare la viteze extrem de mari ale pachetelor (Gândiți-vă la >1mpps). Ca atare, aș recomanda răspunsul lui Cyrbil dacă nu aveți atât de experimentat cu codul.

Dacă totuși doriți să încercați cu XDP, căutați ceva numit a filtru de înflorire care poate verifica rapid dacă un ip este „posibil în set” sau „cu siguranță nu este în set”

Un exemplu de filtru de înflorire în C: Această postare pe blog

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.