渡辺一寛です。ドキュメントとソースを見ただけでリプライします。
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])