iptablesはLinuxに搭載されているパケット操作のための仕組み。
よく使う方法としてはパケットフィルタ
としての使い方で簡単なファイアウォールを作れたりする。
本質としてはパケット操作全般が可能であるため、しっかり作りこめばルータ機能を実装したり、kubernetes
やDocker
のようなコンテナ内通信を実現できる。
iptablesは古くからLinuxに搭載されているパケット操作ツールである。
iptablesはパケット操作の設定をするためのフロントエンドインタフェースであり、実態としてはLinuxカーネルのNetfilterに対して設定を行う。
LinuxカーネルのNetfilterが実際のパケットを処理するため、ここらの関係性を理解する必要がある。
なお、CentOS7
以降ではパケットフィルタツールとしてfirewalld
が導入されたが、firewalldがやっているのは実はiptablesを操作するだけのフロントエンドツール。
つまり、Firewalld
⇒ iptables
⇒ Netfilter
のように内部では操作が行われている。
やはり最終的なNetfilter
の理解は避けられない。
iptablesはNetfilter
のフロントエンドツールであり、iptablesが構想する概念がある。
大きく分類すると以下がある。
- テーブル(実行操作)
- チェイン(実行タイミング)
- パラメータ(条件)
テーブル
テーブルはiptablesで実現する操作である。
指定可能なテーブルは以下だ。
テーブル |
説明 |
filter |
パケット通過の認可 |
nat |
ネットワークアドレス変換(ポート変換可) |
mangle |
TOS(Type Of Service)フィールドの操作 |
raw |
NOTRACKターゲットの操作 |
filterテーブル
filterテーブルはパケットの通過の許可や拒否を行うことができる。
iptablesでパケットフィルタを実現するにはこのテーブルが使われる。
filterは通過の認可(ACCEPT, DROP)に対して、IPヘッダにおけるIPアドレスやポート番号のsourceとdestinationを指定可能だ。
natテーブル
natテーブルはネットワークアドレス変換を行うことができる。
NATが必要なケースは少ないがグローバルIPとプライベートIPの対応付けやNAPT(IPマスカレード)で使われる。
ルータ機能を持たせる必要がある際に使われることが多い。
mangleテーブル
mangleテーブルは TOS(Type Of Service)フィールドと呼ばれるIPヘッダーに含まれるQoS(Quality of Service)を実現するために使われる
filterやnatと比べ使用されるケースは少ないが、IPPBX等でパケットの優先付けや帯域制御を行う場合に使われる。
TOSの書き換えとなるとハードウェアルータ等では対応していないことが多く、ソフトウェア処理だからこそできることでもある。
rawテーブル
rawテーブルはNOTRACKターゲットと呼ばれるIPヘッダーに含まれる追跡マークを除外することができる。
大量のパケットが流入する環境において、追跡マークを除外することで特定の危機への負荷を軽減することが可能だ。
高負荷が想定される環境でiptablesを用いてソフトウェア処理をさせるケースが考えづらいため、ほぼ使われないだろう。
チェイン
チェインはパケット操作を実行する場所(タイミング)を定義する。
種類 |
説明 |
PREROUTING |
入力(受信時) |
INPUT |
入力(自ホスト向け受信) |
FORWARD |
転送(ルーティング) |
OUTPUT |
出力(時ホストから送信時) |
POSTROUTING |
出力(送信時) |
チェインは上記の5つあり、目的に合わせて選択する。
自ホスト向けのファイアウォールとしてパケットフィルタしたいならINPUT
をチェインとすればいいだろう。
Linuxルータとしてアドレス変換(NATやNAPT)を実現するなら、出力するパケットのアドレスを変えるためにPOSTROUTING
時にマスカレード処理を書く。
なお、チェインには適用可能なテーブルが定まっている。
テーブル |
利用可能なチェイン |
filter |
INTPU, OUTPUT, FORWARD |
nat |
OUTPUT, PREROUTING, POSTROUTING |
mangle |
INPUT, OUTPUT, FORWARD, PREROUTING, POSTROUTING |
Raw |
OUTPUT, PREROUTING |
パラメータ(オプション)
パラメータは指定したチェインとテーブルに対して、細かい条件をしてすることができる。
パケットフィルタであれば、送信元IPや宛先IPを指定して認可を設定できる。
アドレス変換も対象とするネットワークアドレス帯を指定することが可能だ。
NICを複数もつホストであればインタフェースを指定してNIC毎に設定も可能
パラメータ |
内容 |
-p (--protocol) |
プロトコルの指定(icmp, tcp, udp, or all) |
-s (--source) |
送信元IPアドレス(ネットワークアドレスも可) |
-d (--destination) |
送信先IPアドレス(ネットワークアドレスも可) |
--sport |
送信元ポート番号 |
--dport |
宛先ポート番号 |
-i (--in-interface) |
入力元インタフェース |
-o (--out-interface) |
出力先インタフェース |
-j (--jump) |
ターゲットを指定(ACCEPT, DROP, REJECT, REDIRECT, LOG) |
あとはtcp-flags
としてSYNやACK等も指定可能。細かいところは公式ドキュメントを参照されたい。
iptables-extensions
iptablesは複数のエントリが記述可能なため、エントリ間の効果の範囲と優先度を意識する必要がある。
エントリの優先順位
iptablesのエントリは上部から順番に適用される。
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere
DROP all -- anywhere anywhere ctstate INVALID
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
上記はCentOS7の例だが、INTPUのチェインにおいてAcceptのエントリがある。
このあとにDROPやREJECTが記述されており、これはホワイトリスト形式での記述になる。
もちろんDROPを優先度を上げて、具体的に許可するエントリを書くブラックリスト方式も可能だ。
エントリの操作として--replace
や--insert
があり、任意の場所で修正変更操作が可能だ。
まとめ
今回はiptablesの設計思想と記述方法について記載した。
iptablesの各エントリの意味とエントリの適用順序を理解することでパケットの処理を理解することが可能だ。
最近だとDockerやKubernetes等の仮想ネットワークはiptablesで実現されており、
ネットワーク障害時の切り分けそしてiptablesを読みれると良いだろう。