EN JA
PFCTL(8)
PFCTL(8) FreeBSD System Manager's Manual PFCTL(8)

名称

pfctlパケットフィルタ (PF) デバイスを制御する

書式

pfctl [ -AdeghmNnOPqRrvz][ -a  anchor][ -D  macrovalue][ -F  modifier][ -f  file][ -i  interface][ -K  host |  network][ -k  hostnetwork |  label |  id][ -o  level][ -p  device][ -s  modifier][ -t  table  -T command [ address ...]][ -x  level]

解説

pfctl ユーティリティは、 pf(4) に記述された ioctl インタフェースを使用してパケットフィルタデバイスと通信します。それは、ルールセット、パラメータの設定、とパケットフィルタからの状態情報の検索を可能とします。

パケットフィルタリングは、 pf.conf(5) に記述されるフィルタ規則に基づくホストに入るか出るネットワークインタフェースを通り抜けるパケットのタイプを制限します。また、パケットフィルタは、パケットのアドレスとポートを置き換えることができます。発信パケットのソースアドレスとポートを置き換えることは、 NAT (ネットワークアドレス変換) と呼ばれて、外部のホストへのすべての接続が、ゲートウェイから来るようにすることによって内部のネットワーク (通常、予約されたアドレス空間) から外部のネットワーク (インターネット) に接続するために使用されます。着信パケットの宛先アドレスとポートを置き換えることは、異なったホスト、および/または、ポートへの接続をリダイレクトするために使用されます。両方の変換の組み合わせ (双方向の NAT) もサポートされています。変換規則は、 pf.conf(5) に記述されています。

変数 pfrc.conf(5)YES に設定されるとき、変数 pf_rules で指定される規則ファイルは、 rc(8) スクリプトによって自動的にロードされ、パケットフィルタは、有効にされます。

パケットフィルタは、インタフェースの間のそれ自体のパケットを転送しません。 sysctl(8) 変数 net.inet.ip.forwarding そして/または、 net.inet6.ip6.forwarding を 1 に設定することによって、転送は、有効にすることができます。それらを sysctl.conf(5) に永久に設定します。

pfctl ユーティリティは、いくつかのコマンドを提供します。オプションは、次の通りです:

-A
規則ファイルの現在のキュー規則だけをロードします。他の規則とオプションは、無視されます。
-a anchor
フラグ -f, -F-s だけを指定された anchor の規則に適用してください。主なルールセットに加えて、 pfctl は、アンカと呼ばれる名前によって追加ルールセットをロードして操作することができます。主なルールセットは、デフォルトのアンカです。

アンカは、名前によって参照され、ファイルシステム階層構造がどのように配置されているかと同様に、‘/’文字で分離されたアンカのパスの様々なコンポーネントで入れ子にされるかもしれません。アンカのパスの最後のコンポーネントは、ルールセット操作が実行されるところです。

主なルールセットからの anchor 規則の評価は、 pf.conf(5) に記述されます。

例えば、次は、 authpf(8), PID 1234: によってユーザ“smith”のために、作成されたアンカ“authpf/smith(1234)”内のすべてのフィルタ規則 (下記の -s フラグ参照) を表示します:

# pfctl -a "authpf/smith(1234)" -s rules

アンカでロードされる pf.conf(5) ファイルのテーブル文を持つことによってか、または次のように定期的なテーブルコマンドを使用することによって、プライベートテーブルは、アンカ内にも置くことができます。

# pfctl -a foo/bar -t mytable -T add 1.2.3.4 5.6.7.8

テーブルを参照する規則がアンカでロードされるとき、規則は、それが定義してあれば、プライベートテーブルを使用し、次に、主なルールセットで定義されたテーブルへのフォールバック、それがあるなら、を使用します。これは、変数スコープの C の規則と同様です。グローバルなルールセットとアンカで同じ名前で異なったテーブルを作成することが可能ですが、これは、しばしば悪い設計で、その場合、警告が出力されます。

デフォルトで、アンカの再帰的なインライン印刷は、ルールセットのインラインで指定されたアンカを無名にするためだけに適応します。アンカ名が‘*’文字で終っているなら、 -s フラグは、大括弧で区切られたブロック中のすべてのアンカを再帰的に印刷します。例えば、次は、“authpf”ルールセットを再帰的に印刷します:

# pfctl -a 'authpf/*' -sr

主なルールセットを再帰的に印刷するためには、アンカ名として‘*’だけを指定します:

