はじめに
本記事は『Linux® Firewalls: Enhancing Security with nftables and Beyond, Fourth Edition(Steve Suehring著)』の内容をもとにした技術書評・要約記事です。Linuxカーネル3.13系以降で標準となったnftablesを中心に、パケットフィルタリングの基礎から実践的なファイアウォール設計まで、網羅的に解説しています。インフラ・バックエンドエンジニア、セキュリティに興味のあるすべてのエンジニアにとって、体系的な知識の整理に役立てていただけると思います。
第I部 パケットフィルタリングと基本的なセキュリティ対策
第1章 パケットフィルタリングファイアウォールの基礎概念
ファイアウォールの役割と限界
ファイアウォールとは「インターネット接続ポイントにおけるセキュリティポリシーを実施するマシン」です。要塞ファイアウォール(bastion firewall)とも呼ばれ、外部からの不正アクセスに対する主要な防衛線を担います。ただし、ファイアウォールはセキュリティの一部に過ぎません。スパイウェアや悪意のあるメールへのクリックなど、エンドポイント起因の脅威には対応できない点を念頭に置くことが重要です。
セキュリティはハードウェアではなく、プロセスです。
OSIモデルとプロトコルの関係
パケットフィルタリングを理解するうえで、OSIモデルの各層の役割を把握することが前提になります。
| 層 | 名称 | 代表プロトコル |
|---|---|---|
| 3 | ネットワーク層 | IP |
| 4 | トランスポート層 | TCP / UDP |
| 7 | アプリケーション層 | HTTP / FTP 等 |
パケットフィルタリングは主に第3層・第4層で動作します。IPアドレス・ポート番号・TCPフラグなどのヘッダ情報を元にポリシーを適用します。
IPアドレスとサブネット
IPv4アドレスはクラスA〜Eに分類され、実用で使われるのはA〜Cです。CIDRによるサブネット化を使うことで、必要最小限のアドレス空間を割り当てられます。
クラスA: 10.0.0.0 〜 10.255.255.255
クラスB: 172.16.0.0 〜 172.31.255.255
クラスC: 192.168.0.0 〜 192.168.255.255
TCPの3ウェイハンドシェイクとフラグ
TCPは接続指向プロトコルであり、通信確立に3ウェイハンドシェイクを用います。
- クライアント → サーバー: SYN(接続要求)
- サーバー → クライアント: SYN-ACK(受諾)
- クライアント → サーバー: ACK(確認)→ 接続確立(ESTABLISHED)
重要: 最初のSYNパケットにはACKフラグが付きません。これはファイアウォールがクライアント側のリクエストとサーバー側のレスポンスを区別するうえで非常に重要な情報です。
NATとIPv4アドレス不足
NATはプライベートIPアドレスを外部IPに変換することで、IPv4アドレス枯渇問題を実質的に先送りしてきた仕組みです。しかし、P2Pやマルチメディアプロトコルなどエンドツーエンドの透明性が必要なトラフィックとは相性が悪く、ALG(アプリケーションレベルゲートウェイ)などの仕組みが別途必要になります。
第2章 パケットフィルタリングの概念
ステートレス vs ステートフルファイアウォール
| 種別 | 特徴 |
|---|---|
| ステートレス | IP層でパケット単位に判断。シンプルだが限界あり |
| ステートフル | 接続状態を追跡。TCPハンドシェイクの整合性を確認可能 |
| ALG | アプリケーション層を解析。FTP・マルチメディアに対応 |
ステートフルファイアウォールは、過去に確立されたTCPセッションに基づいてパケットを許可・拒否します。UDPはコネクションレスのため管理が難しいですが、最近の通信との対応付けで一定の追跡が可能です。
デフォルトポリシーの選択
ファイアウォールのポリシーには2種類あります。
| ポリシー | 概要 | 推奨度 |
|---|---|---|
| すべてを拒否(deny all) | 必要なものだけ明示的に許可 | ✅ 推奨 |
| すべてを許可(accept all) | 危険なものだけ明示的に拒否 | ❌ 非推奨 |
「すべてを拒否」するアプローチは事前の設定コストが高いですが、安全性の観点から圧倒的に優れています。商用ファイアウォールの多くがこのポリシーのみをサポートしています。
DROP と REJECT の違い
NetfilterにはDROP(破棄)とREJECT(拒否してICMPエラーを返す)の2つがあります。
| アクション | 動作 | 推奨 |
|---|---|---|
| DROP | パケットを黙って破棄 | ✅ 多くの場合こちら |
| REJECT | ICMPエラーを返して拒否 | 状況による |
DROPを推奨する理由は主に3つです。
- エラー応答はネットワークトラフィックを倍増させる
- 応答パケット自体がDoS攻撃に悪用される可能性がある
- エラーメッセージが攻撃者に情報を与えてしまう
スプーフィングと不正アドレスのブロック
外部インターフェースで受信パケットの送信元IPとして、以下のアドレスが来た場合は偽装を疑うべきです。
- 自マシン自身のIPアドレス
- LANのプライベートIPアドレス帯(10.x, 172.16.x, 192.168.x)
- マルチキャストアドレス(224.0.0.0〜239.255.255.255)
- ループバックアドレス(127.0.0.0/8)
- リンクローカルアドレス(169.254.0.0/16)
nftablesやiptablesでは、これらのアドレスをINPUTチェーンで明示的にDROPするルールを先頭に追加することが定石です。
代表的なDoS攻撃パターン
本書では以下の主要なDoS攻撃が詳しく解説されています。
TCP SYNフラッド
攻撃者が偽装した送信元アドレスで大量のSYNを送る
→ サーバーがSYN-ACKを返しても完了しない半開き接続が積み重なる
→ 接続リソースが枯渇し、新規接続を受け付けられなくなる
対策として、LinuxのSYN Cookieが有効です。
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
Ping of Death / Smurf攻撃
Ping of Death: 最大許容サイズを超えた巨大pingでクラッシュを狙う
Smurf攻撃: 被害者のIPを偽装しブロードキャストでechoを大量送信
現代のLinuxはPing of Deathに脆弱ではありませんが、ファイアウォール背後の古いホストを保護する場合は注意が必要です。
UDPフラッド
UDPはステートレスかつコネクションレスのため、特にDoS攻撃に悪用されやすいプロトコルです。不要なUDPポートはすべて閉じておくことが原則です。
フラグメント爆弾(Fragment Bomb)
IPフラグメンテーションを悪用し、ファイアウォールを迂回してパケットを到達させる手法です。最初のフラグメントにはトランスポートヘッダがありますが、後続のフラグメントにはないため、ファイアウォールが誤って通過させてしまうことがあります。
第II部 高度な問題、複数のファイアウォール、境界ネットワーク
iptables から nftables へ
本書のテーマの一つが、Linuxカーネル3.13以降で導入されたnftablesへの移行です。
| 項目 | iptables | nftables |
|---|---|---|
| カーネルバージョン | 2.4系〜 | 3.13系〜 |
| 構文 | テーブル・チェーン・ルール | より統一的な構文 |
| 変数サポート | なし | あり |
| IPv4/v6統合 | 別コマンド | 統合済み |
| パフォーマンス | ルール数が増えると線形評価 | セット・マップで効率化 |
nftablesでは変数定義や外部ファイルの読み込みが可能になり、より保守性の高いルールセットを記述できます。
#!/usr/sbin/nft -f
define WAN_IF = eth0
define LAN_NET = 192.168.1.0/24
table ip filter {
chain input {
type filter hook input priority 0; policy drop;
iif lo accept
ct state established,related accept
iif $WAN_IF tcp dport 22 accept
}
}
NAT(ネットワークアドレス変換)
NATには主に以下の3種類があります。
| 種別 | 概要 |
|---|---|
| SNAT(Source NAT) | 送信元アドレスを変換(マスカレード) |
| DNAT(Destination NAT) | 宛先アドレスを変換(ポートフォワーディング) |
| マスカレード | 動的IPに対応したSNATの特殊形 |
nftablesでのマスカレード設定例です。
table ip nat {
chain postrouting {
type nat hook postrouting priority 100;
oif eth0 masquerade
}
}
パケット転送とルーティング
Linuxをルーターとして機能させるには、カーネルのIPフォワーディングを有効にする必要があります。
echo 1 > /proc/sys/net/ipv4/ip_forward
# 永続化する場合は /etc/sysctl.conf に追記
net.ipv4.ip_forward = 1
パケット転送のファイアウォールルールは、FORWARDチェーンで管理します。LAN→WAN方向とWAN→LAN方向で対称的にルールを設計することが、セキュリティの観点から重要です。
ファイアウォールルールのデバッグ
ルールが期待どおりに動作しない場合のデバッグ手法として、本書では以下を紹介しています。
# iptablesのルール確認
iptables -L -n -v --line-numbers
# nftablesのルール確認
nft list ruleset
# パケットキャプチャでの確認
tcpdump -i eth0 -n port 80
パケットカウンタを確認し、どのルールでパケットが処理されているかを特定するアプローチが基本です。
第III部 iptablesとnftablesを超えて
VPN(仮想プライベートネットワーク)
LinuxにはIPsecをはじめとした複数のVPNソリューションが存在します。IPsecはLinuxカーネル2.6系以降で利用可能です。VPN環境では、通常のパケットフィルタリングに加えて暗号化されたトラフィックを考慮したルール設計が必要になります。
侵入検知と対応(IDS/IPS)
ファイアウォールを構築した後のステップとして、本書では階層型セキュリティアプローチを強調しています。
- ネットワークベースIDS: トラフィック全体を監視(例: Snort)
- ホストベースIDS: 個々のホストの変更を監視(例: AIDE, Bastille Linux)
IDS/IPSはファイアウォールを通過したトラフィックの中から、不審なパターンを検出するための重要な第二の防衛線です。
侵入検知ツール
本書で紹介されているホストベースのセキュリティ強化ツールには以下があります。
| ツール | 概要 |
|---|---|
| Bastille Linux | セキュリティ設定の自動化・強化 |
| AIDE | ファイル整合性の監視 |
| Snort | ネットワーク侵入検知 |
| Tripwire | ファイルシステムの変更検知 |
全体を通じた設計指針
本書を通じて繰り返し強調されているセキュリティの原則をまとめます。
1. デフォルト拒否(Default Deny)
chain input {
type filter hook input priority 0; policy drop;
# 必要なものだけ明示的に許可
}
2. 最小権限の原則
- 不要なサービスは停止する
- ファイアウォールマシンはファイアウォール専用にする
- LAN向けサービス(Samba, NFS等)はファイアウォールマシンで動かさない
3. 多層防御
インターネット
↓
境界ルーター(レイヤー3フィルタリング)
↓
ファイアウォール(ステートフルフィルタリング + NAT)
↓
IDS/IPS(侵入検知)
↓
ホストベースセキュリティ(Bastille, AIDE 等)
↓
内部LAN
4. 送受信の対称的なフィルタリング
送信パケットのフィルタリングも受信と同様に重要です。
- 送信元アドレス: 自ネットワークのIPのみ許可(スプーフィング防止)
- 宛先アドレス: 不要なLANサービスがインターネットへ流出しないようにする
- ポート: 非特権ポートの範囲(1024〜65535)でクライアントトラフィックを管理
まとめ
本書『Linux® Firewalls 第4版』は、以下の特徴を持つ実践的な技術書です。
- パケットの仕組みから丁寧に解説しており、OSI/TCP/IPの基礎固めにも有効
- iptables → nftablesへの移行を意識した構成で、現代的な内容にアップデートされている
- DoS攻撃・スプーフィング・ポートスキャンなど実際の脅威を丁寧に解説
- 設計指針と実装例がバランスよく組み合わされており、読んで終わりにならない
インフラ構築・ネットワークセキュリティ・SC試験の学習など、幅広い用途で役立てられる一冊です。Linuxでファイアウォールを設計・運用するすべてのエンジニアに一読をおすすめします。