9.3. パケットフィルタリング
9.3.1. ファイアウォールの基本構造と概念
ファイアウォールのアーキテクチャ
ファイヤーウォールのアーキテクチャにはパケットフィルタリング型とゲートウェイ型がある。
- パケットフィルタリング型- 通信を細分化したパケットを監視するファイアウォール
- 通信をパケット単位で解析し、決められたルールに基づいて通過の許否を判断する
- アプリケーション層レベルの判断はできない
 
- ゲートウェイ型- 内部コンピュータの代わりに通信を行うファイアウォール
- アプリケーション型、プロキシサーバ型とも呼ばれる
- データの細切れであるパケットの中身まで把握できる
- アプリケーション層(FTP, HTTPなど)でのフィルタリングを行うことができる
 
パケットフィルタリング型ファイヤーウォール
パケットフィルタリング型には以下の2種類がある。
- ステートレス … 個々のパケットについて、スタティックなIPアドレスおよびポート番号のみのフィルタリングを行う
- ステートフル … 往きのパケットに基づき、戻りのパケットに対してもフィルタリングルールを適用する
9.3.2. Netfilterとiptables/ip6tablesの利用
Netfilter
Netfilterはカーネルモジュールであり、カーネルがインターフェイスに転送するネットワークトラフィックはすべて netfilter を通過するようになっている。
netfilterモジュールへの主要なインターフェイスはiptablesであり、Linux ファイアウォールで高度な構成を行うことができる。
iptablesは複雑であるため、ufw 、 firewalld などの他の解決策が考案された。
これらは iptables と連携して動作し、ファイアウォールの設定を簡単に行えるようにする。
iptablesの構造と理解
テーブルの機能
iptablesはテーブルとして動作し以下の3種類の機能を提供する。
- Filter … パケットフィルタリングとして使用される
- NAT … アドレス変換に使用される
- MANGLE … パケットを特別な処理をしたい場合に使用される
チェインの種類
各テーブルにはチェインがあり、どの種類のパケットをフィルタリングするか定義するために使用される。
以下の種類がある。
- PREROUTING - (NAT, MANGLE)- パケットがルーティングテーブルに渡される前に処理する
- 通常はパケットを別のアドレスまたはポートにリダイレクトするために使用する(DNAT)
 
- INPUT - (NAT, Filter, MANGLE)- パケットがホストに到着するときに処理する
- ネットワークからの着信接続や、ローカルプロセスからのローカルホストへの通信が含まれる
 
- OUTPUT - (NAT, Filter, MANGLE)- ホストから発信されるパケットを処理する
- ローカルホストから外部のネットワークへの接続や、ローカルプロセスからの通信が含まれる
 
- FORWARD - (Filter, MANGLE)- ホストを経由して他のホストに送信されるパケットを処理する
- ルーターがパケットを他のネットワークセグメントにルーティングする際に使用する
 
- POSTROUTING - (NAT, MANGLE)- パケットがルーティングテーブルを通過した後に処理する
- パケットが送信元または宛先の IP アドレスを変更するために使用する
 
