我为某台计算机设置了配额:
iptables -A FORWARD -d 192.168.1.10 -m quota --quota 500000000 -j ACCEPT
iptables -A FORWARD -d 192.168.1.10 -j DROP
Run Code Online (Sandbox Code Playgroud)
这按预期工作。当达到限制 (500MB) 时,这台特定计算机的所有数据包都会被丢弃。
但是,如果我保存计数器(iptables-save -c > /home/iptables.counters),重新启动 iptables,并恢复计数器(iptables-restore -c /home/iptables.counters),那么不管保存的计数器是什么是,那台计算机仍然可以下载 500 MB,因此在该计算机失去 Internet 访问权限之前,总计数器大小将为 X + 500MB,其中 X 是保存的计数器大小。
我一定是做错了什么,因为这是保存/恢复计数器的重点:从该字节计数恢复,直到达到限制。任何类型的提示将不胜感激...
问题是内核错误。
在 EL6 中,执行匹配的配额代码显示:
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("a_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("a_lock);
return ret;
Run Code Online (Sandbox Code Playgroud)
在 F20 中它显示了这一点:
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;
}
Run Code Online (Sandbox Code Playgroud)
除了一行之外,它基本相同(减去间距变化);
/* Copy quota back to matchinfo so that iptables can display it */
q->quota = priv->quota;
Run Code Online (Sandbox Code Playgroud)
这意味着作为显示参数。
因此,在 EL6 中,如果您设置配额,传递一些数据包,那么iptables -vnL SOMECHAIN您是否会注意到配额值减少。
在 F20 中做同样的事情,值不会减少。我想设计者认为确保人们知道设置了什么配额而不是配额真正是什么可能更好(因为数据包计数清楚地表明剩下什么)。
然而,这会产生意想不到的效果。运行时,iptables-save您将配额值保存为 read via iptables。在 EL6 中,如果该值达到 0,则显示 0 到iptables。因此,当您恢复时,您将 0 恢复到 iptables 链中。
随着他们删除它,这个值永远不会减少,因此你永远不会真正保存配额。
真正需要发生的是模块需要重新设计。应该有一个quota条目和一个remaining条目。剩余应该像在 EL6 中一样递减,并用于强制执行配额,而“配额”应该是像 F20 中的实际设置值。这样你就可以两全其美。配额的保存状态和配额设置的实际描述。
您可能应该将此报告给 netfilter 团队。
| 归档时间: |
|
| 查看次数: |
1451 次 |
| 最近记录: |