魔術師見習いのノート

プロフィール

魔術師見習い
Author魔術師見習い-_-.
Twitter魔術師見習い

コンピュータ関係のメモを主に書きます.

MENU

iptables

投稿日:
タグ:

目次

本稿はiptablesに関するメモ.iptablesとはLinuxカーネルのIPパケットフィルタ機能を管理するツールである.iptablesのコマンドを使用した例は次の通りである.

user% iptables -t filter -A INPUT -s 127.0.0.1 -j DROP
この例に関する説明は後述するが,用途によってこれより更に引数の数は増える.

iptablesとは

iptablesとはLinuxカーネルのIPパケットフィルタ機能を管理するためのツールのこと.IPパケットフィルタはテーブル内で定義されたルールに従ってパケットに対して検査や修正などさまざまな処理を行う.

IPパケットフィルタは目的ごとに異なる複数のテーブルに基づいて処理を行う.テーブルは更にチェインと呼ばれる複数のルールのリストを持つ.

キーワード

テーブル
チェインの集合.テーブルは用途毎に分けられており,それぞれ異なるチェインを持つ.異なるテーブルで同じチェインを持つ場合,テーブルによって適応される順番が決まる.
チェイン
IPパケットを検査するルールのリスト.検査するシチュエーション毎にさまざまなチェインがある.ルールはリストの順番に従ってチェックされ,適合した時点で以降のチェックは行われない.
ターゲット
条件にマッチしたパケットに対して行う処理.ターゲット名については「target」を参照.


テーブル

iptablesは標準でいくつかのテーブルを持つ.標準で利用可能なテーブルはバージョンに依存する.詳細はマニュアルで確認できる.ここで,代表的なテーブルを2つ紹介する.

filter
マシンが行う基本的なパケット処理を行う際に参照されるテーブル.iptablesはユーザがテーブルを指定しなかった場合にこのテーブルを利用する.
チェイン:
INPUT
パケットフィルタを行うマシンが宛先となる受信パケットに対するチェイン.
OUTPUT
パケットフィルタを行うマシンが送信元となる送信パケットに対するチェイン.
FORWARD
パケットフィルタを行うマシンを経由するパケットに対するチェイン.
nat
新しい接続を行うようなパケットを扱う際に参照されるテーブル.
チェイン:
OUTPUT
パケットフィルタを行うマシンが送信元となる送信パケットに対するチェイン.
PREROUTING
パケットが受信時に対するチェイン.
POSTROUTING
パケットが送信時に対するチェイン.
mangle
IPパケットヘッダの書き換えを行うために使用される特殊なテーブル.本稿では説明を省略.


オプション

テーブル指定を除くiptablesのオプションはいくつかのグループに分類される.

例えば,テーブル"filter"内のチェイン"INPUT"にルール"送信IPアドレス127.0.0.1からきたパケットを破棄"を追加する処理は次のように行う.
user% iptables -t filter -A INPUT -s 127.0.0.1 -j DROP
この時,これらの引数は次のように分類される.
テーブルを指定.
-t filter
コマンドチェインを指定.
-A INPUT
パラメータその他のオプションを指定.
-s 127.0.0.1 -j DROP

テーブル指定

よく使いそうなオプションをメモ.

オプション1 オプション2 引数 詳細
-t--tabletableテーブルを指定.このオプションを省略した場合は"filter"を使用.
コマンド

iptablesの処理を指定するためのオプションをメモ.

オプション1 オプション2 引数 詳細
-L--list[chain] 指定したテーブルの指定したチェインのルールを一覧表示する.chainを省略した場合,指定したテーブルの全てのチェインに対して行う
-A--appendchain rule-specification 指定したテーブルとチェインに対して,rule-specificationで指定した1つ以上のルールを追加する.
-I--insertchain [rulenum] rule-specification 指定したテーブルとチェインに対してrule-specificationで指定した1つ以上のルールを挿入する(-Aと違いルールの優先順位を指定可能).rulenumが1の場合は先頭に挿入.省略した場合も同様の処理.
-D--delete
  • chain rule-specification
  • chain rulenum
