iptablesでLinuxサーバーのFW設定入門

iptablesでLinuxサーバーのFW設定入門:基礎から実践まで完全ガイド
Linuxサーバーのファイアウォール設定で必ず使うべきコマンドがiptablesです。サーバーのセキュリティを左右する重要な設定ですが、正しい使い方を知らずに運用すると、サービス停止やセキュリティホールにつながるリスクがあります。この記事では、iptablesの基本概念から具体的な設定手順、そして実運用に耐えるためのベストプラクティスまで、実務で即活用できる知識を網羅的に解説します。初心者でも理解できるように、具体的なコマンド例とその動作原理を丁寧に説明しますので、最後まで読み進めて実践に移してください。
目次
- iptablesとは?Linuxファイアウォールの基礎知識
- iptablesの基本コマンドとテーブル/チェーンの仕組み
- 実践的なファイアウォール設定手順
- 設定の保存と復元方法
- iptables設定で犯しがちな10のミスと回避策
- iptablesの応用テクニック
- iptablesとnftablesの比較:移行すべきタイミング
- よくある質問と回答
- まとめ:iptablesを使ったセキュアなLinuxサーバー運用
iptablesとは?Linuxファイアウォールの基礎知識
iptablesは、Linuxカーネルに組み込まれたパケットフィルタリング機能を制御するためのコマンドラインツールです。ネットワークパケットの送受信を制御し、不要な通信を遮断することでサーバーを保護します。このツールは、1998年にリリースされたLinux 2.4カーネルから標準搭載され、現在に至るまで多くのLinuxサーバーで利用されています。
iptablesの主な特徴は以下の通りです:
- ステートフルフィルタリング:接続状態を追跡し、関連パケットを自動的に許可/拒否
- 柔軟なルール設定:送信元/宛先IP、ポート、プロトコルなどを細かく制御可能
- 高いパフォーマンス:カーネルレベルで動作するため、処理速度が速い
- 無償で利用可能:Linux標準機能として提供されており、追加コスト不要
一方で、iptablesには以下のような制限もあります:
- IPv6非対応:IPv6アドレスの制御にはip6tablesを別途使用する必要あり
- ルールの複雑化:大規模なネットワークではルール管理が煩雑になる
- 非推奨化の流れ:Linux 5.4以降ではnftablesへの移行が推奨されている
実務では、iptablesを使いこなすことで、SSH接続の制限、Webサーバーへの不正アクセス防止、DoS攻撃の緩和など、多岐にわたるセキュリティ対策が可能になります。特に、リモートからの管理が必要なサーバーでは、適切なファイアウォール設定が必須です。
iptablesの基本コマンドとテーブル/チェーンの仕組み
iptablesを使いこなすには、まずテーブルとチェーンの概念を理解することが重要です。これらの仕組みを把握することで、ルールの設定ロジックが明確になり、トラブルシューティングも容易になります。
テーブルとチェーンの関係性
iptablesは、パケット処理の目的に応じて4つのテーブルに分類されています。各テーブルには、パケットが通過するチェーンと呼ばれる処理ステップが定義されています。
| テーブル名 | 主な用途 | 主なチェーン | 処理タイミング |
|---|---|---|---|
| filter | パケットの許可/拒否を制御 | INPUT, FORWARD, OUTPUT | パケットの受信・転送・送信時 |
| nat | IPアドレスやポートの変換 | PREROUTING, POSTROUTING, OUTPUT | ルーティング前・後のパケット処理 |
| mangle | パケットヘッダーの変更 | PREROUTING, POSTROUTING, INPUT, OUTPUT, FORWARD | パケットの内容を改変 |
| raw | パケットの状態追跡を制御 | PREROUTING, OUTPUT | 接続トラッキング前の処理 |
このうち、filterテーブルが最も一般的に使用され、INPUT(受信)、FORWARD(転送)、OUTPUT(送信)の3つのチェーンで構成されています。例えば、Webサーバーで80番ポート(HTTP)を許可する場合は、INPUTチェーンにルールを追加します。
必須コマンド一覧
iptablesを操作するための基本コマンドを以下にまとめます。これらのコマンドを使いこなすことで、ファイアウォール設定の基礎が固まります。
| コマンド | 説明 | 使用例 |
|---|---|---|
| -L / –list | 現在のルールを表示 | iptables -L -n -v |
| -A / –append | ルールをチェーンの末尾に追加 | iptables -A INPUT -p tcp --dport 22 -j ACCEPT |
| -I / –insert | ルールを指定した位置に挿入 | iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT |
| -D / –delete | 指定したルールを削除 | iptables -D INPUT -p tcp --dport 22 -j ACCEPT |
| -P / –policy | チェーンのデフォルトポリシーを設定 | iptables -P INPUT DROP |
| -F / –flush | チェーン内の全ルールを削除 | iptables -F INPUT |
| -X / –delete-chain | カスタムチェーンを削除 | iptables -X CUSTOM_CHAIN |
| -N / –new-chain | 新しいカスタムチェーンを作成 | iptables -N CUSTOM_CHAIN |
| -R / –replace | 既存のルールを置き換え | iptables -R INPUT 1 -p tcp --dport 80 -j ACCEPT |
| -S / –list-rules | ルールをコマンド形式で表示 | iptables -S INPUT |
重要な注意点:iptablesのルールは即座に反映されますが、再起動後に設定が消えるため、後述する設定の保存が必要です。また、ルールの追加・削除は慎重に行い、必ずバックアップを取ってから実施してください。
実践的なファイアウォール設定手順
ここからは、具体的な設定手順をステップバイステップで解説します。まずは、基本的なファイアウォール設定から始め、徐々に高度な設定に進んでいきましょう。
デフォルトポリシーの設定
ファイアウォールの基本は、デフォルトポリシーを「拒否」に設定することです。これにより、明示的に許可されていない通信はすべて遮断されます。以下は、安全なデフォルトポリシーの設定例です。
# filterテーブルのINPUTチェーンをDROPに設定
iptables -P INPUT DROP
OUTPUTチェーンは基本的に許可(ローカルネットワークやインターネットへのアクセスを許可)
iptables -P OUTPUT ACCEPT
FORWARDチェーンはDROP(サーバーがルータとして動作しない場合)
iptables -P FORWARD DROP
なぜOUTPUTをACCEPTにするのか?:サーバーからインターネットへのアクセス(例:パッケージ更新、ログ送信)を許可するためです。ただし、セキュリティ要件によってはOUTPUTも制限する場合があります。
注意事項:この設定を実行すると、SSH接続を含むすべての受信接続が遮断されます。そのため、SSH接続を許可するルールを先に追加するか、ローカルコンソールから設定する必要があります。以下はSSH(ポート22)を許可するルールです。
# SSH接続(ポート22)を許可
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
あるいは特定のIPアドレスからのみSSH接続を許可(推奨)
iptables -A INPUT -p tcp -s 192.168.1.100 --dport 22 -j ACCEPT
特定ポートの許可設定
Webサーバー(Apache/Nginx)を運用する場合、HTTP(80番)とHTTPS(443番)のポートを開放する必要があります。以下は、Webサーバー用のファイアウォール設定例です。
# HTTP(80番ポート)を許可
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
HTTPS(443番ポート)を許可
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
あるいは、ポート範囲を指定して許可
iptables -A INPUT -p tcp --dport 80:443 -j ACCEPT
メールサーバー(SMTP/IMAP)の場合:
# SMTP(25番ポート)を許可
iptables -A INPUT -p tcp --dport 25 -j ACCEPT
IMAP(143番ポート)を許可
iptables -A INPUT -p tcp --dport 143 -j ACCEPT
セキュアIMAP(993番ポート)を許可
iptables -A INPUT -p tcp --dport 993 -j ACCEPT
データベースサーバー(MySQL/MariaDB)の場合:
# MySQL(3306番ポート)を許可(特定IPからのみ)
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 3306 -j ACCEPT
IPアドレスのブロック設定
特定のIPアドレスやネットワークからのアクセスを遮断する場合は、以下のコマンドを使用します。
# 特定IPアドレスからのアクセスを拒否
iptables -A INPUT -s 192.168.1.200 -j DROP
特定ネットワークからのアクセスを拒否
iptables -A INPUT -s 10.0.0.0/8 -j DROP
あるいはREJECTを使用して明示的に拒否(接続拒否のレスポンスを返す)
iptables -A INPUT -s 203.0.113.5 -j REJECT
注意点:DROPとREJECTの違いに注意してください。
- DROP:パケットを無視し、応答を返さない(攻撃者に存在を気づかれにくい)
- REJECT:ICMPポート到達不能メッセージを返す(クライアントに明確に拒否されたことを伝える)
一般的には、DROPを使用して存在を隠す方がセキュリティ上望ましいとされています。
NATとマスカレードの設定
iptablesのnatテーブルを使用すると、ネットワークアドレス変換(NAT)やマスカレードを設定できます。これは、プライベートIPアドレスを持つ複数のデバイスが、1つのグローバルIPアドレスを共有してインターネットにアクセスする際に使用されます。
マスカレードの設定例(例:eth0がインターネット接続用のインターフェースの場合):
# NATテーブルを有効化
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
ルーティングを有効化(カーネルパラメータ)
echo 1 > /proc/sys/net/ipv4/ip_forward
ポートフォワーディングの設定例(例:8080番ポートへのアクセスを内部の80番ポートに転送):
# 8080番ポートへのアクセスを192.168.1.100:80に転送
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
注意事項:NAT設定を行う際は、ルーティングが有効になっていることを確認してください。また、ポートフォワーディングを行う場合は、内部サーバーのファイアウォールも適切に設定する必要があります。
設定の保存と復元方法
iptablesのルールは、サーバーを再起動すると消えてしまいます。そのため、設定を保存しておくことが重要です。保存方法は、使用しているLinuxディストリビューションによって異なります。
Debian/Ubuntu…
Debian系ディストリビューションでは、iptables-persistentパッケージを使用して設定を保存します。
# パッケージをインストール
apt update
apt install iptables-persistent
現在のルールを保存
iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6
保存されたルールを自動的に読み込むように設定
systemctl enable netfilter-persistent
systemctl start netfilter-persistent
RHEL/CentOS系の場合
RHEL系ディストリビューションでは、iptables-servicesを使用します。
# パッケージをインストール
yum install iptables-services
現在のルールを保存
service iptables save
サービスを有効化
systemctl enable iptables
systemctl start iptables
手動での保存・復元
上記の方法が利用できない場合は、手動でルールを保存・復元できます。
# ルールをファイルに保存
iptables-save > /etc/iptables.rules
ルールを復元
iptables-restore < /etc/iptables.rules
注意事項:保存したルールファイルは、定期的にバックアップを取っておくことをお勧めします。また、ルールを変更する際は、必ずバックアップを取ってから実施してください。
iptables設定で犯しがちな10のミスと回避策
iptablesを使い始めると、誰しもが経験するミスがあります。ここでは、実務でよく見られる10のミスとその回避策を紹介します。これらを事前に理解しておくことで、セキュリティホールやサービス停止を防ぐことができます。
| ミス番号 | ミスの内容 | 影響 | 回避策 |
|---|---|---|---|
| 1 | デフォルトポリシーをACCEPTのままにする | 不要なポートが開放され、攻撃にさらされる | INPUTチェーンのデフォルトポリシーをDROPに設定 |
| 2 | SSH接続を許可するルールを忘れる | サーバーへのリモートアクセスができなくなる | SSHポート(22)を許可するルールを先に追加 |
| 3 | ループバックインターフェース(lo)を制限する | ローカルサービスが動作しなくなる | INPUTチェーンでloインターフェースを許可 |
| 4 | ルールの順序を間違える | 許可したいルールが機能しない | 許可ルールは拒否ルールより前に配置 |
| 5 | 不要なルールを削除せずに追加し続ける | ルールが肥大化し、パフォーマンスが低下 | 定期的にルールを整理し、不要なルールを削除 |
| 6 | IPv6(ip6tables)の設定を忘れる | IPv6経由の攻撃に対して無防備になる | ip6tablesも同様に設定し、保存する |
| 7 | ログ出力を設定しない | 攻撃の検知やトラブルシューティングが困難 | LOGターゲットを使用してログを出力 |
| 8 | NAT設定後にルーティングを有効化しない | NATが機能しない | ip_forwardを1に設定 |
| 9 | 設定を保存せずに再起動する | 再起動後にファイアウォールが無効化 | 設定を保存し、自動読み込みを設定 |
| 10 | テスト環境と本番環境で設定を混同する | 本番サーバーで誤った設定が適用される | テスト環境で十分に検証した後、本番に適用 |
特に注意すべきポイント:
- ループバックインターフェース(lo)の許可:
iptables -A INPUT -i lo -j ACCEPTを追加し、ローカルサービスが動作するようにします。 - ESTABLISHED,RELATEDの許可:既存の接続と関連するパケットを許可するルールを追加します。
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT - ICMP(ping)の許可:サーバーの疎通確認のためにpingを許可する場合は、
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPTを追加します。
iptablesの応用テクニック
基本的な設定ができるようになったら、次は応用テクニックを学びましょう。これらのテクニックを活用することで、より高度なセキュリティ対策やパフォーマンス最適化が可能になります。
レートリミット(DoS攻撃対策)
iptablesを使用して、特定のIPアドレスからの接続数を制限することで、DoS(Denial of Service)攻撃やブルートフォース攻撃を緩和できます。以下は、SSH接続に対するレートリミットの設定例です。
# 同一IPからのSSH接続を1分間に3回までに制限
iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP
あるいは、接続数に加えて、新規接続レートを制限
iptables -A INPUT -p tcp --dport 22 -m recent --name SSH --set
iptables -A INPUT -p tcp --dport 22 -m recent --name SSH --update --seconds 60 --hitcount 3 -j DROP
解説:
--connlimit-above 3:同一IPからの接続数が3を超えた場合にDROP--name SSH --set:新規接続時に「SSH」という名前で接続を記録--update --seconds 60 --hitcount 3:過去60秒以内に3回以上接続があった場合にDROP
その他のレートリミット設定例:
# HTTP(80番ポート)へのリクエストを1秒間に100回までに制限
iptables -A INPUT -p tcp --dport 80 -m limit --limit 100/second -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j DROP
ICMP(ping)へのリクエストを1秒間に10回までに制限
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 10/second -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
接続トラッキングの活用
iptablesは、接続トラッキング(conntrack)機能を使用して、パケットが属する接続の状態を追跡します。この機能を活用することで、より効率的なフィルタリングが可能になります。
接続状態に基づくルール設定例:
# 既存の接続と関連するパケットを許可
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
新規接続のみを制限(例:SSH接続を1分間に5回まで)
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m limit --limit 5/minute -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
接続トラッキングテーブルの確認:
# 接続トラッキングテーブルの表示
conntrack -L
接続数の確認
conntrack -S
注意事項:接続トラッキングは、メモリを消費するため、大量の接続が発生する環境では、接続数の上限を設定することを検討してください。上限を超えた場合は、古い接続から順に破棄されます。
# 接続トラッキングの上限を設定(例:最大100,000接続)
echo 100000 > /proc/sys/net/netfilter/nf_conntrack_max
ログ出力と監視設定
iptablesで遮断したパケットや許可したパケットのログを出力することで、攻撃の検知やトラブルシューティングに役立ちます。以下は、ログ出力の設定例です。
# 遮断されたパケットのログを出力
iptables -A INPUT -j LOG --log-prefix "IPTABLES-DROP: " --log-level 4
許可されたSSH接続のログを出力
iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH-ACCEPT: " --log-level 6
ログの確認
tail -f /var/log/syslog | grep IPTABLES
ログの場所:
- Debian/Ubuntu:
/var/log/syslogまたは/var/log/kern.log - RHEL/CentOS:
/var/log/messages
ログローテーションの設定:ログが肥大化しないように、/etc/logrotate.d/iptablesなどでローテーションを設定しておきましょう。
/var/log/iptables.log {
daily
rotate 7
compress
missingok
notifempty
create 0640 root adm
}
監視ツールとの連携:ログを監視することで、攻撃パターンを検知できます。例えば、fail2banを使用して、ブルートフォース攻撃を自動的に遮断することも可能です。
# fail2banのインストール(Debian/Ubuntu)
apt install fail2ban
fail2banの設定(/etc/fail2ban/jail.local)
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 1h
iptablesとnftablesの比較:移行すべきタイミング
Linuxファイアウォールの世界では、iptablesの後継としてnftablesが登場しました。nftablesは、iptablesよりも高速で柔軟性が高く、将来的にはiptablesが廃止される可能性もあります。ここでは、iptablesとnftablesの比較と、移行すべきタイミングについて解説します。




