Linuxのiptablesによるパケットフィルタリング入門

概要
1. iptablesとは
1-0. iptablesの機能
1-1. iptablesの動作確認
1-2. 設定されているiptablesを確認する
1-3. 押さえるべき用語
1-4. テーブル
1-5. チェイン
1-6. ルーティングと各チェインの関係
1-7. ターゲット
2. iptablesの基本操作
2-1. ルールを全て削除する
2-2. ルールを追加する
2-3. ルールを削除する
2-4. ルールを挿入する
2-5. 設定詳細を見る
3. iptablesの設定
3-1. /etc/init.d/iptables
3-2. /etc/sysconfig/iptables
3-3. /etc/sysconfig/iptables-config

1. iptablesとは

1-0. iptablesの機能
iptablesとはLinuxカーネル(バージョン2.4以降)に標準実装されているファイアウォール機能です。

iptablesには、主に以下の機能があります。

  • パケットフィルタリング
  • アドレス変換(NAT)
  • ポートフォワーディング

1-1. iptablesの動作確認

最近のLinuxディストリビューションではデフォルトで入っていると思います。

iptablesパッケージが入っているかどうか確認します。

*環境確認

# cat /etc/redhat-release
CentOS release 6.7 (Final)
# uname -r
2.6.32-573.7.1.el6.x86_64
# rpm -qa | grep iptables
iptables-1.4.7-16.el6.x86_64
iptables-ipv6-1.4.7-16.el6.x86_64

iptablesを利用するには、LinuxカーネルのNetfilterフレームワークが利用可能になっている必要があります。

# grep -i netfilter /boot/config-`uname -r`
CONFIG_NETFILTER=y
~略~

1-2. 設定されているiptablesを確認する

次のコマンドで設定を確認することができます。

# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

1-3. 押さえるべき用語
iptablesを理解するための重要用語として、テーブルチェインルールターゲットがあります。

用語 説明
テーブル パケットフィルタの動作を定義するためのカーネル内部のメモリ領域。テーブルにはチェインが登録される。
チェイン テーブルに登録されているパケットを取り扱う方法を記述したルールのリスト。いくつかの組み込み済チェインに加え、ユーザが定義することもできる。
ルール チェインに登録されるパケットの処理方法に関する定義。指定した条件に合致したパケットは、ターゲットに送られる。あらかじめ組み込まれている条件のほか、モジュールを組み込むことで条件を追加することも可能。
ターゲット ルールに記述された条件に合致したパケットの処理方法。他のチェインや、組み込みターゲット、あるいはモジュールとして組み込まれたターゲットを指定できる。

テーブル=チェイン+チェイン+...
チェイン=ルール+ルール+...
ルール=マッチング条件+ターゲット
のような関係になります。

1-4. テーブル
次の3つのテーブルが存在します。

テーブル名 説明
filter(デフォルト) パケットフィルタリングを設定
nat アドレス変換(NAT)を設定
mangle パケットの内容を変更
raw パケット追跡を無効にする設定

各テーブルの設定を確認するためには次のような形式になります。

# iptables -t <テーブル名> --list

例.

# iptables -t filter --list
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

1-5. チェイン
チェインはパケットを取り扱う方法を記述したルールのリストです。

# iptables -t filter -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

主に以下のチェインが存在します。

チェイン名 説明
INPUT パケット入力のルール
FORWARD パケットを転送するルール
OUTPUT パケット出力のルール
PREROUTING 入力前にパケット変換
POSTROUTING 出力後にパケット変換

各テーブルに用意されているチェイン

テーブル チェイン
filter INPUT,FORWARD,OUTPUT
nat PREROUTING,OUTPUT,POSTROUTING
mangle INPUT,OUTPUT,PREROUTING,POSTROUTING
raw OUTPUT,PREROUTING

1-6. ルーティングと各チェインの関係

f:id:eno0514:20150614202551g:plain
参照: iptablesとは? - SMILEJAPAN プログラミングメモ

PREROUTING、POSTROUTINGは主にnatテーブルで使用されます。

1-7. ターゲット
ターゲットは、ルールに一致したパケットの処理を指定するものです。
主に以下の指定ができます。

ターゲット名 説明
ACCEPT パケットを通過させる
DROP パケットを破棄する
REJECT DROPと同じだが、こちらはエラーパケットを送信する
SNAT 送信元IPアドレスの書き換えを行う。変換先IPアドレスが固定の場合に使う
DNAT 宛先IPアドレスの書き換えを行う
MASQUERADE 送信元IPアドレスとポート番号の書き換えを行う
LOG マッチしたパケットのログを記録する


2. iptablesの基本操作

2-1. ルールを全て削除する
設定されているルールをすべて削除するには次のような形式になります。

# iptables -t <テーブル名> -F

例.

# iptables -t filter -F

2-2. ルールを追加する
ルールを追加するには次のような形式になります。

