iptables

iptablesは、Linuxに実装されたパケットフィルタリング及びネットワークアドレス変換(NAT)の機能であり、ファイアーウォールの役割を果たす。iptablesを操作するコマンドには、IPv4用の「iptables」とIPv6用の「ip6tables」がある。iptablesはOSIの第3階層(ネットワーク層)で動作する。第2階層(データリンク層)を扱いたい場合はebtablesを使用する。

iptablesサービスの起動

iptablesサービスを起動するには、スーパーユーザの権限が必要である。suでスーパーユーザになるか、sudoコマンドを使う。

IPv4のiptablesサービスを起動する。

service iptables start

IPv6のiptablesサービスを起動する。

service ip6tables start

システム起動時にIPv4のiptablesサービスを起動する。

chkconfig iptables on

システム起動時にIPv6のiptablesサービスを起動する。

chkconfig ip6tables on

iptablesサービスの停止

IPv4のiptablesサービスを停止する。

service iptables stop

IPv6のiptablesサービスを停止する。

service ip6tables stop

システム起動時にIPv4のiptablesサービスを停止する。

chkconfig iptables off

システム起動時にIPv6のiptablesサービスを停止する。

chkconfig ip6tables off

なお、Ubuntuではiptablesサービスを停止することができない。

iptablesコマンド

iptablesコマンド及びip6tablesコマンドの操作対象は「テーブル」と「チェイン」である。

チェインの最後にルールを追加する。

iptables [-t table] -A chain rule [options]

チェインからルールを削除する。

iptables [-t table] -D chain rule [options]

チェインにルールを追加する。

iptables [-t table] -I chain [rule-no] rule [options]

チェインにあるルールを置き換える。

iptables [-t table] -R chain rule-no rule [options]
iptables [-t table] -D chain rule-no [options]

チェインにあるルールの一覧を表示する。

iptables [-t table] -L|-F|-Z [chain] [options]
iptables [-t table] -N chain
  
iptables [-t table] -X [chain]
iptables [-t table] -P chain target [options]
iptables [-t table] -E old-chain new-chain

テーブル

「テーブル」とは、フィルタリングの対象である。

-t
--table
指定したパケットマッチングテーブルを操作対象とする。このオプション省略した場合、 filter テーブルを対象とする。
テーブル 説明
filter パケットの入出力制御(既定値)
nat IPアドレス変換やポート変換
mangle IPパケットヘッダの書き換え
-A
--append
指定したチェインの最後にルールを追加する。
-D
--delete
指定したチェインからルールを削除する。
-I
--insert
指定したチェインにルールを追加する。
-R
--replace
指定したチェインにあるルールを置き換える。
-L
--list
chain で指定されたチェインのルールを一覧表示する。 chain の指定が省略された場合は、すべてのチェインのルールを一覧表示する。
-F
--flush
指定したチェインのルールをすべて削除(flush)する。 chain の指定を省略した場合は、テーブル内の全チェインを削除する。
-Z
--zero
チェインのパケットカウンタとバイトカウンタを0にする。
-N
--new-chain
指定した名前でユーザ定義チェインを作成する。
-X
--delete-chain
指定したユーザ定義チェインを削除する。ただし、他のチェインのターゲットとして使用されているチェインは削除できない。 chain の指定を省略した場合は、すべてのユーザ定義チェインを削除する。
-P
--policy
チェインのポリシを指定したターゲットに設定する。
-E
--rename-chain
チェイン名を変更する。
-m limit
--limit rate
パケットがマッチする頻度を制限する。 rate には、単位時間あたりに許されるマッチ回数を「 number / unit 」の形式で指定する。 unit にはsecond(秒)、minute(分)、hour(時)又はday(日)を指定する。たとえば、1秒間に1回なら「1/s」と指定する。
-m state
--state state
state で指定した接続状態に一致した場合にフィルタリングを適用する。ESTABLISHEDなどを指定することにより、応答パケットに対してフィルタリングできる。
--stateオプションに指定する接続状態
接続状態 説明
NEW 新規接続のパケット
INVALID 既存パケットと関係ないパケット
ESTABLISHED 既存パケットと関係するパケット
RELATED 新規接続のパケット又は既存パケットと関係するパケット
-m multiport
複数のポートやポート範囲を一度に指定する。-p tcp又は-p udpと組み合わせて指定する。
--sports port [, port ...]
送信元ポートが port である場合にマッチ
--dports port[,port...]
宛先ポートが port である場合にマッチ
--ports port [, port ...]
送信元ポートと宛先ポートが共に port である場合にマッチ

