fwbuilder がこの種のツールの中で最良のツールであることは疑いありません。
iptables と ip6tables コマンドを使うことで、netfilter ファイアウォールをユーザ空間から制御することが可能です。iptables と ip6tables コマンドの違いは、iptables が IPv4 ネットワークを取り扱うのに対し、ip6tables は IPv6 ネットワークを取り扱うという点です。おそらく IPv4 と IPv6 のネットワークプロトコルスタックは長きにわたり共存するでしょうから、両方のツールを並行して実行する必要があります。
filter はフィルタリングルール (パケットを受け入れる、拒否する、無視するなど) に関係します。
nat はパケットの送信元や宛先アドレスおよびポート番号の変換に関係します。
mangle は IP パケットに対するその他の変換に関係します (ToS — Type of Service — フィールドやオプションが含まれます)。
raw を使うことで、パケットが接続追跡システムに到達する前にパケットを手作業で別の変更を加えることが可能です。
filter テーブルは 3 種類の標準的なチェインを備えています。
INPUT。このチェインは宛先がファイアウォール自身のパケットに関係します。
OUTPUT。このチェインはファイアウォールから送信されたパケットに関係します。
FORWARD。このチェインはファイアウォールを通過するパケットに関係します (ファイアウォールはパケットの送信元でも宛先でもありません)。
nat テーブルも 3 種類の標準的なチェインを備えています。
PREROUTING。このチェインはパケットの到着直後にパケットを修正します。
POSTROUTING。このチェインはパケットを宛先に送信する準備が完了した時にパケットを修正します。
OUTPUT。このチェインはファイアウォールそれ自身によって生成されたパケットを修正します。
-j オプションが存在します)。最も一般的な挙動は標準化されており、それぞれの挙動に対する専用の動作が存在します。標準的な動作が選択されると、チェインの処理は中止されます。なぜなら、パケットの運命は既に決まっているからです (以下で言及されている除外に一致する場合を除きます)。
ACCEPT。これは対象のパケットの通過を許可します。
REJECT。これは対象のパケットを拒否して ICMP エラーを返答します (iptables の --reject-with type オプションを使えば返答するエラーの種類を選ぶことが可能です)。
DROP。これは対象のパケットを削除 (無視) します。
LOG。これは対象のパケットと一緒にメッセージをログに記録 (syslogd を使って) します。ログ記録が選択された場合チェインの処理は中止されない点に注意してください。チェインの実行は次のルールに進みます。このため、拒否されたパケットをログに記録するには、LOG と REJECT/DROP ルールの両方が必要です。
ULOG。これは ulogd を介してメッセージをログに記録します。ulogd は大量のメッセージを処理する場合に syslogd よりも効率が良いです。LOG と同様、この場合も処理は呼び出されたチェインの次のルールに進む点に注意してください。
RETURN。これは現在のチェインの処理を中止し、呼び出されたチェインに戻ります。現在のチェインが標準的なチェインの場合、呼び出されたチェインはありませんから、代わりにデフォルトの動作 (iptables の -P オプションで定義された動作) が実行されます。
SNAT (nat テーブルの中だけでのみ使うことが可能です)。これは Source NAT を適用します (追加オプションを使って適用する正確な変更を設定します)。
DNAT (nat テーブルの中だけでのみ使うことが可能です)。これは Destination NAT を適用します (追加オプションを使って適用する正確な変更を設定します)。
MASQUERADE (nat テーブルの中だけでのみ使うことが可能です)。これはマスカレードを適用します (マスカレードは Source NAT の特別な場合です)。
REDIRECT (nat テーブルの中だけでのみ使うことが可能です)。これはファイアウォールの指定したポートに対象のパケットを転送します。さらにこれを使って、クライアント側に特別な設定をせずとも動作する透過的なウェブプロキシをセットアップすることが可能です。なぜなら、クライアントは宛先に接続していると思っていても、実際の通信はプロキシを通過しているからです。
mangle テーブルに関する動作、は本書の範囲を超えています。iptables(8) と ip6tables(8) には包括的なリストが含まれています。
iptables と ip6tables コマンドを使って、テーブル、チェイン、ルールを操作することが可能です。-t table オプションで操作対象のテーブルを指定します (デフォルトの場合、filter テーブルを操作します)。
-N chain オプションは新しいチェインを作成します。-X chain は空で使われていないチェインを削除します。-A chain rule はルールをチェインの最後に追加します。-I chain rule_num rule オプションは指定したルール番号 rule_num の前にルールを挿入します。-D chain rule_num (または -D chain rule) オプションはチェインからルールを削除します。そして初めの構文はルール番号を指定してルールを削除し、後の構文はルール内容を指定してルールを削除します。-F chain オプションはチェインをクリアします (チェインに含まれるすべてのルールを削除します)。一方、チェインを指定しなかった場合、テーブルに含まれるすべてのルールを削除します。-L chain オプションはチェインに含まれるルールを表示します。最後に、-P chain action オプションは指定したチェインのデフォルト動作、「ポリシー」、を定義します。しかし、ポリシーを設定できるのは標準的なチェインだけという点に注意してください。
conditions -j action action_options の形で指定します。複数の条件が同じルールとして表現された場合、複数の条件は結合 (論理 and) されます。つまり、各条件の結果をさらに限定することを意味します。
-p protocol 条件は IP パケットのプロトコルフィールドに一致します。最も普通の値は tcp、udp、icmp、icmpv6 です。条件の前に感嘆符を付けることで、その条件を否定したことになります。つまり「指定したプロトコル以外のすべてのプロトコルを使ったパケット」に一致します。条件否定の方法は -p オプションに限らず、他のすべての条件に適用することが可能です。
-s address または -s network/mask 条件は対象のパケットの送信元アドレスに一致します。同様に、-d address または -d network/mask は宛先アドレスに一致します。
-i interface 条件は指定したネットワークインターフェースから受信したパケットを選択します。-o interface は指定したインターフェースから送信されるパケットを選択します。
-p tcp 条件は TCP ポート番号を指定して条件範囲を狭めることが可能です。これを行うには、--source-port port と --destination-port port を使います。
--state state 条件は接続中のパケットの状態を検査します (接続追跡を行うための ipt_conntrack カーネルモジュールが必要です)。NEW 状態は新しい接続の開始するパケットを意味します。そして ESTABLISHED は既に存在する接続に関連するパケットに一致します。RELATED は既存の接続に関連する新しい接続を開始するパケットに一致します (これは FTP プロトコルの「アクティブ」モードを使った ftp-data 接続の際に有益です)。
LOG 動作は以下のオプションを持ちます。
--log-level は記録する syslog メッセージの重要度を指定します。デフォルトの場合 warning 以上の重要度を持つメッセージが記録されます。
--log-prefix はログに記録するメッセージを特徴づけるために行の先頭に付けるテキストを指定します。
--log-tcp-sequence、--log-tcp-options、--log-ip-options はログメッセージに含める追加的なデータを指定します。具体的に言えば、それぞれ TCP シーケンス番号、TCP オプション、IP オプションをログメッセージに含めます。
DNAT 動作には --to-destination address:port オプションを指定することが可能です。これは新しい宛先 IP アドレスおよびポート番号を指定するオプションです。同様に、SNAT には --to-source address:port を指定することが可能です。これは新しい送信元 IP アドレスおよびポート番号を指定するオプションです。
REDIRECT 動作には --to-ports port(s) オプションを指定することが可能です。これはパケットの転送先ポート番号またはポート番号範囲を指定します (REDIRECT 動作は NAT を有効化している場合にのみ使うことが可能です)。
iptables/ip6tables を 1 回実行する必要があります。これらのコマンドを手作業で実行することは退屈なので、通常スクリプトの形で保存しておきます。こうすることで、マシンの起動時に同じ設定を自動的に適用することが可能です。このスクリプトは手作業で書かなければいけませんが、fwbuilder などの高レベルツールを使ってスクリプトを準備することも興味深いでしょう。
#apt install fwbuilder
fwbuilder にそのルールを変換してもらうか、のどちらか一方を行うことが可能です。
fwbuilder は定義されたルールに従ってファイアウォールを設定するためのスクリプトを生成することが可能です。モジュール式のアーキテクチャのおかげで、fwbuilder はさまざまなファイアウォールシステム (Linux の iptables、FreeBSD の ipf、OpenBSD の pf) を設定するためのスクリプトを生成することが可能です。
/etc/network/interfaces ファイルの up 指示文に登録する方法も推奨されます。以下の例では、設定スクリプトは /usr/local/etc/arrakis.fw に保存されています。
例 14.1 ファイアウォールスクリプトを呼び出す interfaces ファイル
auto eth0
iface eth0 inet static
address 192.168.0.1
network 192.168.0.0
netmask 255.255.255.0
broadcast 192.168.0.255
up /usr/local/etc/arrakis.fw