前書き
RunetでのFreeBSDとPFの設定に関する記事はたくさんありますが、それらはすべて散在していて体系的ではありません。また、ファイアウォールによるルーティング(ポリシーベースルーティング)など、多かれ少なかれ興味深いことについては、OpenBSD PFFAQなどの元のドキュメントを読む必要があります 。ただし、FreeBSDとOpenBSDのコマンド構文には違いがあります。このシリーズの記事では、PFの機能を単純なものから複雑なものまで体系化して分析しようとしています。確かに、この紹介記事は、パケットフィルターに関する他のすべての記事と同様です。したがって、基本的な機能に既に精通している人は興味がありません。ただし、紹介なしではできないので、お肉は以下の記事に掲載します。
PF - Packet Filterは、もともとOpenBSDプロジェクトによって作成されたファイアウォールです。2003年にFreeBSDに移植されました。2004年にそれはメインシステムに統合されました。主な機能:
- アドレス、ポート、プロトコル、インターフェースに基づくフィルタリング
- NAT-送信元NAT、送信者のアドレスの置換。宛先NAT、受信者アドレスのなりすまし、ポート転送
- スクラブ-ネットワークトラフィックの正規化。特別に準備されたパケットの形成に基づいて、いくつかのタイプのdos攻撃を支援します
- SYNプロキシ-SYNフラッド攻撃に対する保護
- 接続のバランスをとる
- — pfcync , , CARP, ,
- ( IP-, 2 )
- —
- — IP
- — ,
- (anchors) — , IPTables Linux
- pfstat
同じIPTablesとの主な違いは、通常とは異なる 作業スキームです。最初のルールが一致した後、バッチ処理は終了しません。つまり、最初のルールを「すべて拒否」に設定すると 、パケットは破棄されませんが、禁止としてマークされ、ルールに従ってさらに進み、ルールで許可されていない場合は破棄されます。 。これを理解して使用することが重要です。ただし、必要に応じて、この動作をルールのクイックパラメーターで上書きできます 。
管理と役立つコマンド
PFを有効にするには、「/ etc /rc.conf」ファイルでオプションを指定するだけで十分です。
pf_enable="YES" # pf pf_flags="" # pfctl pf_rules="/etc/pf.conf" # pflog_enable="YES" # pflog pflog_flags="" # pflog pflog_logfile="/var/log/pflog" #
基本的なファイアウォールコマンド: pfctl-#ファイアウォールを
有効にする
pfctl -d#ファイアウォールを無効にする
pfctl -nf#
pfctlファイルの構文を確認する -f#ファイル
からルールを再読み込みする
pfctl -Rf#ファイルからフィルタールールを再読み込みする pfctl -Nf#ファイル
pfctlからNATルールを再読み込みする -sa#すべての状態を表示
pfctl -s#フィルタリングルールを表示
pfctl -sn#NATルールを表示
pfctl -sアンカー-v#アンカーツリーを表示
pfctl -ss#現在の接続を表示
構成ファイルの構造と基本設定
構成ファイルは次のセクションで構成されています。
- マクロ
- テーブル
- オプション
- トラフィックの正規化ルール(スクラブ)
- キュー、優先順位付け、速度制御
- NATアドレス変換
- パケットフィルタリング
ルールの構文は通常、次のとおりです。
action [direction] [log] [quick] [on interface] [af] [proto protocol] [from src_addr [port src_port]] [to dst_addr [port dst_port]] [flags tcp_flags] [state]
アクション-パケットの
方向で何をすべきか -インアウト、
ログの方向 -パケットがpflogに
すばやく入るかどうか -パケットがこのルールに該当する場合、それ以上の処理はありません。このルールは、のために最後になり
インターフェイスパケット -ネットワークインタフェースの名前
AF -アドレスファミリ、INETまたはINET6、IPv4またはIPv6、それぞれ
プロトコル-レイヤ4プロトコル、例えば:TCP、UDP、ICMP
scr_addr、dst_addr -ソースおよび宛先
アドレスsrc_port、dst_port -
tcp_flagsポート -tcpフラグ
状態-状態を保存するためのオプション。たとえば、状態を保持するとは、接続が状態テーブルに保持され、応答パケットが通過できることを意味します。デフォルトの動作。
最も単純なWebサーバーを真空状態にします。tcpポート22、80、443(ssh、http、https)で着信接続を開く必要があります。また、tcpポート22、80、443(ssh、http、https)およびudp 53、123(dnsおよびntp)で発信接続を開く必要があります。他のすべてを禁止します。
# ee pf.conf #macros section permit_tcp_ports="22,80,443" permit_udp_ports="53,123" #table section # #options section set block-policy return # , set skip on lo0 # , #scrub section scrub in all # #Queueing section # #nat section # , #filtering section block all # , , . pass in proto tcp to port { $permit_tcp_ports } # pass out proto tcp to port { $permit_tcp_ports } # tcp pass out proto udp to port { $permit_udp_ports } # udp pass out inet proto icmp # icmp
次に、構文チェックコマンドを入力します
。pfctl-nfpf.conf
エラーメッセージがない場合は、次のコマンドを入力してルールを適用します
。pfctl-f pf.conf
チェックするには、フィルタリングルールを確認します。
# pfctl -sr scrub in all fragment reassemble block return all pass out proto tcp from any to any port = ssh flags S/SA keep state pass out proto tcp from any to any port = http flags S/SA keep state pass out proto tcp from any to any port = https flags S/SA keep state pass out proto udp from any to any port = domain keep state pass out proto udp from any to any port = ntp keep state pass out inet proto icmp all keep state pass in proto tcp from any to any port = ssh flags S/SA keep state pass in proto tcp from any to any port = http flags S/SA keep state pass in proto tcp from any to any port = https flags S/SA keep state
ご覧のとおり、マクロはポートごとに個別のルールに展開され、順序は自動的に変更されます。それ以外の場合は、すべてが正常です。
結果
パケットフィルターとは何かを理解し、その主な機能を学びました。 PF構成とその主要セクションの構造を理解しました。最も単純な構成を作成しましたが、マクロ、パケットの正規化、着信パケットと発信パケットのフィルタリングなど、非常に機能的です。次の記事では、フィルタリングルール、状態管理、およびフラグについて詳しく見ていきます。
私たちのソリューションである InternetControl Serverは、FreeBSD上に構築されたセキュリティゲートウェイです。このシステムが選択されたのは、その安定性、ネットワークスタックの速度、カーネルに組み込まれたZFSサポート、およびライセンスの問題がないためです。また、FreeBSDでの作業は、簡単ではありませんが、楽しいものです。しかし、私たちはあなたとこの経験を共有させていただきます!