Jump to content
aelius

Discutie legata de atacurile dos/ddos, efectele sale si metode de filtrare

Recommended Posts

Posted (edited)

La un tutorial ASM facut de @c0unt3rlog1c despre un udp flooder au fost ceva intrebari puse de @Zatarra; Pentru a nu altera threadul omului, am deschis discutia asta. Sunt sigur ca sunt multi care au astfel de intrebari.

Va astept aici cu orice intrebare legata de atacurile (D)DoS, efectele acestora cat si metodele de inlaturare ale efectelor.

Din exemplul meu din acel thread:


21:07:38.225850 IP 172.16.0.4.37438 > 172.16.0.3.80: UDP, length 1
21:07:38.225855 IP 172.16.0.4.37438 > 172.16.0.3.80: UDP, length 1
21:07:38.225857 IP 172.16.0.4.37438 > 172.16.0.3.80: UDP, length 1
21:07:38.225867 IP 172.16.0.4.37438 > 172.16.0.3.80: UDP, length 1
21:07:38.225869 IP 172.16.0.4.37438 > 172.16.0.3.80: UDP, length 1
21:07:38.225994 IP 172.16.0.4.37438 > 172.16.0.3.80: UDP, length 1
21:07:38.225996 IP 172.16.0.4.37438 > 172.16.0.3.80: UDP, length 1
21:07:38.225998 IP 172.16.0.4.37438 > 172.16.0.3.80: UDP, length 1
21:07:38.225999 IP 172.16.0.4.37438 > 172.16.0.3.80: UDP, length 1

Se pot observa urmatoarele caracteristici ale acestui atac (profilul):

- Srcaddr este static (172.16.0.4)

- Srcport este static (37438)

- Dstport este static (80) ; Avand port 80, tinta atacului este serviciul web.

- Lungimea pachetului nu este variabila (length 1)

- Atacul este de tip UDP / Non spoofed.

Nota: Atacurile udp vizeaza congestia conexiunii. Este un atack ce 'consuma' latimea de banda. Deci, chiar daca filtrati atacul (caz in care pachetele nu mai sunt procesate), latimea de banda o sa fie utilizata.

O sa luam intrebarile puse in threadul celalalt (le folosim ca scenarii):

@tex - length 1 e usor de filtrat, cum pot filtra cele cu length variabil?
Cand ai surse multiple? Ce faci? sa zicem ca fac parte din clase B diferite..

- Solutia in ambele scenarii, avand in vedere exemplul de atac de mai sus este filtrarea pachetelor UDP ce au ca tinta portul 80. Acesta fiind folosit de HTTP, comunicarea client->server se face doar pe TCP.

Edited by aelius
  • Upvote 1
Posted (edited)

Eu am mai adoptat acest firewall mai de baza asa, nu neaaparat anti ddos, nu stiu cat de bun este dar pe mine m-a multumit.

Am incercat sa il si comentez cat de mult am putut, tex ne poate lamurii mult mai bine si ne poate da detaliile necesare.

# Instalare script Firewall
#functie de sistem poate fi adaugat in startarea sistemului pt fedora adaugat in rc.local calea catre script
#pt gentoo de copiat in /etc/init.d/ dupa care de executat comanda rc-update -a firewall default
#
#Mai trebuie sa editati variabilele functie de sistemul dvs

# Declarare variabile firewall

INTERNET="eth0" # interfata pe care se aplica regulile de firewall
SERVICII="25 8000 http https 808 53 110 123 465 995 143 993 587 465" # servicii (porturi) care pot fi accesate din internet
SERVICII1="25 110 53 123" # servicii (porturi) care pot fi accesate din internet
SERVICII2="10000 ftp echo 1313 8080" # servicii (porturi) care pot fi accesate din internet pt adminn
ADMIN2="89.101.153.254" #Admin home acces la porturile suplimentare pt admin
#Initializare firewall cu "start" ex:"/etc/init/d/firewall start" si stabilirea regulilor folosind variabilele

if [ "$1" = "start" ]; then
echo "Porneste firewall"

iptables -P INPUT DROP # blocheaza tot
iptables -A INPUT -i ! ${INTERNET} -j ACCEPT # permite pachetelor de pe toate interfetele in afara de interfata cu internetul ( reteaua locala, loopback )
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # permite pachetele din conexiuni deja stabilite

# accepta conexiuni noi pe porturile din $SERVICII
for i in ${SERVICII}; do
iptables -A INPUT -p tcp --dport ${i} -m state --state NEW -j ACCEPT
done


for i in ${SERVICII1}; do
iptables -A INPUT -p udp --dport ${i} -m state --state NEW -j ACCEPT
done

