I contatori Iptables ripristinano, quando utilizzano quote, non funzionano come previsto

Ho impostato una quota per un determinato computer:

iptables -A FORWARD -d 192.168.1.10 -m quota --quota 500000000 -j ACCEPT iptables -A FORWARD -d 192.168.1.10 -j DROP 

Questo funziona come previsto. Quando viene raggiunto il limite (500 MB), tutti i pacchetti per questo particolare computer vengono eliminati.

  • Rimozione di file e varianti DS_Store?
  • ganeti network: cambiare nome ponte
  • Carica media superiore a 20 per vps a nucleo singolo su debian
  • Linux dice che il mio spazio è pieno con 2,4 / 50gb utilizzati
  • Errore interno del server e process grazioso uccidere
  • Scarsa performance con il software RAID-10 di Linux
  • Ma se salvo i contatori (iptables-save -c> /home/iptables.counters), riavvii iptables e ripristini i contatori (iptables-restore -c /home/iptables.counters), quindi non import che i contatori salvati erano che il computer potrà ancora scaricare 500 MB, quindi la dimensione totale del contatore, prima che il computer perda accesso a Internet, sarà X + 500 MB, where X è la dimensione contatore salvata.

    Devo fare qualcosa di sbagliato, in quanto questo è il punto integer per salvare / ripristinare i contatori: riprendendo da quel count di byte fino al raggiungimento del limite. Qualsiasi tipo di suggerimento sarebbe molto apprezzato …

  • Ottimizzazione dei parametri del module Prefork Apache 2 MPM
  • Come posso rimuovere i bit GUI da un'installazione di Red Hat Enterprise Linux?
  • Come prova le regole di iptables per impedire il block remoto e verificare le partite?
  • Linux: perché il modo utente singolo funziona sulla console seriale ma non sulla tastiera / video / monitor collegata?
  • Quali sono i migliori modi per confrontare RAM (no-ECC) sotto linux / arm?
  • Errore di connessione SSH: ssh_exchange_identification: read: Connessione resettata da peer
  • One Solution collect form web for “I contatori Iptables ripristinano, quando utilizzano quote, non funzionano come previsto”

    Il problema è un bug del kernel.

    In EL6 il codice delle quote che fa la corrispondenza mostra questo:

     quota_mt(const struct sk_buff *skb, const struct xt_match_param *par) { struct xt_quota_info *q = (void *)par->matchinfo; struct xt_quota_priv *priv = q->master; bool ret = q->flags & XT_QUOTA_INVERT; spin_lock_bh(&quota_lock); if (priv->quota >= skb->len) { priv->quota -= skb->len; ret = !ret; } else { /* we do not allow even small packets from now on */ priv->quota = 0; } /* Copy quota back to matchinfo so that iptables can display it */ q->quota = priv->quota; spin_unlock_bh(&quota_lock); return ret; 

    In F20 mostra questo:

     static bool quota_mt(const struct sk_buff *skb, struct xt_action_param *par) { struct xt_quota_info *q = (void *)par->matchinfo; struct xt_quota_priv *priv = q->master; bool ret = q->flags & XT_QUOTA_INVERT; spin_lock_bh(&priv->lock); if (priv->quota >= skb->len) { priv->quota -= skb->len; ret = !ret; } else { /* we do not allow even small packets from now on */ priv->quota = 0; } spin_unlock_bh(&priv->lock); return ret; } 

    La sua sostanzialmente la stessa (less spaziatura) a parte una linea;

      /* Copy quota back to matchinfo so that iptables can display it */ q->quota = priv->quota; 

    Questo è inteso come parametro di visualizzazione.

    Quindi, in EL6 se imposta un contingente, passate alcuni pacchetti, quindi fai iptables -vnL SOMECHAIN noterai i decrementi del valore di quota.

    In F20 facendo la stessa cosa il valore non diminuisce. Suppongo che i progettisti credono che sia probabilmente una cosa migliore per assicurarsi che la gente sappia quale quota è stata impostata, piuttosto che ciò che è veramente il contingente (visto che il count dei pacchetti chiarisce ciò che rimane).

    Tuttavia, questo ha un effetto non intenzionale. Quando si esegue iptables-save salva il valore di quota come letto tramite iptables . In EL6, se questo valore raggiunge 0, visualizza 0 a iptables . Quindi, quando ripristinate, ripristinate il 0 nella catena iptables.

    Con loro la rimuove, questo valore non diminuisce mai e quindi non si salva mai la quota.

    Ciò che deve veramente accadere è che il module ha bisogno di ridisegnare. Dovrebbe essere una voce di quota e una voce remaining . Il rimanente dovrebbe diminuire come in EL6 e essere quello che serve per far rispettare la quota, mentre la "quota" dovrebbe essere il valore impostato effettivo come nel F20. In questo modo si ottiene il meglio di entrambi i mondi. Uno stato salvato del contingente e una descrizione effettiva di quale quota è impostata.

    Dovresti probabilmente segnalarlo al team netfilter.

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.