# pfctl -a '*' -sr
-D macro= value
コマンドラインで value に設定される macro を定義します。ルールセットの macro の定義を上書きします。
-d
パケットフィルタを無効にします。
-e
パケットフィルタを有効にします。
-F modifier
(簡略化される) modifier によって指定されたフィルタパラメータをフラッシュします:

-F nat
NAT 規則をフラッシュします。
-F queue
キュー規則をフラッシュします。
-F rules
フィルタ規則をフラッシュします。
-F states
ステートテーブル (NAT とフィルタ) をフラッシュします。
-F Sources
ソース追跡テーブルをフラッシュします。
-F info
フィルタ情報 (規則に縛られない統計) をフラッシュします。
-F Tables
テーブルをフラッシュします。
-F osfp
パッシブオペレーティングシステム指紋をフラッシュします。
-F all
上記のすべてをフラッシュします。
-f file
file に含まれた規則をロードします。この file は、マクロ、テーブル、オプション、正規化、キューイング、変換、およびフィルタリング規則を含みます。マクロとテーブルを除いて、文は、その順序で現れなければなりません。
-g
デバッグのために役立つ出力を含めます。
-h
ヘルプ。
-i interface
操作を与えられた interface に制限します。
-K host | network
指定された host または network を起源とするソースの追跡エントリのすべてを kill します。 2 番目の -K host または -K network オプションは、最初のホスト/ネットワークから 2 番目までのソースの追跡エントリをすべて kill されるように指定されます。
-k host | network | label | id
指定された host, network, label または id にマッチするすべての状態エントリを kill します。

例えば、“host”を起源とするすべての状態エントリを kill するためには:

# pfctl -k host

2 番目の -k host または -k network オプションは、最初のホスト/ネットワークから 2 番目までの状態エントリをすべて kill されるように指定されます。“host1”から“host2”までの状態エントリのすべてを kill するためには:

# pfctl -k host1 -k host2

192.168.1.0/24 から 172.16.0.0/16 までを起源とするすべての状態を kill するためには:

# pfctl -k 192.168.1.0/24 -k 172.16.0.0/16

ワイルドカードとして長さ 0 のネットワーク接頭辞を使用することができます。ターゲット“host2”ですべての状態を kill するためには:

# pfctl -k 0.0.0.0/0 -k host2

また、規則ラベルまたは状態 ID によって状態を kill することが可能です。このモードで、最初の -k 引数は、2 番目の引数のタイプを指定するために使用されます。次のコマンドは、ラベル“foobar”がある規則から作成されたすべての状態を kill するでしょう:

# pfctl -k label -k foobar

(pfctl -s state -vv によって示されるような) ユニークな状態 ID によって 1 つの特有の状態を kill するには、 id 修飾子と 2 番目の引数として、状態 ID とオプションのクリエータ (creator) ID を使用します。 ID 4823e84500000003 がある状態を kill するために、次を使用します:

# pfctl -k id -k 4823e84500000003

ホスト ID 00000002 があるバックアップファイアウォールから作成された ID 4823e84500000018 がある状態を kill するためには、次を使用します:

# pfctl -k id -k 4823e84500000018/2
-m
省略されるものをリセットしないで、明白に与えられたオプションでマージします。単一のオプションは、他を妨げないで変更できます:

# echo "set loginterface fxp0" | pfctl -mf -
-N
規則ファイル中の現在の NAT 規則だけをロードします。他の規則とオプションは、無視されます。
-n
実際に規則をロードしないで、ただそれらを解析します。
-O
規則ファイル中の現在のオプションだけをロードします。他の規則とオプションは、無視されます。
-o level
任意の規則ファイル設定を上書きして、ルールセットオプティマイザ (最適化ツール) を制御します。

-o none
ルールセットオプティマイザを無効にします。
-o basic
基本的なルールセット最適化を有効にします。これは、デフォルトの振る舞いです。
-o profile
プロファイルを行う基本的なルールセット最適化を有効にします。

ルールセットオプティマイザの詳細については、 pf.conf(5) を参照してください。

-P
ポート特有の規則のためのサービス名の検索を実行せず、代わりに、数値のポートを表示します。
-p device
デフォルト /dev/pf の代わりにデバイスファイル device を使用します。
-q
単にエラーと警告を印刷 (表示) します。
-R
規則ファイル中の現在のフィルタ規則だけをロードします。他の規則とオプションは、無視されます。
-r
それらを表示するとき逆の DNS 検索を実行します。
-s modifier
(簡略化されるかもしれない) modifier によって指定されたフィルタパラメータが表示します:

