GNU/Linux >> Znalost Linux >  >> Linux

nastavení sysctl pro vysokou zátěž a zabránění DDoS

Úvod

Na internetu existuje několik různých příkladů konfigurací linuxového jádra, které podporují velké množství připojení, silně zatížené webové projekty a bojují proti DDoS útokům. Zde je další příklad, který jsem si již mohl vyzkoušet v praxi. Hned řeknu – víc než mi to pomohlo. Zkuste to i vy.

Možnosti /etc/sysctl.conf

Existuje seznam možností, které je třeba přidat do /etc/sysctl.conf :

net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.tcp_max_orphans = 65536
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_mem = 50576   64768   98152
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_orphan_retries = 0
net.ipv4.tcp_syncookies = 0
net.ipv4.netfilter.ip_conntrack_max = 16777216
net.netfilter.nf_conntrack_max = 16777216
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_sack = 1
net.ipv4.tcp_congestion_control = htcp
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.route.flush = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.lo.rp_filter = 1
net.ipv4.conf.eth0.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.lo.accept_source_route = 0
net.ipv4.conf.eth0.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rfc1337 = 1
net.ipv4.ip_forward = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_echo_ignore_all = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 1000
net.core.rmem_default = 65536
net.core.wmem_default = 65536
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
fs.inotify.max_user_watches = 16777216

A nyní o každé možnosti podrobněji.

net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.all.send_redirects = 0

Nepřijímejte ani neposílejte pakety přesměrování ICMP. Přesměrování ICMP může útočník použít k úpravě směrovacích tabulek. Je vhodné nastavit jej na „0“. Jednotka má smysl pouze pro hostitele používané jako směrovače.

net.ipv4.tcp_max_orphans = 65536

Celočíselná hodnota parametru tcp_max_orphans určuje maximální počet platných soketů TCP v systému, které nejsou připojeny žádným uživatelským popisovačem souborů. Po dosažení prahové hodnoty se osiřelé sloučeniny okamžitě resetují s varováním. Tento práh pomáhá předcházet pouze jednoduchým útokům DoS. Prahovou hodnotu byste neměli snižovat (spíše ji zvyšujte v souladu s požadavky systému, například po přidání paměti. Každé osiřelé připojení pohltí asi 64 kB nevyměnitelné paměti).

net.ipv4.tcp_fin_timeout

net.ipv4.tcp_fin_timeout = 10

Parametr tcp_fin_timeout určuje čas, kdy soket zůstane ve stavu FIN-WAIT-2 poté, co je uzavřen místní stranou. Partner nemusí toto spojení nikdy ukončit, takže byste ho měli po určité době ukončit z vlastní iniciativy. Ve výchozím nastavení je časový limit 60 sekund. V jádrech řady 2.2 se obvykle používala hodnota 180 sekund a tuto hodnotu si můžete uložit, ale neměli byste zapomínat, že na zatížených WEB serverech riskujete, že spotřebujete spoustu paměti, abyste ušetřili napůl přerušená mrtvá spojení. Sokety ve stavu FIN-WAIT-2 jsou méně nebezpečné než FIN-WAIT-1, protože neabsorbují více než 1,5 kB paměti, ale mohou vydržet déle.

doba udržování tcp

net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_keepalive_probes = 5

tcp_keepalive_time Proměnná určuje, jak často se má spojení kontrolovat, pokud nebylo delší dobu používáno. Hodnota proměnné má smysl pouze pro ty sokety, které byly vytvořeny s příznakem SO_KEEPALIVE. Celočíselná proměnná tcp_keepalive_intvl definuje interval vzorkování. Produkt tcp_keepalive_probes * tcp_keepalive_intvl určuje dobu, po které bude spojení přerušeno, pokud nedojde k žádné odpovědi. Ve výchozím nastavení je interval 75 sekund, tj. doba odpojení v případě nepřítomnosti odpovědí bude přibližně 11 minut.

net.ipv4.tcp_max_syn_backlog = 4096

Hodnota celého čísla v souboru tcp_max_syn_backlog definuje maximální počet zapamatovaných požadavků na připojení, pro které nebylo přijato žádné potvrzení od připojujícího se klienta. Pokud dojde k přetížení serveru, můžete zkusit tuto hodnotu zvýšit.