指定したチェインから1つ以上のルールを削除する. 削除するルールはrule-specificationとマッチするルールか,rulenumで指定した番号のルール.
-F--flush[chain] 指定したチェインのルールを全て削除する. chainを省略した場合,指定したテーブルの全てのチェインに対して行う.
rule-specification
[matches ...] [target]
match
-m matchname [per-match-options]
target
-j targetname [per-target-options]
パラメータ

ここでは次のコマンドで使用されるオプションをメモ.iptables1.4.17のマニュアルによると,この4つに--addを加えたもの(このコマンドの詳細は不明だが).

  • --append
  • --delete
  • --insert
  • --replace

オプション1 オプション2 引数 ターゲット 詳細
-s--source[!] address [/mask] 送信元アドレス,または!がついた場合これ以外の送信元アドレスを意味する.--srcという別名も.
-d--destination[!] address [/mask] 宛先アドレス,または!がついた場合これ以外の宛先アドレスを意味する.--dstという別名も.
-p--protocol[!] protocol 指定したプロトコル,または!が付いた場合は指定したプロトコル以外を意味する. protocolには/etc/protocolsで定義されたプロトコル名かallや,それに対応する数値を使用可能(例:tcp,udp).allは全てのプロトコルを意味する.
-i--in-interfacename
  • INPUT
  • PREROUTING
  • FORWARD
受信パケットの検出を行うインタフェースを指定.インタフェース名が+で終わる場合,その接頭辞で始まる任意のインタフェースを指す.
-o--out-interface name
  • OUTPUT
  • POSTROUTING
  • FORWARD
送信パケットの検出を行うインタフェースを指定.インタフェース名が+で終わる場合,その接頭辞で始まる任意のインタフェースを指す.
-j--jumptargetname [per-target-options] ターゲットを指定する.
-m--matchmatchname [per-match-options] 指定した拡張パケットフィルタリングモジュールをロードし,処理を指定する.
パラメータの拡張
マッチングの拡張(per-match-options)

iptablesは拡張パケットフィルタリングモジュールを利用できる.拡張パケットマッチングモジュールは-pで暗黙的にロードされるか,-mで明示的に指定することでロードできる.

例えば送信元のMACアドレスを制限する場合のサンプルは次の通りである.

user% iptables -t filter -A INPUT -m mac --mac-source 00:1d:09:d1:fb:d5 -j ACCEPT

オプション 引数 モジュール チェイン 詳細
--mac-source value[/mask] mac
  • PREROUTING
  • FORWARD
  • INPUT
送信元MACアドレスを表す.
--source-portsport[,port[,port...]] multiport 指定したポート番号郡のいずれかにマッチすることを意味する.--destination-portsは宛先,--source-portsは送信元のポート番号を検査する.
--destination-portsport[,port[,port...]]
--destination-port[!] port[:port] tcp --protocol tcpが指定された場合暗黙的にモジュールがロードされ,使用可能になるオプション.送信元や宛先のポート番号やポート範囲を指定できる.--destination-portは--dport,--source-portは--dportという別名あり.
--source-port
ターゲットの拡張(per-target-options)
オプション 引数 ターゲット チェイン 詳細
--to-destination ipaddr1 [-ipaddr2] [:port1-port2] DNAT
  • PREROUTING
  • OUTPUT
新しい宛先IPアドレスを指定する.ポートの指定は-p tcpや-p udpを指定している場合のみ有効.
--to-source ipaddr1 [-ipaddr2] [:port1-port2] SNAT
  • POSTROUTING
新しい送信元IPアドレスを指定する.ポートの指定は-p tcpや-p udpを指定している場合のみ有効.
--to-ports port1 [-port2] MASQUERADE
  • POSTROUTING
MASQUERADEの場合は送信元ポート,REDIRECTの場合は送信先ポートや範囲を指定.このオプションは-pでtcpかudpを指定した場合のみ有効.
REDIRECT
  • PREROUTING
  • OUTPUT
その他のオプション
オプション1 オプション2 引数 詳細
-v--verbose詳細な出力を行う.
-n--numeric標準ではIPアドレスやポート番号などを可能な限りドメイン名やプロトコル名で表示しようとするが,これを指定した場合数値で表示する.

ターゲット

jオプションで指定可能なtargetnameについていくつか紹介する.