-s nat
現在ロードされた NAT 規則を表示します。
-s queue
現在ロードされたキュー規則を表示します。 -v と共に使用されるとき、キュー毎の統計値も表示されます。 -v -v と共に使用されるとき、 pfctl は、ループし、1 秒毎の測定帯域幅とパケットを含んで、5 秒毎に更新されたキュー統計値を表示します。
-s rules
現在ロードされたフィルタ規則を表示します。 -v, と共に使用されるとき、規則毎の統計値 (評価、パケット、とバイトの数) も表示されます。カーネルによって自動的に行われる“skip step”最適化は、可能であれば規則の評価をスキップすることに注意してください。ステートフルに渡されたパケットは、 (規則は、全体の接続のために二度以上評価されませんが) 状態を作成した規則で数えられます。
-s Anchors
主なルールセットに直接アタッチされた現在ロードされたアンカを表示します。 -a anchor もまた指定されるなら、与えられた anchor の直下にロードされたアンカが代わりに表示されます。 -v が指定されるなら、ターゲットアンカの下でアタッチされたすべてのアンカは、再帰的に表示されます。
-s states
状態テーブルの内容を表示します。
-s Sources
ソース追跡テーブルの内容を表示します。
-s info
フィルタ情報 (統計値とカウンタ) を表示します。 -v と共に使用されるとき、ソースの追跡統計値も表示されます。
-s labels
アカウントの役に立つラベルでフィルタ規則の規則毎の統計値 (ラベル、評価、パケット合計、バイト合計、パケット入力、バイト入力、パケット出力、バイト出力、状態作成) を表示します。
-s timeouts
現在のグローバルなタイムアウトを表示します。
-s memory
現在のプールメモリのハードの制限を表示します。
-s Tables
テーブルのリストを表示します。
-s osfp
オペレーティングシステム指紋のリストを表示します。
-s Interfaces
PF に利用可能なインタフェースとインタフェースドライバのリストを表示します。 -v と共に使用されるとき、さらに、インタフェースで活性化された規則をスキップするものをリストします。 -vv と共に使用されるとき、インタフェースの統計値も表示されます。 -i は、インタフェースかインタフェースのグループを選択するために使用することができます。
-s all
インタフェースとオペレーティングシステム指紋のリストを除いて、上記のすべてを表示します。
-T command [ address ...]
テーブルに適用するために、(簡略化されるかもしれない) command を指定します。コマンドは、次を含みます:

-T kill
テーブルを kill します。
-T flush
テーブルのすべてのアドレスをフラッシュします。
-T add
テーブルに 1 つ以上のアドレスを追加します。自動的に非存在テーブルを作成します。
-T delete
テーブルから 1 つ以上のアドレスを削除します。
-T expire number
前の number 秒を超えるクリアされたそれらの統計値をクリアされたアドレスを削除します。それらの統計値を一度もクリアしたことがないエントリについて、 number は、それらがテーブルに追加された時刻を参照します。
-T replace
テーブルのアドレスを置き換えます。自動的に非存在テーブルを作成します。
-T show
テーブルの内容 (アドレス) を表示します。
-T test
与えられたアドレスがテーブルに適合するかテストします。
-T zero
テーブルのすべての統計値をクリアします。
-T load
pf.conf(5) からテーブル定義のみをロードします。これは、次のように -f フラグに関連して使用されます:

# pfctl -Tl -f pf.conf

add, delete, replacetest コマンドのために、アドレスのリストは、 -f フラグを使用して、直接コマンドラインおよび/またはアンフォーマットされたテキストファイルのいずれかで指定することができます。‘#’で始まるコメントがテキストファイルで許されています。 pfctl が、次の文字の 1 つによって前に付けられる、それぞれの個々のアドレスのための操作の詳細な結果を印刷する場合に、これらのコマンドで、 -v フラグは、一度か二度使用することもできます:

A
アドレス/ネットワークが追加されました。
C
アドレス/ネットワークが変更されました (否定されます)。
D
アドレス/ネットワークは、削除されました。
M
アドレスは、適合します ( test 操作専用)。
X
アドレス/ネットワークは、コピーされ、したがって、無視されます。
Y
アドレス/ネットワークは、相反する‘!’属性のために追加/削除することができません。
Z
アドレス/ネットワークは、クリアされました (統計値)。

各テーブルは、 pfctl-v フラグを使用して検索することができる 1 組のカウンタを維持することができます。例えば、次のコマンドは、 OpenBSD FTP サーバから出て行くか、またはやって来るパケットの経過を追う広くオープンされたファイアウォールを定義します。次のコマンドは、FTP サーバにファイアウォールを設定して、10 ping (ピング) を送信します:

