渡辺一寛です。ドキュメントとソースを見ただけでリプライします。
At Mon, 18 Dec 2006 15:41:41 +0900,
Tsurutani Naoki wrote:
> ipfwでのログのレポートについて、疑問があります。
> PR conf/96247に書いたのですが、一向に修正されないので、
> 私の理解不足かと不安になってきました。
>
> % sysctl net.inet.ip.fw.verbose
> net.inet.ip.fw.verbose: 1
> % sysctl net.inet.ip.fw.verbose_limit
> net.inet.ip.fw.verbose_limit: 0
> な状態で、
> deny log ip from any to 172.16.0.0/12 via xl0
> のようなルールに対し、ログが記録されます。
>
> そのログについて、periodicのsecurity/550.ipfwlimitで上限に達したかどうかが
> レポートされますが、上述のようにlimit=0の場合、必ず「上限に達した」旨の
> レポートが届きます。
> limit=0の場合、上限なし、と解釈されると思っているので(man pageにはそう書かれています)、
> これはおかしいと思うのですが、PRでは取り合ってもらえませんでした。
>
> 私の解釈が間違ってますでしょうか?
(鶴谷さんも PR の 2 回目のコメントで触れていますが) 要は ipfw(8) に
あるように、
(1) "ipfw log XXX ..." のように上限 XXX をルールで指定されれば、
その値を使う。
(2) ルールで上限を指定されなければ、sysctl(8) 変数の
net.inet.ip.fw.verbose_limit の値を使う。
(3) どちらにしても、値が 0 ならば上限無しになる。
という解釈で良いと思います。
ただ、先方は鶴谷さんが PR で最初に提示したパッチを見て、
> net.inet.ip.fw.verbose_limit: 0
という設定なら無条件に上限無しになる、と鶴谷さんが思っていると勘違いし
たように思えます。だから
| Why: This is not a bug: if net.inet.ip.fw.verbose_limit=0 but rules
| specify a limit, this limit has the priority since it's a specific
| setting that overrides a general one.
のようにコメントしたのでしょう。最初のパッチでは
> net.inet.ip.fw.verbose_limit: 0
という設定で、かつルールで上限を設定された場合には対応できませんから。
2 回目に提示されたパッチならば、所望の動作にはなりそうです。ただ
ipfw(8) のソース (ipfw2.c) を見ると、
|| static void
|| show_ipfw(struct ip_fw *rule, int pcwidth, int bcwidth)
|| {
(中略)
|| if (logptr) {
|| if (logptr->max_log > 0)
|| printf(" log logamount %d", logptr->max_log);
|| else
|| printf(" log");
|| }
となっているので、
| '{if ($6 == "logamount") {
| - if ($2 > $7)
| + if ($7 != 0 && $2 > $7)
| {print $0}
の部分は不要で、
| } else {
| - if ($2 > limit)
| + if (limit != 0 && $2 > limit)
| {print $0}}
だけで良いのではないでしょうか。
あと、件の PR は
| Why: Re-open to look at this PR again: submitter is sure this is a
| bug, so I'll look at this again.
ということで再度 open になってますから、単に忘れられているか、後回しに
されているかのどちらかではないでしょうか。上記のように勘違いされていな
ければ、割とすんなり commit されるような気もします。
---
Watanabe Kazuhiro ([EMAIL PROTECTED])