PF は、「最後に一致した」ポリシーに従って規則を処理します。つまり、パケットに対するポリシー決定は、そのパケットに一致した最後の規則によって決定されます。このポリシーでは、規則の最適な順序として、最初を一般に適用可能な規則にし、規則セット内のあとの方をより詳細な一致パラメータにすることを推奨しています。
たとえば、次の規則セットを考えてみます。
block in from any to any pass in from any to any port = 22 pass in from any to any port = 25
最初の規則は、すべてのインバウンドパケットをブロックします。続く規則は、宛先ポート番号を一致させます。
そのため、パケットがポート 22 に到着すると、PF はそれを次のように処理します。
ブロックの規則を適用します。
ポート 22 の規則を適用します。これが、そのパケットに一致します。PF は、その一致をメモリー内に保持します。
ポート 25 の規則を適用します。これは、そのパケットに一致しません。
PF は、そのパケットをすべての規則に対してチェックしたあと、ポート 22 の規則が成功したためにそのパケットを転送します。
quick キーワードは例外です。規則に quick キーワードが含まれている場合、その規則のアクションがただちに実行され、それ以上の規則はそのパケットに適用されません。
block in from any to any pass in quick from any to any port = 22 pass in from any to any port = 25
ファイアウォールを介して同じパケットを通し、この規則セットを使用した場合、PF は 2 番目の規則が適用されるとただちにそのパケットに対して pass アクションを実行します。quick キーワードは、そのパケットのそれ以上のチェックを停止するため、3 番目の規則は適用されません。
詳細は、pfctl(1M) および pf.conf(5) のマニュアルページを参照してください。