nfq_bind_pf の使い方

Linux にはネットワークフィルタリング機能と、そのラッパーライブラリである libnetfilter-queue があります。
そのライブラリの提供するAPIである nfq_bind_pfnfq_unbind_pfuint16_t pf を要求します。
これに何を渡せばいいのかよく判らなかったという話。

  • サンプルコード では AF_INET を使うように書いてある。
  • nfq_bind_pf のコメントでは PF_INET(など) を使えと書いてある。
  • どっちを使っても動いてる(ように見える)

どっちを使えばいいのか?というか AF_INETPF_INET って何だっけ?


PF_INETとAF_INETの微妙な違い によると:

  • PF_ はプロトコルファミリー、AF_ はアドレスファミリーを表す
  • BSDソケットの設計ではプロトコルファミリーとアドレスファミリーは独立している
  • 現状のインターネットではIPv4/v6とそれらの唯一のアドレッシング方法しか無い(から独立に指定出来るうれしみは無い)

(適当な)結論

  • PFプロトコルファミリーを表す
  • AF はアドレスファミリーを表す
  • 実装は同じ値なのでどっちでも動く(PF_INETAF_INET2)
  • ドキュメントには bind a nfqueue handler to a given protocol family と書いてあるので PF_* を指定するべき
  • サンプルコード書いた人が怪しい

リンク