インターネットに接続していると、様々な通信が飛び交っています。
その中には、必要な通信もあれば、不正アクセスや攻撃を目的とした危険な通信もあるのです。
「自分のサーバーを守りたい」
「特定の通信だけを許可したい」
「ファイアウォールってどういう仕組み?」
こうした要望を実現するのが、パケットフィルタリングという技術です。
この記事では、パケットフィルタリングについて、初心者の方にも分かりやすく、基本的な概念から実践的な使い方まで詳しく解説していきます。
パケットフィルタリングとは?ネットワークの「検問所」
パケットフィルタリングの基本
パケットフィルタリングとは、ネットワークを通過するパケット(データの塊)を検査して、通すか遮断するかを判断する技術です。
「フィルタリング」は「ろ過する」という意味で、まさに必要なものだけを通して、不要なものを止める仕組みです。
簡単に言えば、ネットワークの入口に立つ「検問所」や「門番」のようなものだと考えてください。
パケットとは何か
まず、パケットについて理解しましょう。
パケットは、ネットワーク上でやり取りされるデータの小さな単位です。
例えば、Webページを見る時:
- あなたのブラウザがWebサーバーに「このページを見せて」とリクエスト
- このリクエストは小さなパケットに分割される
- パケットがインターネットを通ってサーバーに届く
- サーバーが応答をパケットにして送り返す
- あなたのパソコンでパケットが組み立てられてページが表示される
つまり、インターネット上の通信は、すべてパケット単位で行われているのです。
パケットフィルタリングの仕組み
どのようにして「通す・通さない」を判断するのでしょうか。
パケットに含まれる情報
各パケットには、以下のような情報が含まれています:
送信元の情報:
- 送信元IPアドレス(どこから来たか)
- 送信元ポート番号(どのアプリケーションから)
送信先の情報:
- 送信先IPアドレス(どこへ行くか)
- 送信先ポート番号(どのサービスへ)
その他の情報:
- プロトコル(TCP、UDP、ICMPなど)
- パケットの状態(新規接続、確立済みなど)
フィルタリングの判断基準
パケットフィルタリングは、これらの情報を見て判断します。
判断例:
「送信元が192.168.1.100で、送信先ポートが80番(HTTP)なら許可」
「送信元が不明で、送信先ポートが22番(SSH)なら拒否」
「すでに確立された接続の応答パケットなら許可」
このように、条件に合うパケットだけを通過させるのです。
ルールベースの動作
パケットフィルタリングは、ルール(規則)に基づいて動作します。
ルールの例:
1. 送信元が信頼できるIPなら許可
2. Webサーバー用のポート80と443は許可
3. SSH用のポート22は特定のIPからのみ許可
4. それ以外はすべて拒否
ルールは上から順に評価され、最初にマッチした条件が適用されます。
パケットフィルタリングの種類
いくつかの方式があります。
ステートレスフィルタリング
各パケットを独立して判断する方式です。
特徴:
- シンプルで高速
- 接続の状態を追跡しない
- 細かい制御が難しい
例:
「送信元IPが10.0.0.5なら許可」という単純なルール。
過去の通信や接続状態は考慮されません。
ステートフルフィルタリング
接続の状態を追跡する方式です。
特徴:
- より安全で柔軟
- 接続の流れを理解している
- 応答パケットを自動的に許可できる
例:
あなたのパソコンからWebサーバーへの接続を開始したら、そのサーバーからの応答パケットは自動的に許可されます。
外部から勝手に始まった接続は拒否されます。
現代のファイアウォールは、ほとんどがステートフル型です。
ファイアウォールとの関係
パケットフィルタリングとファイアウォールは密接に関係しています。
ファイアウォールとは
ファイアウォールは、ネットワークを保護するセキュリティシステムの総称です。
「防火壁」という意味で、建物の火災が広がらないように、ネットワーク上の脅威が広がるのを防ぎます。
パケットフィルタリング型ファイアウォール
最も基本的なファイアウォールの種類です。
パケットフィルタリング機能を使って、不正な通信をブロックします。
主な機能:
- IPアドレスベースのアクセス制御
- ポート番号によるサービス制限
- プロトコルの選別
その他のファイアウォール技術
パケットフィルタリング以外にも、様々な技術があります:
アプリケーションゲートウェイ:
より高度な内容のチェック(例:メールの添付ファイル検査)
プロキシサーバー:
間接的な接続で内部ネットワークを隠す
IDS/IPS:
侵入検知・防御システム
Linuxでのパケットフィルタリング
Linuxには、強力なパケットフィルタリング機能が組み込まれています。
iptables:従来の標準ツール
長年使われてきた、Linuxカーネルのパケットフィルタリング機能を操作するツールです。
基本的な考え方:
iptablesには、いくつかのテーブルとチェーンがあります。
主なチェーン:
- INPUT: サーバーに入ってくるパケット
- OUTPUT: サーバーから出ていくパケット
- FORWARD: サーバーを経由して転送されるパケット
iptablesの基本コマンド
現在のルールを表示:
sudo iptables -L -v -n
-L
:リスト表示-v
:詳細表示-n
:名前解決せずに数値で表示
すべての通信を許可(デフォルトポリシー):
sudo iptables -P INPUT ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
特定のポートを開く:
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT
:INPUTチェーンにルールを追加-p tcp
:プロトコルはTCP--dport 80
:送信先ポートは80番-j ACCEPT
:許可する
特定のIPアドレスをブロック:
sudo iptables -A INPUT -s 192.168.1.100 -j DROP
-s
:送信元IPアドレス-j DROP
:破棄する
実用的なiptables設定例
Webサーバーの基本設定:
# まず、すべてのルールをクリア
sudo iptables -F
# デフォルトポリシーを拒否に設定
sudo iptables -P INPUT DROP
sudo iptables -P OUTPUT ACCEPT
sudo iptables -P FORWARD DROP
# ループバック(自分自身)を許可
sudo iptables -A INPUT -i lo -j ACCEPT
# 確立された接続を許可
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# SSH(22番ポート)を許可
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# HTTP(80番ポート)を許可
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# HTTPS(443番ポート)を許可
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# Pingを許可
sudo iptables -A INPUT -p icmp -j ACCEPT
この設定で、基本的なWebサーバーとして必要な通信だけを許可できます。
nftables:新しい標準
nftablesは、iptablesの後継として開発された新しいツールです。
特徴:
- より柔軟で効率的
- 設定が分かりやすい
- IPv4とIPv6を統合的に扱える
基本的な設定例:
# テーブルを作成
sudo nft add table inet filter
# チェーンを作成
sudo nft add chain inet filter input { type filter hook input priority 0 \; policy drop \; }
# SSH接続を許可
sudo nft add rule inet filter input tcp dport 22 accept
# HTTP/HTTPS を許可
sudo nft add rule inet filter input tcp dport { 80, 443 } accept
# 確立された接続を許可
sudo nft add rule inet filter input ct state established,related accept
UFW:簡単なファイアウォール管理
UFW(Uncomplicated Firewall)は、Ubuntuなどで使われる、iptablesをより簡単に扱えるツールです。
基本的な使い方:
UFWを有効化:
sudo ufw enable
デフォルトポリシーを設定:
sudo ufw default deny incoming
sudo ufw default allow outgoing
ポートを開く:
sudo ufw allow 22/tcp # SSH
sudo ufw allow 80/tcp # HTTP
sudo ufw allow 443/tcp # HTTPS
特定のIPからの接続を許可:
sudo ufw allow from 192.168.1.100
ステータス確認:
sudo ufw status verbose
ルールを削除:
sudo ufw delete allow 80/tcp
UFWは、iptablesの複雑なコマンドを覚えなくても、直感的にファイアウォールを設定できます。
パケットフィルタリングの実用例
実際にどんな場面で使われるか見ていきましょう。
Webサーバーの保護
公開Webサーバーでは、HTTPとHTTPSだけを許可し、他の不要なポートは閉じます。
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
これで、Webサービス以外への不正アクセスを防げます。
SSH接続の制限
管理用のSSH接続を、特定のIPアドレスからのみ許可します。
sudo ufw allow from 203.0.113.5 to any port 22
自宅や会社のIPアドレスからだけSSH接続できるようにすれば、総当たり攻撃を防げます。
データベースサーバーの保護
データベースサーバーは、Webサーバーからの接続だけを許可します。
# MySQL(3306番ポート)を、Webサーバー(192.168.1.10)からのみ許可
sudo ufw allow from 192.168.1.10 to any port 3306
外部からの直接アクセスを防ぎ、セキュリティを強化できます。
DDoS攻撃への対策
特定のIPアドレスから大量のパケットが来る場合、そのIPをブロックします。
sudo iptables -A INPUT -s 攻撃元IP -j DROP
ポートスキャン対策
不審なポートスキャン(開いているポートを探す行為)を検出してブロックします。
# 短時間に多数の接続を試みるIPをブロック
sudo iptables -A INPUT -p tcp --syn -m recent --name portscan --set
sudo iptables -A INPUT -p tcp --syn -m recent --name portscan --rcheck --seconds 60 --hitcount 10 -j DROP
パケットフィルタリングのメリット
なぜパケットフィルタリングが重要なのでしょうか。
セキュリティの向上
不要なポートを閉じることで、攻撃を受けるリスクを大幅に減らせます。
開いているポートが少ないほど、攻撃者が侵入できる経路も少なくなります。
不正アクセスの防止
許可されていない通信をブロックすることで、不正なアクセスを防げます。
特に、管理用のポート(SSHなど)へのアクセスを制限すると効果的です。
ネットワークの制御
どのサービスがどこと通信できるかを細かく制御できます。
内部ネットワークのセグメント分けにも活用できます。
リソースの保護
DDoS攻撃など、大量のパケットによる攻撃を軽減できます。
サーバーのリソースを守り、正常なサービス提供を維持できます。
パケットフィルタリングの注意点
便利な反面、注意すべきポイントもあります。
ルールの順序が重要
ルールは上から順に評価されるため、順序を間違えると意図した動作になりません。
悪い例:
sudo iptables -A INPUT -j DROP # すべて拒否(先に書いてしまった)
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT # これは評価されない
最初のルールですべて拒否されるため、2番目のルールに到達しません。
自分自身をロックアウトしない
リモートサーバーの設定では、特に注意が必要です。
SSH接続を誤ってブロックすると、サーバーにアクセスできなくなります。
対策:
- 設定前にバックアップを取る
- コンソールアクセス(VPSの管理画面など)を確保しておく
- 慎重に設定し、確認しながら進める
パフォーマンスへの影響
ルールが多すぎると、パケット処理が遅くなることがあります。
必要最小限のルールにとどめることが大切です。
ログの管理
パケットフィルタリングでブロックされた通信をログに記録すると、大量のログが生成されます。
ディスクスペースを圧迫しないよう、ログローテーション(古いログの削除)を設定しましょう。
パケットフィルタリングとその他のセキュリティ対策
パケットフィルタリングだけでは、完全なセキュリティは実現できません。
多層防御の重要性
セキュリティは、複数の層で守ることが基本です。
セキュリティの層:
- ネットワーク層: パケットフィルタリング、ファイアウォール
- アプリケーション層: WAF(Webアプリケーションファイアウォール)
- システム層: OSの適切な設定、不要なサービスの停止
- データ層: 暗号化、アクセス制御
- 物理層: サーバールームへのアクセス制限
組み合わせるべき対策
定期的なアップデート:
ソフトウェアの脆弱性を修正するため、常に最新に保ちます。
侵入検知システム(IDS):
不審な活動を検出して通知します。
ログ監視:
アクセスログを定期的に確認し、異常がないかチェックします。
バックアップ:
万が一の侵入に備えて、定期的にバックアップを取ります。
まとめ:パケットフィルタリングでネットワークを守ろう
パケットフィルタリングについて、重要なポイントをおさらいしましょう。
パケットフィルタリングとは:
- ネットワークを通過するパケットを検査し、許可・拒否を判断する技術
- ネットワークの「検問所」や「門番」の役割
- ファイアウォールの基本機能
主な仕組み:
- パケットのIPアドレス、ポート番号、プロトコルなどを検査
- ルールに基づいて通過の可否を決定
- ステートフルフィルタリングで接続状態も追跡
Linuxでの実装:
- iptables: 従来の標準ツール
- nftables: 新しい標準ツール
- UFW: 初心者にも使いやすいツール
基本的なコマンド例:
# UFWでWebサーバーを設定
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp # SSH
sudo ufw allow 80/tcp # HTTP
sudo ufw allow 443/tcp # HTTPS
sudo ufw enable
メリット:
- セキュリティの向上
- 不正アクセスの防止
- ネットワークの細かい制御
- リソースの保護
注意点:
- ルールの順序が重要
- 自分をロックアウトしないよう注意
- 他のセキュリティ対策と組み合わせる
- 定期的な見直しとメンテナンス
パケットフィルタリングは、ネットワークセキュリティの基本中の基本です。
サーバーを運用する際には、必ず適切なパケットフィルタリングを設定しましょう。
最初は基本的なルールから始めて、徐々に自分の環境に合わせた設定を作り上げていってくださいね!
コメント