nfq_bind_pf の使い方
Linux にはネットワークフィルタリング機能と、そのラッパーライブラリである libnetfilter-queue があります。
そのライブラリの提供するAPIである nfq_bind_pf
と nfq_unbind_pf
は uint16_t pf
を要求します。
これに何を渡せばいいのかよく判らなかったという話。
- サンプルコード では
AF_INET
を使うように書いてある。 - nfq_bind_pf のコメントでは
PF_INET
(など) を使えと書いてある。 - どっちを使っても動いてる(ように見える)
どっちを使えばいいのか?というか AF_INET
と PF_INET
って何だっけ?
PF_INETとAF_INETの微妙な違い によると:
- PF_ はプロトコルファミリー、AF_ はアドレスファミリーを表す
- BSDソケットの設計ではプロトコルファミリーとアドレスファミリーは独立している
- 現状のインターネットではIPv4/v6とそれらの唯一のアドレッシング方法しか無い(から独立に指定出来るうれしみは無い)
(適当な)結論
PF
はプロトコルファミリーを表すAF
はアドレスファミリーを表す- 実装は同じ値なのでどっちでも動く(
PF_INET
もAF_INET
も2
) - ドキュメントには
bind a nfqueue handler to a given protocol family
と書いてあるのでPF_*
を指定するべき - サンプルコード書いた人が怪しい
リンク
- libnetfilter_queueのdoxygen (2020/01/29時点でのバージョンは1.0.3)