chain には次に示す組み込みチェイン又はユーザ定義チェインを指定する。テーブルにより指定できる組み込みチェインが異なる。

iptablesの組み込みチェイン
チェイン 説明 テーブル
filter nat mangle
INPUT 入力パケット
OUTPUT 出力パケット
FORWARD 転送パケット
PREROUTING 入力パケット(ルーティング前)
POSTROUTING 出力パケット(ルーティング後)
組み込みチェイン
Figure 1. 組み込みチェイン

ルール

rule にはルールを指定する。

-dport port
送信先のポート番号を指定する。
-i [!]interface[+]
--in-interface [!]interface[+]
パケットを受信するインタフェース名を指定する。 ! を指定すると、そのインタフェースを除外する。 eth+ と指定すると、 eth0, eth1... にマッチする。このオプションを省略した場合、すべてのインタフェースが対象となる。
-o [!]interface[+]
--out-interface [!]interface[+]
パケットを送信するインタフェース名を指定する。 ! を指定すると、そのインタフェースを除外する。 eth+ と指定すると、 eth0, eth1... にマッチする。このオプションを省略した場合、すべてのインタフェースが対象となる。
-j target
--jump target
ターゲット(パケットがルールにマッチしたときにどうなるか)を指定する。 target には、ユーザ定義チェイン又は次の組み込みターゲットを指定する。
iptablesの組み込みターゲット
ターゲット 説明
ACCEPT パケットの送受信を許可する
DROP パケットを破棄する
REJECT パケットを破棄し、エラーパケット(ICMP)を返す
LOG ログを出力する
SNAT 送信元IPアドレスを変更する
DNAT 送信先IPアドレスを変更する
MASQUERADE 複数の送信元IPアドレスを変更する

ICMPは、送信したデータが届かなかったとき又は障害が発生したときに利用されるプロトコルである。

-p [!]protocol
--protocol [!]protocol
プロトコルを指定する。 ! を付けると、指定したプロトコルを除外する。このオプションを省略した場合、すべてのプロトコルが対象となる。
プロトコル
プロトコル 説明
all ICMP、TCP/IP及びUDP/IP
icmp ICMP
tcp TCP/IP
udp UDP/IP
-s [!]address[/mask]
--source [!]address[/mask]
送信元を指定する。IPアドレスを指定する場合、 address の形式を使用する。ネットワークIPアドレスで指定する場合、 address / mask の形式を使用する。ホスト名で指定する場合、 address にホスト名を指定する。 ! を指定した場合、指定したアドレスを除外する。
-d [!]address[/mask]
--destination [!] address[/mask]
送信先を指定する。IPアドレスを指定する場合、 address の形式を使用する。ネットワークIPアドレスで指定する場合、 address / mask の形式を使用する。ホスト名で指定する場合、 address にホスト名を指定する。 ! を指定した場合、指定したアドレスを除外する。
--log-level level-name
ログを記録するレベルを指定する。
log-level
# level-name
0 emerg
1 alert
2 crit
3 err
4 warning
5 notice
6 info
7 debug

iptablesコマンド使用例

設定内容をチェインごとに表示する。

# iptables -nL

すでに確立しているセッションや、それらに関係する入力パケットを許可する。

# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

拒否されたICMPパケットの応答としてエラーパケットを返す。

# iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited

ユーザ定義チェインを作成して、そのユーザ定義チェインにルールを追加する。

# iptables -N chain1
# iptables -A chain1 -j DROP -s 0.0.0.0/0 -d 0.0.0.0/0

iptablesのログ

iptablesのログは/var/log/messagesに出力される。これによりフィルタの適用を確認できる。

iptables-saveコマンド

iptables-saveは、IPテーブルの内容を標準出力に出力するコマンドである。

iptables-save [-c] [-t table]
-c
--counters
パケットカウンタとバイトカウンタの値を出力する。
-t
指定したテーブルのIPテーブルを出力する。
# iptables-save
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:user_chain - [0:0]

iptablesコマンドによるフィルタリング設定はシステムに保存されない。したがって、システムを再起動するとiptablesの設定は初期状態に戻る。iptablesの設定をファイルに保存するには、iptables-saveコマンドを使用する。

/sbin/iptables-save > /etc/sysconfig/iptables

iptables-restoreコマンド

iptables-restoreコマンドは、標準入力からiptablesルールを読み込んで設定を復元するコマンドである。

iptables-restore

iptables-saveコマンドで保存したフェイルから設定を復元することもできる。

/sbin/iptables-restore < /etc/sysconfig/iptables

ルールセットファイル

/etc/sysconfig/iptablesにルールを記述すると、iptablesサービス起動時にルールを読み込む。