# accepta conexiuni noi pe porturile din $SERVICII2
for i in ${SERVICII2}; do

iptables -A INPUT -s ${ADMIN2} -p tcp --dport ${i} -m state --state NEW -j ACCEPT
done


# NAT, daca nu aveti nevoie, stergeti sau o comentati linia cu "#"
# iptables -t nat -A POSTROUTING -o ${INTERNET} -j MASQUERADE

fi # end if start

#Oprire firewall cu "stop" ex:"/etc/init/d/firewall stop" si stergerea tabelelor iptables
if [ "$1" = "stop" ]; then
echo "Se opreste firewall"

iptables -F INPUT
iptables -P INPUT ACCEPT

# opreste NAT, daca nu aveti nevoie, stergeti sau o comentati linia cu "#"
#iptables -t nat -F POSTROUTING

fi # end if stop

#Restartare cu "restart" ex:"/etc/init/d/firewall stop" in cazul in care ati facut modificari in firewall si doriti sa le activati

if [ "$1" = "restart" ]; then
echo "Se restarteaza firewall"

/etc/init.d/firewall stop #dupa caz modificati calea catre scriptul firewall

/etc/init.d/firewall start #dupa caz modificati calea catre scriptul firewall

fi # end if restart

Edited by ilbr22
Posted

@tex. Si daca tinta nu este portul 80 si este oricare alt port random? Hai sa presupunem ca fac streaming sau am o aplicatie care utilizeaza UDP. Ce fac in acel caz?

Ma intereseaza o metoda automata de filtrare/excludere pentru astfel de atacuri. (Poti da exemplu singular si ma gandesc eu la o automatizare)

Posted

@ilbr22:

Scriptul prezentat de tine are urmatoarele lipsuri sau chestii gandite prost:

- La servicii, este specificat portul 143 ; Acest port este pentru IMAP si nu vad de ce ai avea nevoie sa-l accesezi din extern. Imap-ul il poti folosi pe localhost doar, pentru webmail iar clientii se conecteaza la pop 3 (110); Aici mai este de comentat in privinta celorlalte porturi.

- Am observat ca ai folosit default policy DROP insa la acceptarea pachetelor ai "-m state --state NEW". Orice pachet syn este cu STATE NEW si apoi va fi "RELATED", asa cum spune regula de mai sus. Deci, poate inghite pachete syn pana la epuizarea resurselor.

Aici ai asa:


SERVICII1="25 110 53 123"
for i in ${SERVICII1}; do
iptables -A INPUT -p udp --dport ${i} -m state --state NEW -j ACCEPT
done

- port 123 este NTP (network time protocol). Banuiesc ca nu ai server de timp setat pe server, asadar, portul UDP 123 trebuie acceptat ca srcport (Exemplu accept pachetele UDP de la orice sursa cu sursa port 123) "--sport 123"

- porturile 25 si 110 (smtp + pop3) nu au nevoie de UDP.

- udp este stateless, nu vad de ce ai seta "-m state" (match state)

- nu vad nimic acceptat cu sport 53 (serverul nu iti va rezolva niciun host)

@Zatarra: O sa raspund tot astazi la post pentru intrebarea ta; O sa-ti dau mai multe solutii

Posted (edited)

Pentru @Zatarra:

Pentru filtrarea atacurilor, daca nu exista un echipament specializat, as recomanda un server cu FreeBSD pus inainte de serverul cu servicii. (sau chiar serverul cu servicii sa fie FreeBSD) Pe el poti face urmatoarele: (cu pachet filter)

- definirea unui numar maxim de conexiuni de la o sursa catre destinatie cat si catre un serviciu explicit.

- definirea unui numar maxim de conectiuni pe secunda de la o sursa catre destinatie cat si catre un serviciu explicit

- definirea de liste de acces (ACL) cat si masura luata pentru primele doua cazuri (exemplu: blocarea surselor pentru un anumit timp, limitarea conexiunilor, blocarea aleatoare a pachetelor pana la un anumit procent)

- definirea numarului maxim de conexiuni acceptate pe un serviciu. Exemplu: putem defini cu pf un numar maxim de 3000 'tcp states' catre web, astfel incat, daca avem un atac de mare intensitate, singurul serviciu nefunctional va fi web-ul, nu tot serverul sau toate aplicatiile (evitarea epuizarii socketilor disponibili)

Edited by aelius
Posted

Bun dar cu bandwidth-ul cum ramane? Cu echipament fizic se poate filtra ceva? Eu banuiesc ca tot ai nevoie de 2 provideri ca sa poti face BGP si sa ai cat de cat backup.

