web-dev-qa-db-ja.com

NATおよびOpenBSDを使用したPFでのソースIPフィルタリング> = 4.7

PF(The Book Of PF、No Starch)についての本を読んだばかりですが、答えられていない質問が1つあります。

$ int_ifと$ ext_ifの2つのインターフェイスを使用するゲートウェイマシンがあり、$ int_if:net(つまり、10.0.0.0/24)からのパッケージをNAT $ ext_if using match、いつNATが適用されますか?フィルタリングルールの前または後に?

例:

match out on $ext_if from 10.0.0.0/24 nat-to ($ext_if)
pass out on $ext_if from 10.0.0.0/24
block drop out on $ext_if from 10.0.0.23

それは動作しますか?または、10.0.0.23からのパケットが評価される前に$ ext_ifのアドレスにNATされた10.0.0.23からのパケットの送信元IPを取得しますか?

この図は、この質問に答えるのに役立たないと思いますが、それでも興味深いものです:[ http://www.benzedrine.cx/pf_flow.png ]

PFを読んだ場合NAT FAQ [ http://www.openbsd.org/faq/pf/nat.html ]、特に「NATの設定」のセクションでは、次の文に出くわします。

パケットが一致ルールによって選択されると、そのルールのパラメーター(nat-toなど)が記憶され、パケットに一致するパスルールに到達したときにパケットに適用されます。これにより、パケットのクラス全体を単一の一致ルールで処理し、トラフィックを許可するかどうかの特定の決定をブロックおよびパスルールで行うことができます。

これは、上記の段落で述べたとおりではないように聞こえるので、パケットで実行するアクションについて決定が下されるまで、ソースIPは「記憶」されます。決定が下されると、NATtingが適用されます。

どう思いますか?

追伸:これはかなり理論的な質問です。あなたが少し実用的であるならば、あなたはそれをこのようにするでしょう:

match out on $ext_if from 10.0.0.0/24 nat-to ($ext_if)
block drop from 10.0.0.23
# or, explicitly,
# block drop in on $int_if from 10.0.0.23

したがって、blockルールは、パケットが$ int_ifに到着したときにすでに適用されています。

編集:別の可能性は、もちろん、NATの前に決定することです:

pass from 10.0.0.0/24
block drop from 10.0.0.23
match out on $ext_if from 10.0.0.0/24 nat-to ($ext_if)

.23からのパケットが到着すると、最初に最初のルールに一致し、次に2番目のルールと3番目の「ルール」に一致します。ただし、2番目のルールは通過/ブロックに関する最後の決定であるため、パケットはブロックされます。正しい?

8
dermesser

はい、それはあなたが尋ねたことは非常に理論的ですが、非常に興味深い質問です。

matchルールは、最後に一致したルールに作用しているときに適用されます。 matchルールは、あなたが言ったように「スティッキー」です。それらの主な目的は、NATルールを一度設定できるようにすることであり、アウトバウンドトラフィックに関する一連のルールの最後にNATを設定する必要はありません。

あなたの例では、パケットはドロップされます。コードを確認するか、Henning Brauerに、ドロップケースでNATチェックを完全にスキップするかどうかを確認するように依頼する必要がありますが、not NATされるでる。

あなたのルールはis Book of PF(第2版を手に入れましたか?)でカバーされていると思いますが、マッチルールでそれについて明確にされているとは思いません。

1
kurtm

私が間違っていた場合は訂正してください。10.0.0.0/ 24からのすべての送信パケットを渡したいが、10.0.0.23をブロックしたいですか?その場合は、ルールを次のように変更します。

match out on $ext_if from 10.0.0.0/24 nat-to ($ext_if)
block drop out quick on $ext_if from 10.0.0.23
pass out on $ext_if from 10.0.0.0/24

ファイアウォールがフィルタリングを続行しないようにするには、単にquickを使用します(一部のプログラミング言語のbreakと同様)。

http://www.openbsd.org/faq/pf/filter.html#quick

クイックキーワード

前に示したように、各パケットはフィルタールールセットに対して上から下に評価されます。デフォルトでは、パケットは通過のマークが付けられています。これは任意のルールで変更でき、フィルタールールが終了する前に数回前後に変更できます。最後に一致したルールが「勝ち」ます。これには例外があります。フィルタリングルールのクイックオプションは、それ以降のルール処理をキャンセルする効果があり、指定されたアクションが実行されます。いくつかの例を見てみましょう。

違う:

block in on fxp0 proto tcp to port ssh
pass  in all 

この場合、ブロックラインが評価される可能性がありますが、その後にすべてを通過するラインが続くため、効果はありません。

より良い:

block in quick on fxp0 proto tcp to port ssh
pass  in all 

これらのルールの評価は少し異なります。クイックオプションにより、ブロックラインが一致した場合、パケットはブロックされ、残りのルールセットは無視されます。

0
user6291