概要
ネットワーク周りでたまに触るiptablesですが、たまになせいで度々忘れてググり直すことが多いので理解しやすいよう図を作ってみました。
iptablesの仕組みを図解
iptablesの構成図
iptablesは以下のように
iptables -> Tables -> Chains -> Rules
という構成をとっています。
なのでCLIの書き方も
# iptables -t {テーブル名} -コマンド {チェーン名} {ルール}
といった形で順に指定するフォーマットで書きます。
テーブル
テーブルには以下の4つ種類があります。
- filterテーブル
- natテーブル
- mangleテーブル
- rawテーブル
各テーブルでは図のようにそれぞれがチェインを持っています。チェインはユーザが独自に定義することも可能です。
それぞれのチェインは初期状態では特にルールを持っておらず、基本ポリシーがACCEPT
になっています。
filter
filterテーブルはパケットの許可/廃棄/拒否といったフィルタリングを行います。一番よく使うテーブルかと思います。
-t filter
を指定するか、何も指定しないとfilterテーブルを選択したことになります。
$ sudo iptables -t filter -L Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
nat
natテーブルはその名の通りネットワークアドレス変換を行います。パケットの宛先や送信元を書き換える時に利用します。
-t nat
を指定するとnatテーブルを選択したことになります。
$ sudo iptables -t nat -L Chain PREROUTING (policy ACCEPT) target prot opt source destination Chain INPUT (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot opt source destination
mangle
パケットのTOSフィールドやTTLフィールドを変更したり、パケットに特別なマークを付ける時に使用します。
ref: 第10回 IPパケットの構造とIPフラグメンテーション (2/3):基礎から学ぶWindowsネットワーク - @IT
-t mangle
を指定するとmangleテーブルを選択したことになります。
$ sudo iptables -t mangle -L Chain PREROUTING (policy ACCEPT) target prot opt source destination Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot opt source destination
raw
コネクション追跡で扱われないよう特定のパケットにマークを付ける時に使用します。
-t raw
を指定するとrawテーブルを選択したことになります。
$ sudo iptables -t raw -L Chain PREROUTING (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
各チェインの役割
各チェインの役割を簡単に説明すると以下です。
チェイン | 役割 |
---|---|
PREROUTING | ルーティングの前に実行される 受信時に宛先アドレス/ポートを変換するチェイン |
INPUT | ローカルプロセスに入る前に実行される 受信するパケットを許可したり拒否したりするチェイン |
OUTPUT | ローカルプロセスから出た後に実行される 送信するパケットを許可したり拒否したりするチェイン |
FORWARD | 転送するパケットを許可したり拒否したりするチェイン |
POSTROUTING | ルーティングの後に実行される 送信時に送信元アドレス/ポートを変換するチェイン |
各チェインが処理されるタイミング
各チェインが処理されるフローを図示すると以下です。
※ルーティングに関しては参照するところによって微妙に異なってました
さらにテーブル毎の詳細は以下のようになります。
基本的な使い方
コマンド
コマンドはチェインをどのように扱うかの指定をします。
よく使うコマンドを以下です。
コマンド | 役割 |
---|---|
-L | テーブルに設定されている各チェインのルールを一覧表示 |
-A | 指定チェインに新しいルールを追加 |
-D | 指定チェインからルールを削除。番号1が先頭 |
-I | 指定したチェーンにルール番号を指定してルールを挿入する ルール番号を指定しない場合チェーンの先頭(=1)に挿入される |
-P | ポリシー(ACCEPT、DROPなど)を指定したターゲットに設定 |
例
filterテーブルのINPUTチェインに登録されたルール番号1番を削除
# iptables -t filter -D INPUT 1
filterテーブルのFORWARDチェインのポリシーACCEPT -> DROPに変更
# iptables -t filter -P FORWARD DROP
オプション
上記コマンドで細かいルールの設定をする際に各種オプションを利用します。
よく使うオプションは以下です。
オプション | 役割 | 具体的な値 |
---|---|---|
-s --source |
パケットの送信元を指定 | 192.168.0.1、192.168.0.0/24 |
-d --destination |
パケットの宛先を指定 | 192.168.0.1、192.168.0.0/24 |
-p --protocol |
対象とするプロトコルの指定 | tcp、udp、icmp、all |
-i --in-interface |
パケットを受信する インタフェースの指定 |
eth1、ens5 |
-o --out-interface |
パケットを送信する インタフェースの指定 |
eth1、ens5 |
-j --jump |
ターゲットの指定 | ACCEPT、DROP |
例
# iptables -A FORWARD -p tcp -j DROP
マッチングの拡張
前述のオプションで更に詳細なルールを指定する時に使います。
-p
オプションの後に暗黙的に拡張を追記するタイプと、-m
で拡張を明示して追記するタイプがあります。
-p
オプションの拡張
オプション | 役割 | 具体的な値 |
---|---|---|
--sport | 送信元のポート番号を指定 | 20 |
--dport | 宛先のポート番号を指定 | 22 |
例
sshのポート22を許可する設定
# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
ターゲット
-j
or --jump
で指定するターゲットは色々と種類があります。
よく使うものは以下です。
ターゲット | 役割 | 利用可能なチェイン |
---|---|---|
ACCEPT | パケットの通過を許可 | 制限なし |
DROP | パケットを破棄 | 制限なし |
REJECT | パケットを拒否し、ICMPメッセージを返信 | INPUT, FORWARD, OUTPUT |
DNAT | パケットの宛先アドレスを修正 | natテーブルのPREROUTING, OUTPUT |
SNAT | パケットの送信元アドレスを修正。固定IPで利用 | natテーブルのPOSTROUTING |
MASQUERADE | パケットの送信元アドレスを修正。動的IPで利用 | natテーブルのPOSTROUTING |
REDIRECT | 宛先IPをパケットを受信したインタフェースの最初のアドレスに変更 | natテーブルのPREROUTING, OUTPUT |
LOG | マッチしたパケットをカーネルログに記録 | 制限なし |
ref: http://www.asahi-net.or.jp/~aa4t-nngk/ipttut/output/targets.html
まとめ
iptablesの仕組みを図示することで基本的な使い方が理解できるようになりました。