Apropo, pe FreeBSD aveti net filter? Deoarece net filter avem si noi pe AIX deci ar fii aceeasi chestie

Posted
Bun dar cu bandwidth-ul cum ramane? Cu echipament fizic se poate filtra ceva? Eu banuiesc ca tot ai nevoie de 2 provideri ca sa poti face BGP si sa ai cat de cat backup.

Apropo, pe FreeBSD aveti net filter? Deoarece net filter avem si noi pe AIX deci ar fii aceeasi chestie

Sigur, FreeBSD are atat netfilter cat si packet filter.

In legatura cu prima intrebare legata de bandwidth: Nu exista protectie DDoS, toate sistemele si echipamentele folosite pentru filtrare, nu fac altceva decat sa inlature efectele atacurilor (sa permita utilizatorilor legiti sa acceseze un serviciu). Deci, chiar daca un atac dos sau ddos este filtrat de catre voi (endpoint), latimea de banda va fi utilizata.

Singurul lucru ce il face un filtru:

- Daca este in routing, nu permite trecerea traficului catre client/server servicii.

- Daca este pe serverul ce ruleaza serviciile, face ca pachetele sa fie ignorate (cele cu reguli de filtrare sau nullroute)

In legatura cu BGP-ul: Daca ai numar AS (Autonomous System) se intelege ca poti face routari dinamice utilizand BGP. Acolo ai mai multe metode de a filtra un atac dos/ddos (ex: comunitati bgp, blackholing, etc ..)

Se pot vedea si aici cateva chestii:

- https://rstcenter.com/forum/46523-nullrouting.rst

- https://www.rtfm.ro/ddos/tipuri-de-atacuri-denial-of-service/

Posted
Pentru filtrarea atacurilor, daca nu exista un echipament specializat, as recomanda un server cu FreeBSD pus inainte de serverul cu servicii.

Dar in cazul in care ddosul este foarte puternic si mananca toate resursele primului server, acesta poate ajunge la tine si sa iti afecteze direct serverul principal ?

Posted
Dar in cazul in care ddosul este foarte puternic si mananca toate resursele primului server, acesta poate ajunge la tine si sa iti afecteze direct serverul principal ?

Iti va epuiza latimea de banda inainte de asta. Daca resursele primului server sunt epuizate, nu va mai trece deloc trafic catre serverul cu serviciile.

Cum am spus, nu exista o solutie completa si perfecta pentru protectie. Un server decent cu FreeBSD iti duce undeva la 500.000 de pachete pe secunda.

Uite un log de pe un server. Sunt + 400kpps; Atacul era UDP de la surse multiple.


Feb 23 02:48:59 hp glflow: DOS ATTACK: – 450152.33 packets/s
Feb 23 02:49:05 hp glflow: DOS ATTACK: – 429905.50 packets/s
Feb 23 02:49:17 hp glflow: DOS ATTACK: – 433208.17 packets/s
Feb 23 02:49:23 hp glflow: DOS ATTACK: – 412169.50 packets/s
Feb 23 02:49:28 hp glflow: DOS ATTACK: – 457770.83 packets/s
Feb 23 02:49:35 hp glflow: DOS ATTACK: – 440214.50 packets/s

In momentul atacului de mai sus, serverul se comporta ok.

Posted

O solutie ar fi sa ai mai multe FreeBSD-uri inaintea serverului tau, in asa fel incat atacatorul sa nu le poata atinge pe toate, iar domeniul sa fie pe toate ip-urile, un fel de dns pool ?

Posted (edited)
O solutie ar fi sa ai mai multe FreeBSD-uri inaintea serverului tau, in asa fel incat atacatorul sa nu le poata atinge pe toate, iar domeniul sa fie pe toate ip-urile, un fel de dns pool ?

Daca este cu adrese ip diferite, le ataca independent. Solutia la ideea ta ar fi in felul asta:

1. Pachetele merg in router.

2. Din router se face multipath routing catre serverele cu FreeBSD care au ip-uri private (elimini posibilitatea de a fi atacate independent)

3. Se face filtering pe cele 3-4-5 servere cu FreeBSD.

4. Traficul se intoarce catre router.

5. Traficul intors din sistemele FreeBSD, este routat catre adresa ip a clientului/serverului.

PS: Prezenta routerului sa stie de multipath, load balancing, policy routing & more, intra deja la echipamente specializate. Costul acestora sunt cu 4-5 zero-uri in euro si decat sa faci asta, te costa mai putin sa cumperi direct un o scula hardware care sa filtreze. (Costurile sunt enorme in ambele cazuri)

