iptablesでLinuxサーバーのFW設定入門:基礎から実践まで完全ガイド

Linuxサーバーのファイアウォール設定で必ず使うべきコマンドがiptablesです。サーバーのセキュリティを左右する重要な設定ですが、正しい使い方を知らずに運用すると、サービス停止やセキュリティホールにつながるリスクがあります。この記事では、iptablesの基本概念から具体的な設定手順、そして実運用に耐えるためのベストプラクティスまで、実務で即活用できる知識を網羅的に解説します。初心者でも理解できるように、具体的なコマンド例とその動作原理を丁寧に説明しますので、最後まで読み進めて実践に移してください。


目次


iptablesとは?Linuxファイアウォールの基礎知識

iptablesは、Linuxカーネルに組み込まれたパケットフィルタリング機能を制御するためのコマンドラインツールです。ネットワークパケットの送受信を制御し、不要な通信を遮断することでサーバーを保護します。このツールは、1998年にリリースされたLinux 2.4カーネルから標準搭載され、現在に至るまで多くのLinuxサーバーで利用されています。

iptablesの主な特徴は以下の通りです:

一方で、iptablesには以下のような制限もあります:

実務では、iptablesを使いこなすことで、SSH接続の制限、Webサーバーへの不正アクセス防止、DoS攻撃の緩和など、多岐にわたるセキュリティ対策が可能になります。特に、リモートからの管理が必要なサーバーでは、適切なファイアウォール設定が必須です。


iptablesの基本コマンドとテーブル/チェーンの仕組み

iptablesを使いこなすには、まずテーブルチェーンの概念を理解することが重要です。これらの仕組みを把握することで、ルールの設定ロジックが明確になり、トラブルシューティングも容易になります。

テーブルとチェーンの関係性

iptablesは、パケット処理の目的に応じて4つのテーブルに分類されています。各テーブルには、パケットが通過するチェーンと呼ばれる処理ステップが定義されています。

テーブル名主な用途主なチェーン処理タイミング
filterパケットの許可/拒否を制御INPUT, FORWARD, OUTPUTパケットの受信・転送・送信時
natIPアドレスやポートの変換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を使用して存在を隠す方がセキュリティ上望ましいとされています。

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に設定
2SSH接続を許可するルールを忘れるサーバーへのリモートアクセスができなくなるSSHポート(22)を許可するルールを先に追加
3ループバックインターフェース(lo)を制限するローカルサービスが動作しなくなるINPUTチェーンでloインターフェースを許可
4ルールの順序を間違える許可したいルールが機能しない許可ルールは拒否ルールより前に配置
5不要なルールを削除せずに追加し続けるルールが肥大化し、パフォーマンスが低下定期的にルールを整理し、不要なルールを削除
6IPv6(ip6tables)の設定を忘れるIPv6経由の攻撃に対して無防備になるip6tablesも同様に設定し、保存する
7ログ出力を設定しない攻撃の検知やトラブルシューティングが困難LOGターゲットを使用してログを出力
8NAT設定後にルーティングを有効化しないNATが機能しないip_forwardを1に設定
9設定を保存せずに再起動する再起動後にファイアウォールが無効化設定を保存し、自動読み込みを設定
10テスト環境と本番環境で設定を混同する本番サーバーで誤った設定が適用されるテスト環境で十分に検証した後、本番に適用

特に注意すべきポイント


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

解説

その他のレートリミット設定例

# 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

ログの場所

ログローテーションの設定:ログが肥大化しないように、/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の比較と、移行すべきタイミングについて解説します。

iptablesとnftablesの主な違

ABOUT ME
たから
サラリーマンをしながら開業して経営やってます。 今年、本業で独立・別事業を起業予定です。 ◆経験:IT講師/インフラエンジニア/PM/マネジメント/採用/運用・保守・構築・設計 ◆取得資格:CCNA/CCNP/LPIC-1/AZ-900/FE/サーティファイC言語 ◆サイドビジネス:アパレル事業/複数のWEBメディアを運営