# iptables -t <テーブル名> -A <チェイン名> <ルール>

例.

# iptables -t filter -A INPUT -p tcp -d 192.168.33.1 --dport 22 -s 192.168.33.0/24 -j ACCEPT

ルールの記述ですが、細かく分けると、

<マッチング条件> -j <ターゲット>

になります。

マッチング条件にはプロトコル、ポート番号、インターフェイス、モジュールなどが指定できます。

プロトコル、ポート番号

オプション 動作
-p [プロトコル名] プロトコル名(tcpudp、icmp、all)を指定
--sport ポート番号 送信元のポート番号を指定
--dport ポート番号 宛先のポート番号を指定
-s IPアドレス[マスク] 送信元(source)のIPアドレスを指定
-d IPアドレス[マスク] 宛先(distination)のIPアドレスを指定

インターフェイス

オプション 動作
-i インターフェース名 受信インターフェイスを指定。eth0、eth1などを指定可
-o インターフェース名 送信インターフェイスを指定。eth0、eth1などを指定可

・モジュール
「-m モジュール名」で指定できます。

オプション 用途
addtype アドレスタイプを指定してマッチングする
connlimit 一つのIPアドレスからの接続数でマッチングする
iprange IPアドレス幅を指定してマッチングする
mac MACアドレスでマッチングする
multiport 複数のポート番号を指定してマッチングする
state パケットの状態でマッチングする

各モジュールのヘルプは「iptables -m モジュール名 -h」で確認できます。

特に大事なのはstateモジュールだと思います。
例.

# iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT

stateオプションで指定可能なのは以下になります。

オプション パケットの状態
NEW 初見のパケット
ESTABLISHED 接続状態になるパケット
RELATED 接続状態にあるパケットに関連するパケット
INVALID NEW,ESTABLISHED,RELATED以外のパケット

2-3. ルールを削除する
ルールを削除するには次のような形式になります。

# iptables -t <テーブル名> -D <チェイン名> <行番号>

例.

# iptables -t filter -D INPUT 1

2-4. ルールを挿入する
ルールを挿入するには次のような形式になります。
挿入されたルールは最上位の行に追加されます。

# iptables -t <テーブル名> -I <チェイン名> <ルール>

例.

# iptables -t filter -I INPUT -p icmp -s 192.168.33.1 -j ACCEPT

2-5. 設定詳細を見る
vオプションを使います。

# iptables -vnL INPUT
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
  241 19690 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0
    0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
    1    52 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
   81  6318 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited


3. iptablesの設定
iptablesはコマンドで設定しても再起動時にはリセットされてしまいます。
恒久的に設定を有効にするには、設定ファイル(/etc/sysconfig/iptables)に記述する必要があります。

設定ファイル 用途
/etc/init.d/iptables システム起動時に実行するスクリプト。設定の再反映、有効、無効にする際にも使用
/etc/sysconfig/iptables テーブル、チェイン、ルールの設定
/etc/sysconfig/iptables-config /etc/init.d/iptables実行時のオプションを指定

3-1. /etc/init.d/iptables

# /etc/init.d/iptables
Usage: iptables {start|stop|restart|condrestart|status|panic|save}
オプション 説明
start /etc/sysconfig/iptables を読み込んで適用する
stop iptablesのルールを全て解除する
restart /etc/init.d/iptables stop & startと同じ
condrestart 正常に起動していたときのみ再起動する
status 有効になっている設定を表示する
panic すべての通信を破棄(DROP)する
save 設定されているルールを/etc/sysconfig/iptablesに上書きする

3-2. /etc/sysconfig/iptables

# cat /etc/sysconfig/iptables
----------------------------------------------------------------
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
*filter filterテーブルの開始
:INPUT ACCEPT [0:0] INPUTチェインのルールのデフォルトの動作
COMMIT filterテーブルの終了。設定を反映する

3-3. /etc/sysconfig/iptables-config
実行時のオプションが定義されています。

# cat /etc/sysconfig/iptables-config | grep -v '^#\|^$'
IPTABLES_MODULES=""
IPTABLES_MODULES_UNLOAD="yes"
IPTABLES_SAVE_ON_STOP="no"
IPTABLES_SAVE_ON_RESTART="no"
IPTABLES_SAVE_COUNTER="no"
IPTABLES_STATUS_NUMERIC="yes"
IPTABLES_STATUS_VERBOSE="no"
IPTABLES_STATUS_LINENUMBERS="yes"
主なオプション 説明
IPTABLES_STATUS_VERBOSE "/etc/init.d/iptables status"実行時に詳細モード(-vオプション)で表示する。デフォルトはNo。個人的には Yes にすることを推奨。
IPTABLES_STATUS_LINENUMBERS "/etc/init.d/iptables status"実行時に各チェインに設定されているルールに対して行番号を表示する。

以上になります。

参考:

iptablesとは? - SMILEJAPAN プログラミングメモ