linux – Iptables计数器在使用配额时恢复,不按预期工作

前端之家收集整理的这篇文章主要介绍了linux – Iptables计数器在使用配额时恢复,不按预期工作前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我为某台计算机设置了配额:
  1. iptables -A FORWARD -d 192.168.1.10 -m quota --quota 500000000 -j ACCEPT
  2. iptables -A FORWARD -d 192.168.1.10 -j DROP

这按预期工作.达到限制(500MB)时,此特定计算机的所有数据包都将被丢弃.

但是,如果我保存计数器(iptables-save -c> /home/iptables.counters),重新启动iptables,并恢复计数器(iptables-restore -c /home/iptables.counters),那么无论保存什么计数器,该计算机仍然可以下载500 MB,所以计算机失去互联网访问之前的总计数器大小将是X 500MB,其中X是保存的计数器大小.

我必须做错事,因为这是保存/恢复计数器的重点:从该字节计数恢复直到达到限制.任何类型的提示将不胜感激……

解决方法

问题是内核错误.

在EL6中,进行匹配的配额代码显示

  1. quota_mt(const struct sk_buff *skb,const struct xt_match_param *par)
  2. {
  3. struct xt_quota_info *q = (void *)par->matchinfo;
  4. struct xt_quota_priv *priv = q->master;
  5. bool ret = q->flags & XT_QUOTA_INVERT;
  6.  
  7. spin_lock_bh(&quota_lock);
  8. if (priv->quota >= skb->len) {
  9. priv->quota -= skb->len;
  10. ret = !ret;
  11. } else {
  12. /* we do not allow even small packets from now on */
  13. priv->quota = 0;
  14. }
  15. /* Copy quota back to matchinfo so that iptables can display it */
  16. q->quota = priv->quota;
  17. spin_unlock_bh(&quota_lock);
  18.  
  19. return ret;

在F20中它显示了这个:

  1. static bool
  2. quota_mt(const struct sk_buff *skb,struct xt_action_param *par)
  3. {
  4. struct xt_quota_info *q = (void *)par->matchinfo;
  5. struct xt_quota_priv *priv = q->master;
  6. bool ret = q->flags & XT_QUOTA_INVERT;
  7.  
  8. spin_lock_bh(&priv->lock);
  9. if (priv->quota >= skb->len) {
  10. priv->quota -= skb->len;
  11. ret = !ret;
  12. } else {
  13. /* we do not allow even small packets from now on */
  14. priv->quota = 0;
  15. }
  16. spin_unlock_bh(&priv->lock);
  17.  
  18. return ret;
  19. }

它与一条线基本相同(减去间距变化);

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

这意味着作为显示参数.

所以在EL6中,如果你设置了配额,传递一些数据包,然后执行iptables -vnL SOMECHAIN,你会发现配额值会减少.

在F20做同样的事情,价值不会减少.我想设计师认为,确保人们知道配额是什么而不是配额的真实情况可能是更好的事情(因为数据包计数清楚地说明剩下的是什么).

但是,这会产生意想不到的效果.当你运行iptables-save时,你可以通过iptables保存配额值.在EL6中,如果此值达到0,则显示0到iptables.因此,在还原时,将0还原为iptables链.

随着它们删除它,这个值永远不会减少,因此你永远不会实际保存配额.

真正需要发生的是模块需要重新设计.应该有配额条目和剩余条目.剩余应该像EL6一样递减,并且用于强制执行配额,而“quota”应该是F20中的实际设定值.这样你就可以获得两全其美.已保存的配额状态以及设置的配额的实际描述.

您应该向netfilter团队报告此事.

猜你在找的Linux相关文章