ACCEPT
パケットの通過を許可.
DROP
パケットの通過を拒否.REJECTと異なりICMPパケットを返信しない.
SNAT
パケットの送信元アドレスを変更.
チェイン:
  • POSTROUTING
DNAT
パケットの宛先アドレスを変更.
チェイン:
  • PREROUTING
  • OUTPUT
LOG
カーネルログに記録.カーネルログはdmesgコマンドで閲覧可能.
REJECT
パケットを破棄し,ICMPパケットを返信.
チェイン:
  • INPUT
  • FORWARD
  • OUTPUT
REDIRECT
別のポートに転送.
チェイン:
  • PREROUTING
  • OUTPUT
MASQUERADE
パケットの送信元アドレスをパケットフィルタを行うインタフェースのIPアドレスに変更する.もしインターフェースが停止した場合,接続を忘れる.manによるとパケットフィルタを行うインタフェースのIPアドレスを固定割り当てする場合はSNAT,動的割り当てする場合はMASQUERADEを使うべきとのこと.
チェイン:
  • POSTROUTING
TCPMSS
-pでtcpを指定した際のみ指定可能なターゲット.SYNパケットのMSS値を設定可能.
TOS
IPパケットヘッダのType Of Serviceフィールドを設定可能.
ULOG
マッチしたパケットのログをユーザ空間で記録.


制御用スクリプト

LinuxのIPパケットフィルタのデーモンはスクリプトによって制御する.スクリプトの実行方法は環境によって異なる.例えば次のように直接指定する方法やserviceコマンドを経由して実行する方法がある.

  • user% /etc/init.d/iptables start
  • user% service iptables start
以下にパケットフィルタのデーモンを制御するスクリプトに関する引数をいくつかメモ.
start
IPパケットフィルタのデーモンを実行.
restart
IPパケットフィルタのデーモンを再実行.
stop
IPパケットフィルタのデーモンを停止.
status
IPパケットフィルタのデーモンの状態を確認.
save
IPパケットフィルタのデーモンの現在の設定を設定ファイルに書き込む.iptablesコマンドによるテーブルの変更は直接設定ファイルを書き換えない.それゆえOSを再実行にも設定維持するためには設定ファイルを書き換えなければならない.

自動実行

OS起動時にデーモンを自動的に起動する方法も環境に依存する.私の環境では次のようなコマンドを使用する.

user% chkconfig iptables on

設定ファイル

iptablesの設定ファイルは各行を上から順に記述され,次の5種類に分類される.

接頭辞表記詳細
##commentsコメントを記述.
**table テーブルの指定.
: :chain policy あるchainに対するポリシー(共通ルール)を設定.
:user_chain - ユーザ定義のチェインの場合はこちらのフォーマット.
rule あるchainに対する個別のルールを設定.
COMMITCOMMITファイルの先頭か最後にCOMMITしてから記述した分を反映.
設定ファイルは私の環境(CentOS)では,/etc/sysconfig/iptablesにあった.


おまけ

IPパケット

iptablesはIPパケットの構造について知らなくても利用可能だが一応メモ.

version
IPのバージョン.IPv4なら4が格納されている.
IHL(Internet Header Length)
IPヘッダの長さ.通常32ビット(4バイト)単位で表現される.例えばこのフィールドの値が15ならば,長さは480ビット(60バイト)を意味する.
TOS(Type of Service)
優先度などを表すために利用可能なフィールド.
Total Length
パケットの長さ.値の単位はバイトである.
ID
IPパケットの識別番号.このフィールドは断片化されたパケットが同一のパケットであることを表す.
VCF(Various Control Flags)
断片化の制御のために利用されるフィールド.
Fragment Offset
断片化されたIPパケットの相対位置を表すフィールド.
TTL(Total to Live)
パケットの生存時間.ルータはルーティングの度にTTLの値を1つ減らす.そして0になった時,パケットを破棄し,ICMPパケットを返信する.これにより,パケットが無限に巡回することを防ぐことができる.
protocol
トランスポート層のプロトコルを表す番号が格納されるフィールド.
Header Checksum
ヘッダの誤り検査に用いられるフィールド.
Source Address
送信元アドレス.
Destination Address
宛先アドレス.
Options
32ビット(4バイト)単位の可変長なフィールド.機能を拡張するために使用される.
data
IPパケットで送信されるデータ本体.

一覧