« yum コマンドで DVD(ISO イメージファイル)からパッケージをインストールできるようにする / RHEL 6.4 (64-bit) | トップページ | CentOS 6.5 (64-bit) のインストール / CentOS 6.5 (64-bit) »

iptables : filter テーブル / RHEL 6.4 (64-bit)

【 iptables 】

サーバーに届く/サーバーから出ていくパケットのフィルタリングや、ネットワーク間でルーティングするときに使用します。それぞれのパケットの取り扱いをまとめたものを"テーブル"と呼び、パケットフィルタリングは"filter テーブル"、ルーティングは"nat テーブル"と呼ばれます。さらにテーブルは"チェイン"と呼ばれるルールに分けられます。filter テーブルは "INPUT チェイン"、"OUTPUT チェイン"、"FORWARD チェイン"の3つに分けることができます。




【オペレーション】

設定ファイルの内容確認

[root@rhel ~]# 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
[root@rhel ~]#


設定内容確認

[root@rhel ~]# iptables -L -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
 1094 77154 ACCEPT     all  --  any    any     anywhere             anywhere            state RELATED,ESTABLISHED
    0     0 ACCEPT     icmp --  any    any     anywhere             anywhere
    0     0 ACCEPT     all  --  lo     any     anywhere             anywhere
    2   104 ACCEPT     tcp  --  any    any     anywhere             anywhere            state NEW tcp dpt:ssh
   37  3943 REJECT     all  --  any    any     anywhere             anywhere            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 REJECT     all  --  any    any     anywhere             anywhere            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT 1227 packets, 954K bytes)
 pkts bytes target     prot opt in     out     source               destination
[root@rhel ~]#


サービスの起動(開始)

[root@rhel ~]# service iptables start
iptables: Applying firewall rules:                         [  OK  ]
[root@rhel ~]#


サービスの停止

[root@rhel ~]# service iptables stop
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Unloading modules:                               [  OK  ]
[root@rhel ~]#


サービスの再起動

[root@rhel ~]# service iptables restart
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Unloading modules:                               [  OK  ]
iptables: Applying firewall rules:                         [  OK  ]
[root@rhel ~]#


自動起動 ON

[root@rhel ~]# chkconfig iptables on
[root@rhel ~]#


自動起動 OFF

[root@rhel ~]# chkconfig iptables off
[root@rhel ~]#


ランレベル毎の起動状況確認(自動起動 ON 時)

[root@rhel ~]# chkconfig --list iptables
iptables        0:off   1:off   2:on    3:on    4:on    5:on    6:off
[root@rhel ~]#


ランレベル毎の起動状況確認(自動起動 OFF 時)

[root@rhel ~]# chkconfig --list iptables
iptables        0:off   1:off   2:off   3:off   4:off   5:off   6:off
[root@rhel ~]#




【チェインの作成】

filter テーブルのチェインの記載ルールです。
-A チェーン マッチングルール -j ターゲット


先ず自サーバーを中心に、どのチェーンにルールを追加(Add)するのかを決定します。

 ■ 自サーバーに入ってくる  → INPUT  → -A INPUT
 ■ 自サーバーから出ていく  → OUTPUT  → -A OUTPUT
 ■ 自サーバーを経由していく → FORWARD → -A FORWARD


次にマッチングルールを指定します。マッチングルールにはフィルタリングするパケットの送信元(Source)や宛先(Destination)、プロトコル(Protocol)、ポート番号(Destination Port/Source Port)を指定します。

 ■ 送信元 → -s IPアドレス / 省略した場合はすべての送信元
 ■ 宛先  → -d IPアドレス / 省略した場合はすべての宛先
 ■ プロトコル → tcp | udp | icmp → -p tcp | -p udp | -p icmp
 ■ 自サーバーで受け付けるポート番号 → --dport ポート番号
 ■ 他サーバーに送り出すポート番号  → --sport ポート番号


最後に受け付けた/送り出したパケットの扱いを指定します。

 ■ 許可する  → INPUT  → -j ACCEPT
 ■ 破棄する  → OUTPUT  → -j DROP
 ■ 破棄する  → REJECT  → -j REJECT / 送信元に ICMP エラーメッセージを送付
 ■ ログに記録 → LOG   → -j LOG


自サーバーで 送信元 192.168.1.1 からのSSH 接続(TCP / ポート番号 22)を許可するルールを INPUT チェインに追加する例です。

 -A INPUT -s 192.168.1.1 -p tcp --dport 22 -j ACCEPT


まとめると次のようになります。




【iptables ファイルの解読】

RHEL 6.4 のインストール直後の /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


先頭が # で始まる行はコメント行です。

# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.


filter テーブルであることを明示しています。この行から"COMMIT"までが filter テーブルの記載内容になります。

*filter


各チェインにおけるパケットのデフォルトの扱いを指定しています。下記の例ではすべて許可(ACCEPT)しています。この行以降に OUTPUT チェイン( -A OUTPUT )の記載がないので、出ていくパケットはノーチェックになります。

:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]


"-m state --state ESTABLISHED,RELATED"は「すでに通信しているパケット」を意味します。よって下記は、「すでに通信しているパケットは許可」になります。

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT


ICMP プロトコルの通信はポート番号に関係なく許可します。

-A INPUT -p icmp -j ACCEPT


"-i"はインターフェース(Interface)を指定します。"lo"はループバックインターフェースを指します。よってこれはループバックインターフェース(=自分自身)からの通信を許可しています。

-A INPUT -i lo -j ACCEPT


"-m state --state NEW"は新規の通信を意味します。"-m tcp"は TCP パケット内の SYN などのフラグをチェックするときに指定します(例:SYN フラグが立っている → -m tcp --tcp-flags SYN )。TCP フラグのチェックを行わないときは省略できます。

-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT


接続要求のパケットを破棄し、送信元に"icmp-host-prohibited(到達不可)"を返します。

-A INPUT -j REJECT --reject-with icmp-host-prohibited


転送要求のパケットを破棄し、送信元に"icmp-host-prohibited(到達不可)"を返します。

-A FORWARD -j REJECT --reject-with icmp-host-prohibited


filter テーブルの区切りになり、ここまでの設定を有効にします。

COMMIT




【条件の評価順序】

iptables の記載されたルールは、基本ルールと優先ルールに分けることができます。次の部分が基本ルールになります。

: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


優先ルールは基本ルールよりも優先されるます。そのため、基本ルールで「破棄」を指定していても優先ルールで「許可」を指定した場合、優先ルールの「許可」が優先されます。優先ルールは、先頭から順番に評価されます。該当する条件が見つかると、それ以降の条件はチェックされません。上述のインストール直後の /etc/sysconfig/iptables ファイルの評価順序をフローに表わすと下図のようになります。


次の内容でもほぼ同じ結果が得られます。違いは許可されなかった場合、送信元に"icmp-host-prohibited(到達不可)"が返されない点です。
■基本ルールで INPUT チェインと FORWARD チェインは「破棄」、OUTPUT チェインは「許可]
■優先ルールで INPUT チェインで「許可」するものを定義

*filter
:INPUT DROP [0:0]
:FORWARD DROP [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 -p tcp --dport 22 -j ACCEPT
COMMIT


« yum コマンドで DVD(ISO イメージファイル)からパッケージをインストールできるようにする / RHEL 6.4 (64-bit) | トップページ | CentOS 6.5 (64-bit) のインストール / CentOS 6.5 (64-bit) »

Linux」カテゴリの記事