ターゲットの種類
チェインはルールを作成できるフィルタリングポイントであり、ルールはトラフを通過するパケットに適用される。
ルールは、パケットに対して正確に何が起こるべきかを定義するもので以下のようにターゲットを指定できる。
- ACCEPT … パケットの許可
- DROP … パケットをドロップする
- REJECT … パケットを拒否し、送信者にはICMP警告メッセージを送信する
- LOG … ログを取る
- MASQUARATE … NATに使用される
iptables/ip6tablesの利用と理解
iptablesコマンド
iptablesコマンドは、Linuxシステムでファイアウォールを構成および管理するためのコマンド。
詳しくはコチラから。
iptablesは、パケットのフィルタリング、NAT (Network Address Translation)、パケットの転送などの機能を提供している。
iptables -A chain [-i/-o interface] [-s/-d address] -p udp --sport/--dport 80  -j TARGET| オプション | 説明 | 
|---|---|
| -L <チェーン名> -t <テーブル名> | 指定されたチェーンおよびテーブル内のすべてのルールをリストする。チェーンまたはテーブルが指定されていない場合は、すべてを表示する。 | 
| -D | 特定のチェーン内のルールを番号によって削除する | 
| -バツ | チェーンを削除する | 
| -F (または –flush) | ルールのすべて (または指定されたチェーン) をフラッシュする | 
| -P | チェーンのデフォルトポリシーを変更する(DROPまたはACCEPTに設定可能) | 
| -v | 通常は、追加の出力を提供するために -F(または –flush) とともに使用される | 
| -n | IPアドレスとポートを数値形式で表示する | 
# 現在のルールをリストする
iptables -nvL
# ポリシの作成
iptables -P INPUT DROP
# ルールの追加
iptables [-t table] {-A|-C|-D} chain rule-specification
# -A : 選択したチェーンの末尾に 1 つ以上のルールを追加
# -C : 仕様に一致するルールが選択したチェーンに存在するかどうかを確認
# -D : 選択したチェーンから 1 つ以上のルールを削除
# ルールの挿入
iptables [-t table] -I chain [ルール番号] rule-specification
# ルールの削除
iptables [-t table] -D chain ルール番号
# パケットカウンタとバイトカウンタをゼロに設定
iptables [-t table] -Zip6tables
Ip6tables はIPv6パケットフィルタルールのテーブルの設定、維持、および検査に使用される。
ルールの永続化と復元
iptables-saveコマンド
iptables-saveはiptablesルールを永続保存するためのコマンド。
- iptables-save > /etc/sysconfig/iptables.$(date +%d-%m-%y)
- -c:パケットカウンタ及びバイトカウンタの現在値を表示
- -t テーブル:テーブルを指定
iptables-restoreコマンド
iptables-restoreはバックアップの設定からiptablesの設定を復元するコマンド。
- iptables-restore < /etc/sysconfig/iptables.20-09-22
- -c:パケットカウンタ及びバイトカウンタの値を復元
- -n:復元する際に現在のテーブル内容を削除しない
/etc/sysconfig/iptables
/etc/sysconfig/iptablesはブート時またはサービスの開始時にカーネルがパケット フィルタリング サービスを設定するために使用する情報が保存されるファイル。
9.3.3. コネクショントラッキングとネットワークアドレス変換 (NAT)
コネクショントラッキング (Connection Tracking) の実施
Conntrackの目的と機能(論理ネットワーク接続の追跡)
ConntrackはLinux カーネルのネットワークスタックの中核機能の1つでカーネルはすべての論理ネットワーク接続またはフローを追跡でき、各フローを構成するすべてのパケットを識別して、それらを一貫して一緒に処理できる機能のこと。
Conntrackは通常、フロー内の最初のパケットのみが完全なネットワークスタック処理を通過して処理を決定する必要があるため、パフォーマンスを向上させる (CPU の削減とパケット遅延の削減)。
設定ファイルは/proc/sys/net/nf_conntrack_maxとなる。
またconntrack-toolsパッケージには 2 つのプログラムが含まれている。
- conntrack- 接続追跡システムと対話するためのフル機能のコマンド ライン ユーティリティを提供する
- 既存のフロー エントリを一覧表示、更新、削除できる
 
- conntackd- ユーザー空間の接続追跡デーモン
- ユーザスペースで動作する
 
ネットワークアドレス変換 (NAT) の実施
NATは送信元と宛先の IP アドレスとポートを変更すること。
アドレス変換により、IPv4 パブリック アドレスの必要性が減り、プライベート ネットワーク アドレス範囲が隠蔽される。
このプロセスは通常、ルーターまたはファイアウォールによって実行される。
- SNAT- ソースのプライベート IP アドレスをパブリック IP アドレスに変換するプロセスのこと
 
- DNAT- パケットの IP ヘッダー内の宛先アドレスを変更すること
- インターネット ホストからプライベート ホストにトラフィックをリダイレクトするために使用される
 
