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のオプションはいくつかのグループに分類される.
- コマンド
- 実行する処理内容.
- パラメータ
- コマンドに対する引数.
- パラメータの拡張
- いくつかのパラメータをさらに拡張するためのオプション.
- その他のオプション
- 上の2つに属さないオプション(例:バージョン情報や出力形式の切り替えなど).
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 | --table | table | テーブルを指定.このオプションを省略した場合は"filter"を使用. |
コマンド
iptablesの処理を指定するためのオプションをメモ.
オプション1 | オプション2 | 引数 | 詳細 |
---|---|---|---|
-L | --list | [chain] | 指定したテーブルの指定したチェインのルールを一覧表示する.chainを省略した場合,指定したテーブルの全てのチェインに対して行う |
-A | --append | chain rule-specification | 指定したテーブルとチェインに対して,rule-specificationで指定した1つ以上のルールを追加する. |
-I | --insert | chain [rulenum] rule-specification | 指定したテーブルとチェインに対してrule-specificationで指定した1つ以上のルールを挿入する(-Aと違いルールの優先順位を指定可能).rulenumが1の場合は先頭に挿入.省略した場合も同様の処理. |
-D | --delete |
|
指定したチェインから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-interface | name |
| 受信パケットの検出を行うインタフェースを指定.インタフェース名が+で終わる場合,その接頭辞で始まる任意のインタフェースを指す. |
-o | --out-interface | name |
| 送信パケットの検出を行うインタフェースを指定.インタフェース名が+で終わる場合,その接頭辞で始まる任意のインタフェースを指す. |
-j | --jump | targetname [per-target-options] | ターゲットを指定する. | |
-m | --match | matchname [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 |
| 送信元MACアドレスを表す. |
--source-ports | port[,port[,port...]] | multiport | 指定したポート番号郡のいずれかにマッチすることを意味する.--destination-portsは宛先,--source-portsは送信元のポート番号を検査する. | |
--destination-ports | port[,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 |
| 新しい宛先IPアドレスを指定する.ポートの指定は-p tcpや-p udpを指定している場合のみ有効. |
--to-source | ipaddr1 [-ipaddr2] [:port1-port2] | SNAT |
| 新しい送信元IPアドレスを指定する.ポートの指定は-p tcpや-p udpを指定している場合のみ有効. |
--to-ports | port1 [-port2] | MASQUERADE |
| MASQUERADEの場合は送信元ポート,REDIRECTの場合は送信先ポートや範囲を指定.このオプションは-pでtcpかudpを指定した場合のみ有効. |
REDIRECT |
|
その他のオプション
オプション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に対する個別のルールを設定. | |
COMMIT | COMMIT | ファイルの先頭か最後にCOMMITしてから記述した分を反映. |
おまけ
IPパケット
iptablesはIPパケットの構造について知らなくても利用可能だが一応メモ.
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
version | IHL | TOS | Total Length | ||||||||||||||||||||||||||||
ID | VCF | Fragment Offset | |||||||||||||||||||||||||||||
TTL | Protocol | Header Checksum | |||||||||||||||||||||||||||||
Source Address | |||||||||||||||||||||||||||||||
Destination Address | |||||||||||||||||||||||||||||||
Options | |||||||||||||||||||||||||||||||
data |
- 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パケットで送信されるデータ本体.