WFPでIPアドレスの範囲を指定してフィルタリングしたい

[戻る]
iy 2011/05/15(日) 01:59:15
WFPでIPアドレスの範囲を指定してフィルタリングしたいと思い、
以下のように条件を書きました。

FWPM_FILTER_CONDITION0 Condition;
FWP_RANGE0 Range;
Condition.fieldKey=FWPM_CONDITION_IP_REMOTE_ADDRESS;
Condition.matchType=FWP_MATCH_RANGE;
Condition.conditionValue.type=FWP_RANGE_TYPE;
Condition.conditionValue.rangeValue=&Range;
Range.valueLow.type=FWP_UINT32;
Range.valueLow.uint32=ntohl(AddressLow);
Range.valueHigh.type=FWP_UINT32;
Range.valueHigh.uint32=ntohl(AddressHigh);

この条件でFwpmFilterAdd0を呼び出すと成功(ERROR_SUCCESS)が返りますが、
実際には全くフィルタリングされません。
条件をFWP_MATCH_EQUALとしてFWP_V4_ADDR_MASKで単独のアドレスを指定しての
フィルタリングは問題なく行えています。

FWPM_FILTER0のlayerKeyはFWPM_LAYER_INBOUND(OUTBOUND)_IPPACKET_V4や
FWPM_LAYER_INBOUND(OUTBOUND)_TRANSPORT_V4、FWPM_LAYER_ALE_AUTH_CONNECT_V4を
指定しましたが、どれもフィルタリングされません。

Calloutを使えば可能かと思いますが、
x64でドライバ署名が必要になるという問題があるので難しいです。

条件にIPアドレスの範囲を指定するにはどうすればいいでしょうか?

(開発環境 Vista SP2 + VS2010 SP1)

(半年ほど前にも2ちゃんねるで同じ質問をしましたが
レスが付かなかったためこちらで質問させて頂きます)

gak 2011/05/16(月) 17:55:21
以下、documentを眺めただけで実際に試してはいない回答。

> Condition.matchType=FWP_MATCH_RANGE;
ここを FWP_MATCH_EQUAL にしたらどうなる?

> http://msdn.microsoft.com/en-us/library/aa364942%28v=VS.85%29.aspx#FWP_MATCH_RANGE
解説に「Only sortable data types support FWP_MATCH_RANGE.」とある。
で、「sortable data types」の定義は
>
http://msdn.microsoft.com/en-us/library/aa364942%28v=VS.85%29.aspx#FWP_MATCH_GREATER
FWP_RANGE0 は含まれてないポイので×なのかも

iy 2011/05/16(月) 21:13:53
レスありがとうございます。

> > Condition.matchType=FWP_MATCH_RANGE;
> ここを FWP_MATCH_EQUAL にしたらどうなる?

Condition.matchType=FWP_MATCH_EQUAL;
としてみましたが、FWP_MATCH_RANGE を指定した場合と変化ありませんでした。
(FwpmFilterAdd0 は成功するが、実際には何の働きもしない)

> >
http://msdn.microsoft.com/en-us/library/aa364942%28v=VS.85%29.aspx#FWP_MATCH_RANGE
> 解説に「Only sortable data types support FWP_MATCH_RANGE.」とある。
> で、「sortable data types」の定義は
> >
>
http://msdn.microsoft.com/en-us/library/aa364942%28v=VS.85%29.aspx#FWP_MATCH_GREATER
> FWP_RANGE0 は含まれてないポイので×なのかも

うーん、条件が FWP_MATCH_RANGE の場合、FWP_RANGE0 以外は
指定のしようがないと思うのですが…

ちなみに、条件に FWP_MATCH_GREATER_OR_EQUAL と FWP_MATCH_LESS_OR_EQUAL の二つを
指定してできないか試してみたのですが、FwpmFilterAdd0 でエラー8032002a
(「フィルタに、単一のフィールドに作用する複数の条件を含めることはできません。」)
というのが返ってきて駄目でした。

gak 2011/05/17(火) 11:05:30
実際に組んでみた。

> Range.valueLow.uint32=ntohl(AddressLow);
> Range.valueHigh.uint32=ntohl(AddressHigh);
AddressLow、AddressHigh に実際にどんなバイトオーダーでデータが格納されているかは
判らないけど、ntohl 除いてみたらどうなる?
Address*** には元々リトルエンディアンでIPが格納されてたりしない。もしそうならば
(intel/AMD環境では)バイトオーダーをreverseしてやる必要は無いよ。

とりあえず iy さんが最初に示した FWP_RANGE0 の使い方で問題なく動くのは確認でき
た。yahoo の ip(202.93.91.210〜202.93.91.214)借りて試したところブロックできた。
なので恐らく iy さんのコードでは間違ったip値になっている、と思うのだがどうだろう?

> ここを FWP_MATCH_EQUAL にしたらどうなる?
FWP_MATCH_RANGE でも FWP_MATCH_EQUAL でも動いたからどっちもOKな様だね。

iy 2011/05/19(木) 00:49:16
[[解決]]
gakさん、わざわざ試して頂いてありがとうございます。

gakさんの指摘でIPアドレスの値を確認してみたところ、
他の部分のバグでアドレスが変な値になっていたのが原因と分かりました。
修正しましたところ、問題なく動作するようになりました。
基本的な確認不足だったようで申し訳ないです。
ありがとうございました。

古いスレッドには追加発言できません。