# printf "table <test> counters { ftp.openbsd.org }\n \ 
    pass out to <test>\n" | pfctl -f- 
# ping -qc10 ftp.openbsd.org

現在、それぞれのアドレスとパケット方向、テーブルを参照する規則によって通過されるか、またはブロックされているパケットとバイトの数を出力するためにテーブル show コマンドを使用することができます。現在のアカウントが始まった時間は、“Cleared”行でも表示されます。

# pfctl -t test -vTshow 
   129.128.5.191 
    Cleared:     Thu Feb 13 18:55:18 2003 
    In/Block:    [ Packets: 0        Bytes: 0        ] 
    In/Pass:     [ Packets: 10       Bytes: 840      ] 
    Out/Block:   [ Packets: 0        Bytes: 0        ] 
    Out/Pass:    [ Packets: 10       Bytes: 840      ]

同様に、 -v 修飾辞を二度使用することと -s Tables コマンドによってテーブルに関するグローバルな情報を見ることが可能です。これは、各テーブルのアドレスの数、テーブルを参照する規則の数、と全体のテーブルのためのグローバルなパケット統計値を表示します:

# pfctl -vvsTables 
--a-r-C test 
    Addresses:   1 
    Cleared:     Thu Feb 13 18:55:18 2003 
    References:  [ Anchors: 0        Rules: 1        ] 
    Evaluations: [ NoMatch: 3496     Match: 1        ] 
    In/Block:    [ Packets: 0        Bytes: 0        ] 
    In/Pass:     [ Packets: 10       Bytes: 840      ] 
    In/XPass:    [ Packets: 0        Bytes: 0        ] 
    Out/Block:   [ Packets: 0        Bytes: 0        ] 
    Out/Pass:    [ Packets: 10       Bytes: 840      ] 
    Out/XPass:   [ Packets: 0        Bytes: 0        ]

ここを見ることができるように、1 つのパケットだけが-初期の ping 要求-テーブルと適合しますが、状態の結果として渡されたすべてのパケットは、正しく説明されます。 (複数の) テーブルを再ロードすることか、ルールセットは、何らかの方法でパケットのアカウントに影響しません。 2 つの“XPass”カウンタは、“ステートフル”パケットが渡されますが、それ以上テーブルに適合しないとき、“Pass”カウンタの代わりに増加されます。 ping(8) コマンドが実行される間に、だれかがテーブルをフラッシュするなら、これは、私たちの例で起こります。

一つの -v と共に使用されるとき、 pfctl は、テーブルフラグと名前を含む最初の行を表示するだけです。フラグは、次の通りに定義されます:

c
pf.conf(5) の外側でテーブルを変更することができない、定数テーブル用。
p
それらを参照する規則がないとき、自動的に kill されない、永続的なテーブル用。
a
active なテーブルセットの一部であるテーブル用。このフラグのないテーブルは、本当に存在していなくて、アドレスを含むことができないで、 -g フラグが与える場合にだけ、リストされます。
i
inactive なテーブルセットの一部であるテーブル用。このフラグは、 pf.conf(5) のローディングの間に簡潔に見ることができるだけです。
r
規則によって参照される (使用された) テーブル用。
h
このフラグは、主なルールセットのテーブルが、その下にアタッチされたアンカから同じ名前の 1 つ以上によって隠されているとき、設定されます。
C
このフラグは、アドレス毎のカウンタがテーブルで有効にされるとき、設定されます。
-t table
テーブルの名前を指定します。
-v
より冗長な出力を生成します。 -v の 2 番目の使用は、ルールセット警告を含むさらに冗長な出力を生成します。テーブルコマンドへの効果については、前のセクションを参照してください。
-x level
次の 1 つへの (簡略化されるかもしれない) デバッグ level を設定します:

-x none
デバッグメッセージを生成しません。
-x urgent
重大なエラーだけデバッグメッセージを生成します。
-x misc
様々なエラーのデバッグメッセージを生成します。
-x loud
共通の状態のデバッグメッセージを生成します。
-z
規則毎の統計値をクリアします。

関連ファイル

/etc/pf.conf
パケットフィルタ規則ファイル。
/etc/pf.os
パッシブ (受動的な) オペレーティングシステム指紋データベース。

歴史

pfctl プログラムと pf(4) フィルタメカニズムは、 OpenBSD 3.0 ではじめて登場しました。
June 21, 2011 FreeBSD