Edited by aelius
Posted (edited)

Acum de exemplu primesc urmatorul ddos, e un request http ..

127.0.0.1 - - [14/Sep/2012:15:33:43 +0400] "HEAD /computeractive/ HTTP/1.0" 404 - "-" "UNSOFT (http://H/index.php/Category:OWASP_********$
127.0.0.1 - - [14/Sep/2012:15:33:43 +0400] "HEAD /egov_idcard_costing/ HTTP/1.0" 404 - "-" "UNSOFT (http://********/index.php/Category:OWASP_Dir$
127.0.0.1 - - [14/Sep/2012:15:33:43 +0400] "HEAD /ms2005_launch/ HTTP/1.0" 404 - "-" "UNSOFT (http://********/index.php/Category:OWASP_********r$
127.0.0.1 - - [14/Sep/2012:15:33:43 +0400] "HEAD /personal-computer-world/ HTTP/1.0" 404 - "-" "UNSOFT (http://********/index.php/Category:OWASP$
127.0.0.1 - - [14/Sep/2012:15:33:43 +0400] "HEAD /screendigest_movie_downloads/ HTTP/1.0" 404 - "-" "UNSOFT (http://********/index.php/Category:$
127.0.0.1 - - [14/Sep/2012:15:33:43 +0400] "HEAD /2145654/ HTTP/1.0" 404 - "-" "UNSOFT (http://********/index.php/Category:OWASP_********r_Proje$
127.0.0.1 - - [14/Sep/2012:15:33:43 +0400] "HEAD /xmax/ HTTP/1.0" 404 - "-" "UNSOFT (http://********/index.php/Category:OWASP_********r_Project)"
127.0.0.1 - - [14/Sep/2012:15:33:43 +0400] "HEAD /buyersguides/ HTTP/1.0" 404 - "-" "UNSOFT (http://********/index.php/Category:OWASP_********r_$
127.0.0.1 - - [14/Sep/2012:15:33:43 +0400] "HEAD /jobalerts/ HTTP/1.0" 404 - "-" "UNSOFT (http://********/index.php/Category:OWASP_********r_Pro$
127.0.0.1 - - [14/Sep/2012:15:33:43 +0400] "HEAD /review_sonyericsson_w550i/ HTTP/1.0" 404 - "-" "UNSOFT (http://********/index.php/Category:OWA$
127.0.0.1 - - [14/Sep/2012:15:33:43 +0400] "HEAD /wlr_ofcom/ HTTP/1.0" 404 - "-" "UNSOFT (http://********/index.php/Category:OWASP_********r_Pro$
127.0.0.1 - - [14/Sep/2012:15:33:43 +0400] "HEAD /lichens_space_mars/ HTTP/1.0" 404 - "-" "UNSOFT (http://********/index.php/Category:OWASP_DirB$
127.0.0.1 - - [14/Sep/2012:15:33:43 +0400] "HEAD /automatic_graylisting/ HTTP/1.0" 404 - "-" "UNSOFT (http://********/index.php/Category:OWASP_D$
127.0.0.1 - - [14/Sep/2012:15:33:43 +0400] "HEAD /gripe_site/ HTTP/1.0" 404 - "-" "UNSOFT (http://********/index.php/Category:OWASP_********r_Pr$
127.0.0.1 - - [14/Sep/2012:15:33:43 +0400] "HEAD /baron_bofh_banged_up/ HTTP/1.0" 404 - "-" "UNSOFT (http://********/index.php/Category:OWASP_Di$
127.0.0.1 - - [14/Sep/2012:15:33:43 +0400] "HEAD /thatcher_bequest/ HTTP/1.0" 404 - "-" "UNSOFT ([url]http://********/index.php/Category:OWASP_DirBu[/url]

Am blurat "UNSOFT" si ***** ca sa nu dau idei altor persoane. Se pare ce incearca de pe foarte multe ip-uri foarte multe foldere pe site, acesta fiind un soft free pe care il gasim pe net. Practic ce am blurat este semnatura softului care face requesturile.

Tin sa precizez tex, ca trece de cloudflare.

Edited by ilbr22
Posted (edited)

Instaleaza mod_rpaf pe apache pentru a vedea adresele ip reale ale utilizatorilor (ai frontend+backend).

Poti bloca ce e mai sus foarte simplu:


iptables -I INPUT -p tcp --dport 80 -m string --string "UNSOFT" --algo bm -j REJECT --reject-with tcp-reset

Sau daca vrei sa blochezi adresele ip (instaleaza rpaf inainte, sa-ti afiseze corect adresele ip in loc de 127.0.0.1):