NATにおけるアドレス変換には以下の種類がある。
- 静的NAT … 1 つのプライベート IP アドレスをパブリック IP アドレスに変換する
- ダイナミックNAT … プライベート IP アドレスはパブリック IP アドレスのプールにマッピングする
- NPAT(PAT) … 1 つのパブリック IP アドレスがすべての内部デバイスに使用されますが、各プライベート IP アドレスには異なるポートが割り当てられる
一般的なモジュール・テスト・ターゲット
iptablesによるIP毎の接続制限
connlimitジュールを使用すると、クライアントIP アドレス (またはアドレス ブロック) ごとにサーバーへの並列 TCP 接続の数を制限できる。
これは、サーバ または VPS をフラッディング、スパム、Webスクレイピングから保護するのに役立つといえる。
iptables -A INPUT -p tcp --syn --dport $port -m connlimit --connlimit-above N -j REJECT --reject-with tcp-reset例は以下の通り。
# クライアントホストごとに3つのSSH接続のみを許可する
iptables  -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j REJECT
# IP/ホストごとに20個のHTTP接続までに制限する
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 -j REJECT --reject-with tcp-resetiptablesによる1秒あたりの接続数制限
stateとrecentモジュールを使用すると、1秒あたりの接続数制限ができる。
9.3.4. 高度なファイアウォール機能と次世代ツール
IPSetとその利用
IPset
IPsetはIPアドレス、ネットワーク範囲、MACアドレス、ポート番号、およびネットワークインターフェイス名の保存されたコレクションであり、 iptablesツールは、IPセットを利用して、より効率的なルール照合を行うことができる。netfilterと連携して使用できる。
利用例としては悪意のある通信元が分かっているアドレスがあるときに、IPセットを作成しiptablesで参照することでルール セットが動的になり、構成が容易になる。
ipsetコマンド
ipsetコマンドはIP セットを作成および変更できるコマンド。
ipset <オプション>range_setは名称、hashは保存方法、netはデータ型を定義する。
ipset create <range_set> <hash:net>オプションは以下の通り。
| オプション | 説明 | 
|---|---|
| -l | 同じセットを作成したとき/すでに孫座敷いているエントリを追加したときなどのエラーを無視 | 
| -n | 既存セットの名前だけ一覧表示 | 
| -o [plain / save / xml] | listコマンドの出力形式を選択 | 
| -q | 標準出力と標準エラー出力の出力抑制 | 
| -r | セット一覧表示時に名前解決を実行 | 
| -s | ソートとして出力 | 
| -t | セット名とヘッダだけの一覧表示 | 
| オプション | 説明 | 
|---|---|
| create | 新しいIPセットを作成 | 
| add | IPセットにエントリを追加 | 
| del | IPセットからエントリを削除 | 
| destroy | IPセットを破棄 | 
| list | IPセットの内容をリスト | 
| flush | IPセット内のすべてのエントリを削除 | 
| test | 指定したIPがIPセットに含まれているかどうかを確認 | 
| swap | 2つのIPセットの内容を交換 | 
| rename | IPセットの名前を変更 | 
# セットの作成
ipset create -exist WHITELIST hash:net
# セットの一覧表示
ipset list
# セットをipsetdateへ保存
ipset save > ipsetdata
# セットをすべて削除
ipset destroy
# セットをipsetdataから復元
ipset restore < ipsetdataipsetの永続化
作成した ipset はメモリに保存され、再起動すると消去される。 ipset を永続的にするには以下コマンドで可能。
ipset save > /etc/ipset.conf復元には以下コマンド。
ipset restore < /etc/ipset.confnftables
nftables(ntf)は iptables の代替ツール。
テーブルやチェインなどが予め用意されていたiptablesに対して、nftではユーザが自分で作成する。
iptablesと比べると以下の特徴がある。
- パフォーマンスの向上
- デフォルトの組み込みフィルタを持たない
- 複数のジャンプを1回で実行可能
- ipsetの機能の組み込み
- コマンドや書式の違い
ルール作成の手順は以下の通り
- テーブル作成 … nft add table
- チェインの作成 … nft add chain
- ルールの作成 … nft add rule
ルールセットの確認はnft list rulesetで可能。
ebtables
ebtablesはイーサネットフレームを検査するルールのテーブル (Linux カーネル内) を設定および維持するために使用されるプログラムのこと。
ebtablesでは、iptablesと同様に「テーブル」「チェイン」「ターゲット」を用いてルールを構築する。
ebtables -Ln # ルール セットを印刷するときに行番号をリスト
ebtables -Lc # 各ルールのパケットおよびバイトカウンターをリストまたebtablesのテーブルには以下の3種類がある。
- filter … Ethernetテーブルのフィルタリング
- nat … MACアドレスの変更
- broute … ブリッジ+ルータの機能を実行