はじめに

こんにちは!今回はiptablesコマンドについて解説します。

iptablesはLinuxのファイアウォール設定を行うコマンドです。ネットワークトラフィックをフィルタリングしたり、ポート転送したりするのに使います。

セキュリティの要ですね。サーバーを守るための重要なコマンドです。ちょっと複雑ですが、基本を理解するとめっちゃ便利ですよ!


iptablesコマンドとは

iptablesは、LinuxカーネルのNetfilterフレームワークを操作して、ファイアウォールルールを設定する外部コマンドです。

通信を許可したり拒否したり、ポート転送をしたり、NAT(ネットワークアドレス変換)を設定したりできます。インターネットに接続されたサーバーではほぼ必須のコマンドですね。

iptablesはテーブル→チェーン→ルールという階層構造で動作します。


基本構文

1
iptables [テーブル] [コマンド] [チェーン] [条件] [アクション]
  • テーブル: filter(デフォルト), nat, mangle, raw など
  • コマンド: -A(追加), -D(削除), -L(表示)など
  • チェーン: INPUT, OUTPUT, FORWARD など
  • 条件: -s(送信元), -d(宛先), -p(プロトコル)など
  • アクション: ACCEPT(許可), DROP(破棄), REJECT(拒否)など

主なオプション

コマンド 説明
-A ルールをチェーンの末尾に追加(Append)
-D チェーンからルールを削除(Delete)
-I ルールをチェーンの先頭に挿入(Insert)
-L チェーンのルール一覧を表示(List)
-F チェーンのすべてのルールを削除(Flush)
-P チェーンのデフォルトポリシーを設定(Policy)
-n IPアドレスをホスト名に変換しない
-v 詳細表示(verbose)
-i 入力インターフェース(-i eth0 など)
-o 出力インターフェース(-o eth0 など)
-s 送信元IPアドレス
-d 宛先IPアドレス
-p プロトコル(tcp, udp, icmp など)
--dport 宛先ポート
--sport 送信元ポート
-j ターゲット(ACCEPT, DROP, REJECT など)

使用例

例1: 現在のファイアウォールルールを表示

1
iptables -L

実行結果:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
DROP       tcp  --  anywhere             anywhere             tcp dpt:445

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

現在のファイアウォールルール一覧を表示します。

例2: 詳細表示でルールを確認

1
iptables -L -v -n

実行結果:

1
2
3
Chain INPUT (policy ACCEPT 1234 packets, 567K bytes)
 pkts bytes target     prot opt in     out     source               destination
 1234  567K ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0

-vで詳細、-nでIPアドレスをそのまま表示します。

例3: SSH接続を許可

1
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

実行結果:

1
(コマンド成功時は何も表示されない)

TCPの22番ポート(SSH)への接続を許可します。

例4: 特定のIPアドレスからの接続を拒否

1
sudo iptables -A INPUT -s 192.168.1.100 -j DROP

実行結果:

1
(コマンド成功時は何も表示されない)

192.168.1.100からの全通信を遮断します。

例5: HTTPとHTTPSポートを許可

1
2
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

実行結果:

1
(コマンド成功時は何も表示されない)

Webサーバーのポート80(HTTP)と443(HTTPS)を許可します。

例6: INPUTチェーンのデフォルトポリシーを変更

1
sudo iptables -P INPUT DROP

実行結果:

1
(コマンド成功時は何も表示されない)

INPUTチェーンのデフォルトを「破棄」に設定します。明示的に許可されたトラフィックのみを受け入れるようになります。

例7: ローカルホストからの接続を許可

1
sudo iptables -A INPUT -i lo -j ACCEPT

実行結果:

1
(コマンド成功時は何も表示されない)

ループバックインターフェース(lo)から来たトラフィックを許可します。

例8: 確立済みの接続を許可

1
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

実行結果:

1
(コマンド成功時は何も表示されない)

既に確立された接続と関連する通信を許可します。

例9: ルールの番号付き表示

1
iptables -L -n --line-numbers

実行結果:

1
2
3
4
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0             tcp dpt:22
2    DROP       tcp  --  192.168.1.100        0.0.0.0/0

各ルールに番号が表示されるので、削除や修正が簡単になります。

例10: 特定の番号のルールを削除

1
sudo iptables -D INPUT 2

実行結果:

1
(コマンド成功時は何も表示されない)

INPUT チェーンの2番目のルールを削除します。

例11: チェーンのすべてのルールをリセット

1
sudo iptables -F INPUT

実行結果:

1
(コマンド成功時は何も表示されない)

INPUTチェーンのすべてのルールを削除します。

例12: ポート転送を設定

1
sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 80

実行結果:

1
(コマンド成功時は何も表示されない)

8080番ポートへの通信を80番ポートにリダイレクトします。


Tips・注意点

設定の永続化

iptablesのルールはメモリに保存されるため、再起動すると消えます。永続化するにはiptables-persistentパッケージを使います:

1
sudo apt-get install iptables-persistent

ルールの順番が重要

iptablesはルールを上から順に評価します。最初にマッチしたルールが適用されるので、順番を間違えるとルールが効かない場合があります。

-jオプションのターゲット

  • ACCEPT: パケットを許可
  • DROP: パケットを無視(返答なし)
  • REJECT: パケットを拒否(エラー返答あり)

ロックアウトに注意

デフォルトポリシーをDROPにする時は、自分のSSH接続を許可してからにしましょう。そうしないサーバーにアクセスできなくなります!

テーブルの確認

1
iptables -t nat -L -v -n

natテーブルを確認する場合は-t natを指定します。


実践的な使い方

基本的なセキュアな設定

1
2
3
4
5
6
7
8
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

デフォルトですべての受信を拒否し、必要なポートのみ明示的に許可します。

DDoS対策(SYNフラッド攻撃)

1
sudo iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT

SYNパケットのレート制限を設定します。

ポートスキャン対策

1
2
3
sudo iptables -N port-scanning
sudo iptables -A port-scanning -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s --limit-burst 2 -j RETURN
sudo iptables -A port-scanning -j DROP

不正なフラグの組み合わせを検出して破棄します。

設定をファイルに保存

1
sudo iptables-save > /etc/iptables/rules.v4

現在のルール設定をファイルに保存します。


まとめ

iptablesコマンドのポイント:

  • Linuxファイアウォール設定の基本コマンド
  • テーブル→チェーン→ルールの階層構造で動作
  • -A: ルール追加、-D: ルール削除、-L: ルール表示
  • -P: デフォルトポリシー設定
  • 設定は再起動で消えるので、永続化が必要
  • ルールの順番が重要(上から順に評価される)
  • よく使う組み合わせ: iptables -A INPUT -p tcp --dport 22 -j ACCEPT

セキュリティの要となるコマンド。基本を理解して、適切にファイアウォールを設定しましょう。ただし、設定ミスでサーバーにアクセスできなくなることもあるので、慎重に!