GNU/Linux >> Linux Esercitazione >  >> Linux

Come utilizzare iptables o tc per limitare i pacchetti per client.

L'ho fatto usando una combinazione di TC e iptables hashlimit. Ho creato un limitatore di larghezza di banda TC in uscita sull'interfaccia LAN (per indirizzare il traffico di download) impostato su 5 Mbit/secondo. Quindi utilizzo il modulo hashlimit iptables nella catena mangle di output dell'interfaccia in modo tale che se la velocità del pacchetto supera una certa soglia, tra due indirizzi IP di origine e di destinazione distinti, inizia a classificare quei pacchetti nella classe di modellamento del traffico TC 5 Mbit/s .

Tuttavia, devi impostare correttamente la soglia del pacchetto e ho basato la mia sul fatto che il mio MTU è di 1500 byte, quindi l'ho usato per calcolare quanti pacchetti al secondo sarebbero necessari per creare una soglia di 1,5 Mbit al secondo (1000 pacchetti al secondo ). Insieme all'impostazione del valore di burst più alto possibile sul modulo hashlimit iptables (che nella mia configurazione sembra essere 10.000), il risultato di tutto ciò è che i download brevi vengono eseguiti alla massima velocità, ma quelli più lunghi iniziano a rallentare man mano che alcuni pacchetti vengono passato nella classe di limitazione della larghezza di banda TC, che ovviamente abbassa la velocità del pacchetto, ecc. Ecc. È un po 'un trucco, ma sorprendentemente funziona e funziona bene. E poiché viene utilizzato TC, nessun pacchetto viene mai eliminato, semplicemente ritardato e rallentato a causa dell'inserimento nella classe TC una volta raggiunta la velocità del pacchetto.

Questo è su una scatola CentOS 6. Penso che le cose più moderne consentano al modulo hashlimit di supportare byte al secondo, non solo pacchetti al secondo, il che è ancora meglio, ma l'ho provato sulla mia configurazione e torna a utilizzare i pacchetti al secondo.

Sono su un telefono cellulare in questo momento, quindi non posso incollare alcuna configurazione, ma se vuoi alcuni esempi, fammelo sapere e modificherò questa risposta. Mi piace molto questa soluzione perché la limitazione che ho scelto si basa sull'IP di origine e di destinazione. Quindi il sistema vede ogni distinta combinazione IP src+dst come il proprio flusso di pacchetti per la limitazione. Il modulo hashlimit supporta anche le porte di origine e di destinazione (praticamente qualsiasi combinazione di IP di origine, porta di origine, IP di destinazione, porta di destinazione), quindi è possibile anche eseguire la limitazione in base alla sessione tra IP di origine + porta e IP di destinazione + porta .

AGGIORNA

Quindi di seguito è approssimativamente come lo fai; sarà necessaria la sperimentazione.

tc:

/sbin/tc qdisc add dev eth0 root handle 1: htb
/sbin/tc class add dev eth0 parent 1: classid 1:1 htb rate 5Mbit

iptables:

#!/bin/bash

[[ "$1" =~ ^[ADI]$ ]] || exit 1

for IPT in /sbin/ip{,6}tables
do
  $IPT -t mangle -$1 POSTROUTING -o eth0 -m hashlimit --hashlimit-above 1000/second --hashlimit-burst 10000 --hashlimit-mode srcip,dstip --hashlimit-name limiter -j CLASSIFY --set-class 1:1
done

puoi risolvere questo problema in modo semplice, prova a utilizzare il modulo recente con iptables, recente tieni traccia dell'indirizzo di origine:

iptables -m recent -h
recent match options:
[!] --set                       Add source address to list, always matches.
[!] --rcheck                    Match if source address in list.
[!] --update                    Match if source address in list, also update last-seen time.
[!] --remove                    Match if source address in list, also removes that address from list.
    --seconds seconds           For check and update commands above.
                                Specifies that the match will only occur if source address last seen within
                                the last 'seconds' seconds.
    --reap                      Purge entries older then 'seconds'.
                                Can only be used in conjunction with the seconds option.
    --hitcount hits             For check and update commands above.
                                Specifies that the match will only occur if source address seen hits times.
                                May be used in conjunction with the seconds option.
    --rttl                      For check and update commands above.
                                Specifies that the match will only occur if the source address and the TTL
                                match between this packet and the one which was set.
                                Useful if you have problems with people spoofing their source address in order
                                to DoS you via this module.
    --name name                 Name of the recent list to be used.  DEFAULT used if none given.
    --rsource                   Match/Save the source address of each packet in the recent list table (default).
    --rdest                     Match/Save the destination address of each packet in the recent list table.
    --mask netmask              Netmask that will be applied to this recent list.

esempio per bloccare ssh forza bruta:

iptables -A INPUT -i eth0 -p tcp --syn --dport 22 -m recent --name ssh --set
iptables -A INPUT -i eth0 -p tcp --syn --dport 22 -m recent --name ssh --rcheck --seconds  30 --hitcount 2 -j DROP

Linux
  1. Come utilizzare IP Blocker in cPanel

  2. Maestral Dropbox Client, scopri come installarlo e usarlo

  3. Devo limitare la velocità dei pacchetti con iptables?

  4. Inoltra il traffico http a un altro indirizzo IP con iptables

  5. Limita l'accesso SSH a client specifici in base all'indirizzo IP

Come configurare e utilizzare il client di posta elettronica Nylas N1 su Linux

Come utilizzare Wireshark per acquisire e analizzare i pacchetti di rete

Come installare e utilizzare Wireshark su Ubuntu 21.04

Cos'è BusyBox in Linux? Come usarlo?

Come usare IPTables invece di firewalld per Fedora 30-31-32

Come utilizzare SSH per connettersi a un server remoto in Linux o Windows