基本的には、ebtables に可能なフィルターを追加するカーネル モジュールを作成したいと考えています。次に、設定したブリッジでフィルターを使用するように ebtables に指示する必要があります。
独自のモジュールを作成する必要があるのは、連続するパッケージ間に遅延を導入したいからです (何らかのテスト上の理由から)。実証するために、私のネットワークにはもともと次のようなトラフィックがあります。
+++-----------------+++-----------------+++-----------------+++-----------------
ここで+
、 はパッケージのトラフィックを示し-
、ライン上にパッケージがないことを意味します。パケットのパターンが次のように変わるように、間にブリッジを配置したいと思います。
+----+----+---------+----+----+---------+----+----+---------+----+----+---------
これは、各パケットの到着の間に一定量の遅延があることを確認することを意味します。
これで、基本的に linux-source/net/bridge/netfilter/ebt_ip.c から取得した次の簡単なコードを作成しました。
static bool match(const struct sk_buff *skb, const struct xt_match_param *par)
{
printk(KERN_INFO"match called\n");
return true; // match everything!
}
static bool check(const struct xt_mtchk_param *par)
{
printk(KERN_INFO"check called\n");
return true; // pass everything!
}
static struct xt_match reg __read_mostly = {
.name = "any", // I made this up, but I tried also putting ip for example which didn't change anything.
.revision = 0,
.family = NFPROTO_BRIDGE,
.match = match,
.checkentry = check,
.matchsize = XT_ALIGN(4), // don't know what this is, so I just gave it an `int`
.me = THIS_MODULE
};
int init_module(void)
{
return xt_register_match(®);
}
void cleanup_module(void)
{
xt_unregister_match(®);
}
モジュールのロードに成功しました。しかし、それはあたかもそこにないかのようです。内部のログmatch
とcheck
機能を取得していないため、ブリッジは明らかにフィルターを考慮していません。私は何を間違っていますか?
最初にフィルターをロードする、最初にブリッジをセットアップする、または最初に ebtables ルールを設定するという多くの組み合わせを試しましたが、どれも何も変わりません。
PSブリッジ自体は機能します。パッケージをドロップするポリシーを追加すると、最終的なコンピューターでそれらを受信しないため、ebtables も有効であると確信しています。私が理解できないのは、私のフィルターも考慮するようにebtablesに指示する方法です。