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. ルーティングと各チェインの関係
参照: 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 [プロトコル名] | プロトコル名(tcp、udp、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"実行時に各チェインに設定されているルールに対して行番号を表示する。 |
以上になります。
参考: