Carpe Diem

備忘録

iptablesの仕組みを図解

概要

ネットワーク周りでたまに触るiptablesですが、たまになせいで度々忘れてググり直すことが多いので理解しやすいよう図を作ってみました。

iptablesの仕組みを図解

iptablesの構成図

iptablesは以下のように

iptables -> Tables -> Chains -> Rules

という構成をとっています。

f:id:quoll00:20200208035547p:plain

なのでCLIの書き方も

# iptables -t {テーブル名} -コマンド {チェーン名} {ルール}

といった形で順に指定するフォーマットで書きます。

テーブル

テーブルには以下の4つ種類があります。

  • filterテーブル
  • natテーブル
  • mangleテーブル
  • rawテーブル

f:id:quoll00:20200208042753p:plain

各テーブルでは図のようにそれぞれがチェインを持っています。チェインはユーザが独自に定義することも可能です。

それぞれのチェインは初期状態では特にルールを持っておらず、基本ポリシーが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フィールドを変更したり、パケットに特別なマークを付ける時に使用します。

f:id:quoll00:20200209225721p:plain
IPパケットの詳細構造

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 ルーティングの後に実行される
送信時に送信元アドレス/ポートを変換するチェイン

各チェインが処理されるタイミング

各チェインが処理されるフローを図示すると以下です。

f:id:quoll00:20200209021040p:plain

※ルーティングに関しては参照するところによって微妙に異なってました

さらにテーブル毎の詳細は以下のようになります。

f:id:quoll00:20200209022945p:plain

基本的な使い方

コマンド

コマンドはチェインをどのように扱うかの指定をします。
よく使うコマンドを以下です。

コマンド 役割
-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
対象とするプロトコルの指定 tcpudp、icmp、all
-i
--in-interface
パケットを受信する
インタフェースの指定
eth1、ens5
-o
--out-interface
パケットを送信する
インタフェースの指定
eth1、ens5
-j
--jump
ターゲットの指定 ACCEPT、DROP

FORWARDチェインでtcpプロトコルのパケットを破棄

# 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の仕組みを図示することで基本的な使い方が理解できるようになりました。

ソース