ITエンジニアのコツコツ日記

ITエンジニアの雑記です

iptables 考え方、設定方法について(入門)

iptablesとは

iptablesLinuxに搭載されているパケット操作のための仕組み。

よく使う方法としてはパケットフィルタとしての使い方で簡単なファイアウォールを作れたりする。

本質としてはパケット操作全般が可能であるため、しっかり作りこめばルータ機能を実装したり、kubernetesDockerのようなコンテナ内通信を実現できる。

iptablesの基礎

iptablesは古くからLinuxに搭載されているパケット操作ツールである。

iptablesはパケット操作の設定をするためのフロントエンドインタフェースであり、実態としてはLinuxカーネルのNetfilterに対して設定を行う。

LinuxカーネルのNetfilterが実際のパケットを処理するため、ここらの関係性を理解する必要がある。

なお、CentOS7以降ではパケットフィルタツールとしてfirewalldが導入されたが、firewalldがやっているのは実はiptablesを操作するだけのフロントエンドツール。

つまり、FirewalldiptablesNetfilter のように内部では操作が行われている。

やはり最終的なNetfilterの理解は避けられない。

iptablesにおける登場人物

iptablesNetfilterのフロントエンドツールであり、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を用いてソフトウェア処理をさせるケースが考えづらいため、ほぼ使われないだろう。

チェイン

チェインはパケット操作を実行する場所(タイミング)を定義する。

f:id:itkotsukotsu:20201009005539p:plain

種類 説明
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は複数のエントリが記述可能なため、エントリ間の効果の範囲と優先度を意識する必要がある。

エントリの優先順位

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のエントリがある。

このあとにDROPREJECTが記述されており、これはホワイトリスト形式での記述になる。

もちろんDROPを優先度を上げて、具体的に許可するエントリを書くブラックリスト方式も可能だ。

エントリの操作として--replace--insertがあり、任意の場所で修正変更操作が可能だ。

まとめ

今回はiptablesの設計思想と記述方法について記載した。

iptablesの各エントリの意味とエントリの適用順序を理解することでパケットの処理を理解することが可能だ。

最近だとDockerやKubernetes等の仮想ネットワークはiptablesで実現されており、 ネットワーク障害時の切り分けそしてiptablesを読みれると良いだろう。