net.ipv4.tcp_synack_retries = 1

Hodnota celého čísla (1 bajt) tcp_synack_retries určuje počet opakovaných pokusů o přenos paketů SYNACK pro pasivní připojení TCP. Počet pokusů by neměl překročit 255. Hodnota 5 odpovídá přibližně 180 sekundám pro pokus o navázání spojení.

net.ipv4.tcp_mem

net.ipv4.tcp_mem = 50576   64768   98152

Proměnná vector (minimum, režim zatížení, maximum) v souboru tcp_mem obsahuje obecná nastavení spotřeby paměti pro protokol TCP. Tato proměnná se měří ve stránkách (obvykle 4 kB), nikoli v bajtech.

Minimální :zatímco celková velikost paměti pro struktury protokolu TCP je menší než tento počet stránek, operační systém nedělá nic.

Režim načítání :jakmile počet paměťových stránek přidělených pro protokol TCP dosáhne této hodnoty, aktivuje se režim zatížení, ve kterém se operační systém snaží omezit alokaci paměti. Tento režim je zachován, dokud spotřeba paměti opět nedosáhne minimální úrovně.

Maximální :Maximální počet stránek paměti povolený pro všechny sokety TCP.

net.ipv4.tcp_rmem

net.ipv4.tcp_rmem = 4096 87380 16777216

Proměnná vector (minimum, default, maximum) v souboru tcp_rmem obsahuje 3 celá čísla, která určují velikost vyrovnávací paměti pro příjem TCP socketu.

Minimální :každý TCP socket má právo používat tuto paměť při svém vytvoření. Možnost použití takové vyrovnávací paměti je zaručena i při dosažení prahu limitu (střední tlak paměti). Výchozí minimální velikost vyrovnávací paměti je 8 kB (8192).

Výchozí hodnota :Množství paměti povolené pro výchozí vyrovnávací paměť pro přenos soketu TCP. Tato hodnota se používá místo parametru /proc/sys/net/core/rmem_default používaného jinými protokoly. Výchozí hodnota vyrovnávací paměti (obvykle) je 87830 bajtů. To určuje velikost okna 65535 s výchozí hodnotou tcp_adv_win_scale a tcp_app_win =0, o něco menší než výchozí hodnota tcp_app_win.

Maximální :Maximální velikost vyrovnávací paměti může být automaticky přidělena pro příjem TCP soketu. Tato hodnota nezruší maximum uvedené v souboru /proc/sys/net/core/rmem_max. Při „statické“ alokaci paměti pomocí SO_RCVBUF na tomto parametru nezáleží.

net.ipv4.tcp_wmem

net.ipv4.tcp_wmem = 4096 65536 16777216

Proměnná vector v souboru tcp_wmem obsahuje 3 celočíselné hodnoty, které definují minimální, výchozí a maximální množství paměti vyhrazené pro přenosové vyrovnávací paměti TCP soketu.

Minimální :každý TCP socket má právo používat tuto paměť při svém vytvoření. Výchozí minimální velikost vyrovnávací paměti je 4 KB (4096)

Výchozí hodnota :Množství paměti povolené pro výchozí vyrovnávací paměť pro přenos soketu TCP. Tato hodnota se používá místo parametru /proc/sys/net/core/wmem_default používaného jinými protokoly a je obvykle menší než /proc/sys/net/core/wmem_default. Velikost výchozí vyrovnávací paměti je obvykle (výchozí) 16 kB (16384).

Maximální :Maximální množství paměti, která může být automaticky přidělena pro přenosovou vyrovnávací paměť soketu TCP. Tato hodnota nepřepisuje maximum zadané v souboru /proc/sys/net/core/wmem_max. Při „statické“ alokaci paměti pomocí SO_SNDBUF na tomto parametru nezáleží.

net.ipv4.tcp_orphan_retries =0

Celočíselná hodnota tcp_orphan_retries určuje počet neúspěšných pokusů, po kterých je TCP spojení uzavřené na lokální straně zničeno. Výchozí hodnota je 7, což odpovídá přibližně době 50 sekund až 16 minut v závislosti na RTO. Na silně zatížených WEB serverech má smysl snížit hodnotu tohoto parametru, protože uzavřená připojení mohou spotřebovat spoustu zdrojů.