for i in `grep UNSOFT /calea/catre/apache.log |awk '{print $1}'` ; do iptables -I INPUT -p tcp -s $i --dport 80 -j DROP;done

Sau, daca tot ai nginx in fata apache-ului, poti redirecta ce e 404 catre google.com; Nu o sa iti mai ajunga requesturile in apache si nu va mai consuma resurse.

Pentru mitigarea atacurilor dos/ddos HTTP recomand varnish.

Utile:

- https://www.rtfm.ro/tuning/avantajele-folosirii-arhitecturilor-web-dual-strat/

- https://www.varnish-cache.org

Edited by aelius
Posted (edited)
@tex: cum s-ar putea implementa urmatoarea schema:

request IN (http://site.ro/page/) -> check (cu un bash faci grep la request-ul GET, extragi doar /page/, verifici daca exista /var/www/page/) -> exista /page/ ? -> da: allow -> nu: nullroute

E o vorba buna: "Do not try to invent your own internet". Un 404 poate aparea oricand in site in urma unui link incorect sau chiar a faviconului lipsa.

//edit: @ibr22: Problema cu 404 nu ar intra in aceasta sectiune, ci intr-o discutie legata de servere web sau special pentru nginx.

Este abordata gresit chestia cu proxy_pass ; Nu dorim ca requesturile sa se faca in continuare prin serverul nostru. As opta pentru rewrite.


error_page 404 /404.html;
location = /404.html {
rewrite . http://www.google.com/ last;
}

Edited by aelius
Posted (edited)

Cam cum ar arata un 404 in nginx ?

server {
listen 80;
error_page 404 = http://www.google.de;
}

Sau sa adopt a doua varianta cu:

server {
location / {
error_page 404 = @try_server2;
}
location @try_server2 {
proxy_pass http://www.google.de;
}

Care ar fi cea mai buna solutie de filtrare?

============================================

Edit:

Cum pot fixa ?

iptables -I INPUT -p tcp --dport 80 -m string --string "29602" --algo bm -j REJECT --reject-with tcp-reset
iptables: No chain/target/match by that name.

Se pare ca a schimbat si metoda de flood:

173.245.53.136 - - [24/Sep/2012:23:54:32 +0400] "GET / HTTP/1.0" 200 29602 "-" "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US)"
173.245.53.136 - - [24/Sep/2012:23:54:32 +0400] "GET / HTTP/1.0" 200 29602 "-" "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US)"
173.245.53.136 - - [24/Sep/2012:23:54:32 +0400] "GET / HTTP/1.0" 200 17169 "-" "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US)"
173.245.53.136 - - [24/Sep/2012:23:54:32 +0400] "GET / HTTP/1.0" 200 29602 "-" "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US)"
173.245.53.72 - - [24/Sep/2012:23:54:32 +0400] "GET / HTTP/1.0" 200 29602 "-" "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US)"
173.245.53.119 - - [24/Sep/2012:23:54:32 +0400] "GET / HTTP/1.0" 200 29602 "-" "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US)"
173.245.53.136 - - [24/Sep/2012:23:54:32 +0400] "GET / HTTP/1.0" 200 29602 "-" "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US)"

Edited by ilbr22
Posted
Cam cum ar arata un 404 in nginx ?

server {
listen 80;
error_page 404 = http://www.google.de;
}

Sau sa adopt a doua varianta cu:

server {
location / {
error_page 404 = @try_server2;
}
location @try_server2 {
proxy_pass http://www.google.de;
}

Care ar fi cea mai buna solutie de filtrare?

============================================

Edit:

Cum pot fixa ?

iptables -I INPUT -p tcp --dport 80 -m string --string "29602" --algo bm -j REJECT --reject-with tcp-reset
iptables: No chain/target/match by that name.

Se pare ca a schimbat si metoda de flood:

173.245.53.136 - - [24/Sep/2012:23:54:32 +0400] "GET / HTTP/1.0" 200 29602 "-" "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US)"
173.245.53.136 - - [24/Sep/2012:23:54:32 +0400] "GET / HTTP/1.0" 200 29602 "-" "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US)"
173.245.53.136 - - [24/Sep/2012:23:54:32 +0400] "GET / HTTP/1.0" 200 17169 "-" "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US)"
173.245.53.136 - - [24/Sep/2012:23:54:32 +0400] "GET / HTTP/1.0" 200 29602 "-" "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US)"
173.245.53.72 - - [24/Sep/2012:23:54:32 +0400] "GET / HTTP/1.0" 200 29602 "-" "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US)"
173.245.53.119 - - [24/Sep/2012:23:54:32 +0400] "GET / HTTP/1.0" 200 29602 "-" "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US)"
173.245.53.136 - - [24/Sep/2012:23:54:32 +0400] "GET / HTTP/1.0" 200 29602 "-" "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US)"

Fix la comanda iptables de acolo ar fi asa :

iptables -t filter -I INPUT -p tcp --dport 80 -m string --string "29602" --algo bm -j REJECT --reject-with tcp-reset

Posted (edited)
Fix la comanda iptables de acolo ar fi asa :

iptables -t filter -I INPUT -p tcp --dport 80 -m string --string "29602" --algo bm -j REJECT --reject-with tcp-reset

Nu nu :) 29602 este size (Length) si este prezent in pachetul tcp sub alta forma (daca faci debug cu tcpdump se vede)


# du -csh testing.300mb.txt
301M testing.300mb.txt
301M total

--------------------------------
Log-ul de la wget:
[25/Sep/2012:21:00:51 +0200] "GET /testing.300mb.txt HTTP/1.0" 200 314573125 "-" "Wget/1.13.4 (freebsd8.2)"

Se vede acolo 314573125 ?

saturn ~ # echo 314573125/1024/1024|bc
300 => dimensiunea fisierului

PS: "-t filter" se specifica degeaba in iptables. INPUT, OUTPUT si FORWARD sunt default in filter (sunt chain-uri de filtrare, nu de marcare)

@ilbr22: nu iti merg reguli cu string pentru ca nu ai suport iptables pe acel vps. Ia verifica daca ai asa ceva:


saturn ~ # find /lib/modules/`uname -r` -name xt_string.ko
/lib/modules/2.6.32.15-1-grsec/kernel/net/netfilter/xt_string.ko

Edited by aelius
Posted

@ilbr22: nu iti merg reguli cu string pentru ca nu ai suport iptables pe acel vps. Ia verifica daca ai asa ceva:


saturn ~ # find /lib/modules/`uname -r` -name xt_string.ko
/lib/modules/2.6.32.15-1-grsec/kernel/net/netfilter/xt_string.ko

Nu am asa ceva.

In schimb am scapat de modul proxy cu apache. M-am chinuit 2 zile si am instalat intr-un final nginx cu fastphp si fast cgi, se simte, e alta diferenta.

Intrebarea mea ar fi urmatoarea se poate instala xt_string.ko pe vps-ul meu ? sau ii pot face ceva ca functia iptables sa functioneze conform cerintelor

Si as mai avea o rugaminte, legat de firewall-ul care l-am postat in primul post, imi poti da mura-n gura cu adaptarile necesare la ceea ce am eu acum si cu o explicate mai pentru prosti sa pot intelege si eu ?

Astea ar fi porturile.

22/tcp   open  ssh
25/tcp open smtp
80/tcp open http
587/tcp open submission
3306/tcp open mysql
9000/tcp open cslistener

9000 este de la fastphp/fast cgi

587 habar nu am ce este, asa a venit os-ul cu el.

Si daca se poate orice pachete udp/syn sa nu fie acceptate.

Multumesc mult tex pentru timpul acordat.

Posted

Salut,

22 (ssh) il poti accepta doar de la surse bine stabilite (ex: home, work) si apoi faci DROP pe restul.

25 este smtp, daca nu ai server de email pe server, il poti bloca la INPUT; Email-urile de confirmare de la site-uri se trimit si asa.

585 este smtp submission, nu ai nevoie de el

3306 este mysql, nu ai nevoie de el decat pe localhost, poti seta in my.cnf sa faca bind doar pe 127.0.0.1

9000 (php-fpm sau fastcgi) trebuie listat doar pe localhost, nu pe ip-ul public.

Deci iti ramane doar 80 open.

In legatura cu iptables-ul, nu stiu daca iti permite vps-ul asta (banuiesc ca e openvz). Ar trebui sa recompilezi iptables (iti trebuie si sursele kernelului)

Posted

pentru nginx incearca astea

limit_conn_zone $binary_remote_addr zone=connlimit:10m;

limit_conn connlimit 5;

limit_req_zone $binary_remote_addr zone=ratelimit:10m rate=30r/s;

limit_req zone=ratelimit burst=45 nodelay;

Posted (edited)
Salut,

22 (ssh) il poti accepta doar de la surse bine stabilite (ex: home, work) si apoi faci DROP pe restul.

25 este smtp, daca nu ai server de email pe server, il poti bloca la INPUT; Email-urile de confirmare de la site-uri se trimit si asa.

585 este smtp submission, nu ai nevoie de el

3306 este mysql, nu ai nevoie de el decat pe localhost, poti seta in my.cnf sa faca bind doar pe 127.0.0.1

9000 (php-fpm sau fastcgi) trebuie listat doar pe localhost, nu pe ip-ul public.

Deci iti ramane doar 80 open.

In legatura cu iptables-ul, nu stiu daca iti permite vps-ul asta (banuiesc ca e openvz). Ar trebui sa recompilezi iptables (iti trebuie si sursele kernelului)

Da este openvz, dupa ce am citit si eu mai mult mi-am ales si vps-u prost... o sa trec pe xen sper ca acolo sa nu mai fiu atat de limitat.

Edit:

pentru nginx incearca astea

limit_conn_zone $binary_remote_addr zone=connlimit:10m;

limit_conn connlimit 5;

limit_req_zone $binary_remote_addr zone=ratelimit:10m rate=30r/s;

limit_req zone=ratelimit burst=45 nodelay;

multumesc.

Edited by ilbr22
Posted

scuze dublu post .

Se da urmatorul log.

2012/09/28 01:04:59 [error] 12869#0: *20862 limiting requests, excess: 20.505 by zone "limitrate", client: 37.45.252.33, server: _, request: "GET / HTTP/1.0", host: "rst.com"

2012/09/28 01:04:59 [error] 12869#0: *20863 limiting requests, excess: 20.770 by zone "limitrate", client: 94.27.67.248, server: _, request: "GET / HTTP/1.0", host: "rst.com"

2012/09/28 01:04:59 [error] 12869#0: *20864 limiting requests, excess: 20.155 by zone "limitrate", client: 37.45.252.33, server: _, request: "GET / HTTP/1.0", host: "rst.com"

2012/09/28 01:04:59 [error] 12869#0: *20865 limiting requests, excess: 20.125 by zone "limitrate", client: 37.45.252.33, server: _, request: "GET / HTTP/1.0", host: "rst.com"

2012/09/28 01:04:59 [error] 12869#0: *20820 limiting connections by zone "perip", client: 37.147.51.182, server: _, request: "GET / HTTP/1.0", host: "rst.com"

2012/09/28 01:04:59 [error] 12869#0: *20866 limiting requests, excess: 20.345 by zone "limitrate", client: 94.27.67.248, server: _, request: "GET /plans.php HTTP/1.0", host: "rst.com"

Cum fac sa banez automat din iptables ip-ul care trece de limitrate sau perip ?

Posted (edited)

Sunt mai multe chestii de care trebuie sa tii cont. Iptables face tracking la pachete si la un moment dat, in functie de valorile care le au net.nf_conntrack_max, net.ipv4.netfilter.ip_conntrack_max - netfilterul incepe sa blocheze pachete pana ce coada (queue) va fi mai mica. Ideal ar fi specificat explicit NOTRACK, insa in acest caz, connlimit si hashlimit nu mai functioneaza. (oricum nu e cazul la tine pt. ca ai openvz)

Cred ca cel mai bine in cazul tau, este sa faci un wrapper (un mic script bash) si sa-l pui in crontab la 1 minut. El va parsa error_log de la nginx, va sorta ip-urile si le va adauga intr-o lista cu drop.

Arunca o privire si aici:

- Fail2Ban

- csf

// edit:

Atunci e simplu:


iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 -j REJECT --reject-with tcp-reset
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 50 --connlimit-mask 24 -j REJECT --reject-with tcp-reset
iptables -A INPUT -p tcp --dport 80 -m hashlimit --hashlimit-upto 50/min --hashlimit-burst 500 --hashlimit-mode srcip --hashlimit-name http -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j DROP

Ar trebui sa nu mai vezi log-urile in nginx, sau sa apara f. rar; Requesturile or sa fie blocate de iptables.

// edit2:

Nu e bun scriptul ala. Poti da flush periodic la log-ul de nginx.

ex:


echo "" > errror.log

Apropo, de ce cauti scripturi pe net si nu inveti mai bine cum functioneaza iptables si sa-ti faci singur un firewall personalizat ? (exact pentru ce ai nevoie). Este foarte simplu iptables si are logica

Edited by aelius
Posted (edited)
Sunt mai multe chestii de care trebuie sa tii cont. Iptables face tracking la pachete si la un moment dat, in functie de valorile care le au net.nf_conntrack_max, net.ipv4.netfilter.ip_conntrack_max - netfilterul incepe sa blocheze pachete pana ce coada (queue) va fi mai mica. Ideal ar fi specificat explicit NOTRACK, insa in acest caz, connlimit si hashlimit nu mai functioneaza. (oricum nu e cazul la tine pt. ca ai openvz)

Cred ca cel mai bine in cazul tau, este sa faci un wrapper (un mic script bash) si sa-l pui in crontab la 1 minut. El va parsa error_log de la nginx, va sorta ip-urile si le va adauga intr-o lista cu drop.

Arunca o privire si aici:

- Fail2Ban

- csf

am uitat sa precizez ca este vorba de un proxy server care este un dedicat, deci pot da orice comanda iptables, am si ufw instalat.

Edit: la script bash adaugat in cron m-am gandit si eu prima oara, dar fiind logul foooarte mare statea o vesnicie sau se bloca sau ... sau .. numa idiotenii, nu mi s-a parut deloc rentabil, probabil fiind putin obosit l-am scris putin anapoda sau nu am abordat foarte bine problema .

Multumesc pentru link-uri ma voi uita sa vad ce pot face.

Sfaturile unui om batran, multumesc ca ti-ai facut timp sa-mi explici anumite lucruri.

Edit2:

Un alt firewall care mi s-a parut bunicel:

IPT="/sbin/iptables"

echo "Starting IPv4 Wall..."
$IPT -F
$IPT -X
$IPT -t nat -F
$IPT -t nat -X
$IPT -t mangle -F
$IPT -t mangle -X
echo "1" > /proc/sys/net/ipv4/tcp_syncookies
echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter
echo "0" > /proc/sys/net/ipv4/conf/all/accept_source_route
echo "1" > /proc/sys/net/ipv4/conf/all/secure_redirects
echo "1" > /proc/sys/net/ipv4/conf/all/log_martians
PUB_IF="eth0"
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT
$IPT -A INPUT -i ${PUB_IF} -p tcp ! --syn -m state --state NEW -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "Drop Syn"
$IPT -A INPUT -i ${PUB_IF} -p tcp ! --syn -m state --state NEW -j DROP
$IPT -A INPUT -p tcp -i venet0 -m state --state NEW -m recent --set
$IPT -A INPUT -p tcp -i venet0 -m state --state NEW -m recent --update --seconds 3 --hitcount 20 -j DROP
$IPT -A FORWARD -p tcp -i venet0 -m state --state NEW -m recent --set
$IPT -A FORWARD -p tcp -i venet0 -m state --state NEW -m recent --update --seconds 3 --hitcount 20 -j DROP
$IPT -A INPUT -i ${PUB_IF} -f -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "Fragments Packets"
$IPT -A INPUT -i ${PUB_IF} -f -j DROP
$IPT -A INPUT -i ${PUB_IF} -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
$IPT -A INPUT -i ${PUB_IF} -p tcp --tcp-flags ALL ALL -j DROP
$IPT -A INPUT -i ${PUB_IF} -p tcp --tcp-flags ALL NONE -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "NULL Packets"
$IPT -A INPUT -i ${PUB_IF} -p tcp --tcp-flags ALL NONE -j DROP # NULL packets
$IPT -A INPUT -i ${PUB_IF} -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
$IPT -A INPUT -i ${PUB_IF} -p tcp --tcp-flags SYN,FIN SYN,FIN -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "XMAS Packets"
$IPT -A INPUT -i ${PUB_IF} -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP #XMAS
$IPT -A INPUT -i ${PUB_IF} -p tcp --tcp-flags FIN,ACK FIN -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "Fin Packets Scan"
$IPT -A INPUT -i ${PUB_IF} -p tcp --tcp-flags FIN,ACK FIN -j DROP # FIN packet scans
$IPT -A INPUT -i ${PUB_IF} -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
$IPT -A INPUT -i venet0 -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A OUTPUT -o venet0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPT -A INPUT -p tcp --destination-port 20000 -j ACCEPT
$IPT -A OUTPUT -p tcp --sport 20000 -j ACCEPT
$IPT -A INPUT -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPT -A OUTPUT -p icmp --icmp-type 0 -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A INPUT -j LOG
$IPT -A FORWARD -j LOG

Ce parere ai ?

Edit3: Asta am incercat sa fac, dar m-a persat foarte mult timpul si nu am avut timp de teste plus ca a fost si problema diferentelor dintre vps si dedicat.

Acum citind manualul mi se pare mult mai usor si incepe sa prinda logica ceea ce vreau sa fac, multumesc inca o data pentru timpul acordat...m-ai scos din cacat. :D

Raman dator.

Ps: O sa incerc sa vin si eu cu detalii in combaterea ddos-ului/flood-ului pentru cei ce au nelamuriri.

Edited by ilbr22

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...