net.ipv4.tcp_syncookies =0

V souvislosti s doporučením vývojářů jádra je lepší tuto možnost zakázat.

net.ipv4.netfilter.ip_conntrack_max =16777216

Maximální počet připojení pro fungování mechanismu sledování připojení (používá se například iptables). Pokud jsou hodnoty příliš malé, jádro začne odmítat příchozí spojení s odpovídající položkou v systémovém protokolu.

net.ipv4.tcp_timestamps =1

Umožňuje časová razítka TCP. Jejich přítomnost vám umožňuje řídit provoz protokolu při velkém zatížení (viz tcp_congestion_control).

net.ipv4.tcp_sack = 1

Povolit selektivní potvrzení podpory TCPIP. Tato možnost je nezbytná pro efektivní využití veškeré dostupné šířky pásma některých sítí.

net.ipv4.tcp_congestion_control = htcp

Protokol, používaný pro řízení zátěže v sítích TCP. Výchozí implementace bic a kubických jednotek obsahují chyby ve většině verzí jádra RedHat a jeho klonů. Doporučuje se používat htcp.

net.ipv4.tcp_no_metrics_save = 1

Neukládejte měření TCP spojení do mezipaměti, když je zavřená. V některých případech pomáhá zvýšit produktivitu.

Ochrana před falšováním IP adresy

net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.lo.rp_filter = 1
net.ipv4.conf.eth0.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

Zakázat směrování zdroje

net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.lo.accept_source_route = 0
net.ipv4.conf.eth0.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0

net.ipv4.ip_local_port_range

net.ipv4.ip_local_port_range = 1024 65535

Zvyšte rozsah místních portů dostupných pro odchozí připojení.

net.ipv4.tcp_tw_reuse = 1

Povolujeme opětovné použití soketů TIME-WAIT v případech, kdy to protokol považuje za bezpečné.

net.ipv4.tcp_window_scaling = 1

Povolit dynamickou změnu velikosti okna zásobníku TCP.

net.ipv4.tcp_rfc1337 = 1

Obrana před TIME_WAIT útokem.

net.ipv4.ip_forward = 0

Zakazujeme předávání paketů, protože nejsme router.

net.ipv4.icmp_echo_ignore_broadcasts = 1

Neodpovídáme na požadavky ICMP ECHO přenášené vysílanými pakety.

net.ipv4.icmp_echo_ignore_all = 1

Na požadavky ICMP ECHO nemůžete vůbec reagovat (server nebude pingovat).

net.ipv4.icmp_ignore_bogus_error_responses = 1

Na chybně vytvořené zprávy neodpovídáme.

net.core.somaxconn = 65535

Maximální počet otevřených zásuvek čekajících na připojení. Má smysl zvýšit výchozí hodnotu.

net.core.netdev_max_backlog = 1000

Parametr určuje maximální počet paketů ve frontě zpracování, pokud rozhraní přijímá pakety rychleji, než je jádro dokáže zpracovat.

Výchozí maximální paměť

net.core.rmem_default = 65536

Výchozí velikost vyrovnávací paměti pro příjem dat pro všechna připojení.

net.core.wmem_default = 65536

Výchozí velikost vyrovnávací paměti přenosu dat pro všechna připojení.

net.core.rmem_max = 16777216

Maximální velikost vyrovnávací paměti pro příjem dat pro všechna připojení.

net.core.wmem_max = 16777216

Maximální velikost vyrovnávací paměti dat pro všechna připojení.


Linux
  1. Bash pro průvodce smyčkou a příklady

  2. Analýza případů pro a proti nastavení odkládacího prostoru na cloudových instancích

  3. Napište pro Atlantic.Net FAQ

  1. Nainstalujte služby licencování na cloudové servery pro Windows 2008 a Windows 2008 R2, abyste předešli chybě licencování

  2. Nastavte SFTP a Zabraňte SSH na Ubuntu 20.04

  3. Příklady Bash for Loop a While Loop

  1. Pokyny pro použití a zátěžové testy

  2. Obnovte net.core.somaxcomm (nebo jakoukoli vlastnost sysctl) pro kontejnery dokovacích stanic

  3. Linuxové přemostění pro KVM