Home Update クッキー及びWeb ビーコンについて



iptablesによるパケットフィルタリング

iptablesの概要

iptablesを使ったパケットフィルタリングについて解説していきます。非常に奥が深く、管理人も完全に理解したとは言い難いので、実運用する際には各自の責任において行ってください。




■iptablesのインストール

 RedHat9標準付属のRPMパッケージを使用していきます。インストールされていない方は予めインストールを済ませておいてください。

# rpm -q iptables
パッケージ iptables はインストールされていません
# rpm -ivh iptables-1.2.7a-2.i386.rpm



 なお、iptables を使用するためには、ipchains がロードされていないことを確認してください。Red Hat9のデフォルトは、iptables のみインストールされます(CD-ROMにはipchains が含まれています)。lsmod コマンドで何も表示されなければ問題ありません。念のため、iptablesがロードされているかどうかも確認しておきます。

# lsmod | grep ipchain
# lsmod | grep iptable
iptable_filter 2412 0 (autoclean) (unused)
ip_tables 15096 1 [iptable_filter]



■iptablesの基本

 インストール後、iptablesが正常に動作しているかどうかを確認するためには、-Lオプションを使ってコマンドを実行します。以下のように表示されれば正常に稼動しています。コマンド実行結果を見てわかるとおり、iptables のデフォルトは全ての通信を受け入れるようになっていますので(ACCEPT)、これを必要な通信のみ通し、その他は遮断するというルールを作成していきます。

# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination


 上記の実行結果で表示されている INPUT、OUTPUT、FORWARD はパケットを処理するルールのかたまりのことでBuiltinチェーンと呼ばれています。各チェーンはそれぞれに意味を持っていますので下記に記述します。簡単に説明してしまえば、外部からの内部へのパケットはINPUTで処理し、内部から外部へのパケットはOUTPUTで処理します。PREROUTINGやPOSTROUTINGは、LinuxマシンをNATルータとして使用する際に用います。FORWARDもLinuxマシンがルータとして動作する場合に、他のホストへルーティングされるパケットを処理します。FORWARDを有効にするには、/proc/sys/net/ipv4/ip_forward の値が「1」になっている必要があります。

 PREROUTING 自ホストに届いたパケットを一番最初に処理するチェーン
 INPUT 自ホストが最終的な宛先である場合に処理するチェーン
 OUTPUT 自ホストから外部に発せられたパケットを処理するチェーン
 FORWARD 転送するパケットを処理するチェーン
 POSTROUTING 自ホストから外部に出て行くパケットを最後にに処理するチェーン

■テーブル

 パケットを処理する際に、処理の目的別にテーブルが存在し、以下の3つのテーブルが存在します。

 filter パケットフィルタリングをするためのテーブル。INPUT/FORWARD/OUTPUTが存在する
 nat アドレス変換のためのテーブル。PREROUTING/POSTROUTING/OUTPUが存在する
 mangle 破損パケットのログ、パケットをNAT以外の目的で置き換えるときなどに使用するテーブル。PREROUTING/OUTPUTが存在する





 iptablesのターゲットは以下表以外にもSNAT、DNAT、MASQUERADE、REDIRECTなど数多くありますが、その都度説明していきます。

◎iptables のターゲット
 ACCEPT ルールにマッチしたパケットの通過を許可する
 DROP ルールにマッチしたパケットの通過を廃棄する
 REJECT ルールにマッチしたパケットの通過を廃棄し、且つICMPエラーメッセージ(ICMP_UNREACHABLE)を返す。ICMPで送信元にエラーメッセージを返すと攻撃元に対して存在をばらすようなものなので通常は、REJECTではなく、DROPを使用する。

 LOG ルールにマッチしたパケットをログに記録する
 USER 処理ルーチンをユーザーが作成した場合に使用する



■iptables の主なコマンド

 以下に、基本的なiptablesの書式を説明します。ルールを追加するには-A(APPEND)オプションを使用します。チェーンの一番最後に追加されます。

 iptables -A <チェイン> <オプション>

 ルールを表示するには、-L(LIST)オプションを使用します。チェイン及びオプションを省略した場合は、全てのチェインを表示します。--line-numbers オプションをつけるとルール番号を表示します。

 iptables -L [ <チェイン> ] [ <オプション> ]

 既定のルールを削除するには、-D(DELETE)オプションを使用します。-F(FLUSH)オプションを使用すると指定されたチェーン全てのルールを削除します。チェインを省略した場合は、指定されたテーブル全てのチェインのルールを削除します。ルールを初期化したい場合などに利用します。

 iptables -D <チェイン> <オプション>
 iptables -D <チェイン> <ルール番号>
 iptables -F [ <チェイン> ]

 ルールを挿入するには、-I (INSERT)オプションを使用します。指定されたチェインの指定されたルール番号の場所にルールを挿入することができ、ルール番号が省略された場合は、1が指定されたとみなします(チェインの先頭)。

 iptables -I <チェイン> [ <ルール番号> ] <オプション>

 ルールを変更するには、-R(REPLACE)オプションを使用します。

 iptables -R <チェイン> <ルール番号> <オプション>

 その他の iptables コマンドを以下に列挙します。

 -Z 各ルールを通過したパケット数及びバイト数をクリア(ZERO)する
 -N ユーザーチェーンを作成する(NEW)。
 -X ユーザーチェーンを削除する
 -P チェーン内全体で有効なポリシーを設定する。デフォルトはACCEPT。



■iptables の主なオプション

 -p プロトコルを指定する。サービス名、もしくはポート番号どちらかで指定可。サービス名の正式名称に関しては、/etc/protocols を参照。

 -s ソース(source)IPアドレスを指定する。IPアドレスを省略した場合は全てのIPアドレスを意味する(0.0.0.0/0)
 --sport ソースのポート番号を指定する。サービス名、もしくはポート番号どちらかで指定可。省略した場合は、全てのポート番号(1:65535)が使われる

 -d デスティネーション(destination)IPアドレスを指定する
 --dport デスティネーション(destination)ポート番号を指定する
 -i INPUTまたは、FORWARTで使用する入力側のNICを指定する
 -o OUTPUTまたは、FORWARTで使用する入力側のNICを指定する
 -j ターゲットを指定する
 -m state ステートフル・パケット・インすぺクションで使用する
 -m multiport 複数のポート番号をカンマで区切って最大15個まで指定できる
 --log-prefix Syslog に任意のメッセージを追加する
 --limit DoS攻撃などに対応するオプション
 --syn SYNフラグをオンにし、ACK及びRSTフラグをオフにする。「 ! 」が先頭についた場合は逆を意味する(!--syn)



■ルールの作成


 通常、パケットフィルタリングのルールには、「デフォルト許可」と「デフォルト拒否」の2種類があります。デフォルト許可では、全ての通信を許可し、危険と思われる通信のみ遮断します。デフォルト拒否は、全ての通信を拒否し、必要なサービスの通信のみ許可するというもので、サーバーマシンの場合、通常は「デフォルト拒否」で設定するのが一般的です。ここでは、「デフォルト拒否」を前提として解説を進めていきます。なお、ルールを作成にあたって、ルールが多くなってくるといちいち手入力していたのでは非常に面倒ですし、間違いも発生しやすくなりますので、通常はシェルスクリプトを作成し、それを修正しながら、ルールを作成していきます。なお、注意しておきたいのは、ルールはおそらく人それぞれだと思うので、筆者が記述したルールを鵜呑みにせず、参考程度に読んでくださるようお願いします。筆者もまだまだ勉強中の身ゆえ、必ずしも以下の説明が正しいとは限らないのでそこのところを理解して読んでください。

 なお、筆者の場合、サーバーをDMZ上ではなく、ルータ越しに設置してあるため、その前提で説明をしています。


◎筆者の環境でのパケットフィルタリング例
#!/bin/sh
#
# IPTABLES の定義
IPTABLES="/sbin/iptables"

#
# 既存のテーブルを全て削除
$IPTABLES -F

#
##---------------------------IPアドレスの定義------------------------------##
HST_IP="172.16.50.2/27" # LinuxサーバーのIPアドレス
WWW_IP="172.16.50.2/27" # WebサーバーのIPアドレス
SSH_IP="172.16.50.2/27" # SSHサーバーのIPアドレス
SMT_IP="172.16.50.2/27" # SMTPサーバーのIPアドレス
POP_IP="172.16.50.2/27" # POPサーバーのIPアドレス
FTP_IP="172.16.50.2/27" # FTPサーバーのIPアドレス
SQD_IP="172.16.50.2/27" # SquidサーバーのIPアドレス
NS1_IP="172.16.50.2/27" # プライマリDNSのIPアドレス
NS2_IP="172.16.50.4/27" # 内向けセカンダリDNSのIPアドレス
NS3_IP="203.141.128.33/32" # 外向けセカンダリDNSのIPアドレス
NS4_IP="195.20.105.149/32" # 外向けセカンダリDNSのIPアドレス
NTP1_IP="133.100.9.2/32" # NTPサーバーのIPアドレス
NTP2_IP="133.100.11.8/32" # NTPサーバーのIPアドレス
WSV_IP="172.16.50.4/27" # Windows2000サーバーのIPアドレス

## Port番号の定義
MUL_PORT="http,ssh,pop3,smtp,ftp" # 応答のみのサーバーポート
FTP_PORT="40000:40100" # FTPポート( Passive Mode 用)

## ネットワークアドレスの定義
MY_NET="172.16.0.0/16" # 自ネットワークの定義
AL_NET="0.0.0.0/0" # 全てのネットワークアドレス

## FTPモジュールのロード
modprobe ip_conntrack_ftp # FTPステートフル・パケットインスペクション

##---------------------------デフォルト拒否ルール---------------------------##
# 暗黙のdeny(デフォルト拒否)
$IPTABLES -P INPUT DROP
$IPTABLES -P FORWARD DROP
$IPTABLES -P OUTPUT DROP
#

##---------------------------アクセス許可ルール-----------------------------##
#
# ループバックアドレスに関しては全て許可する
$IPTABLES -A INPUT -i lo -j ACCEPT
$IPTABLES -A OUTPUT -o lo -j ACCEPT

# ( For WWW/SSH/POP3/SMTP/DNS/FTP )
$IPTABLES -A INPUT -p tcp -m multiport -d $HST_IP --dport $MUL_PORT -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -m multiport -s $HST_IP --sport $MUL_PORT -j ACCEPT ! --syn

# ( For SMTP )
$IPTABLES -A INPUT -p tcp -d $SMT_IP --dport 25 -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -s $SMT_IP --sport 25 -j ACCEPT ! --syn

$IPTABLES -A OUTPUT -p tcp -s $SMT_IP --dport 25 -j ACCEPT
$IPTABLES -A INPUT -p tcp -d $SMT_IP --sport 25 -j ACCEPT ! --syn

# ( For Squid [ 自ネットワークからのみアクセスを許可 ] )
$IPTABLES -A INPUT -p tcp -s $MY_NET --dport 3128 -j ACCEPT
#
# ( For SMB [ 自ネットワークのファイル共有の許可 ] )
$IPTABLES -A INPUT -p udp -s $MY_NET --dport 137:138 -j ACCEPT
$IPTABLES -A OUTPUT -p udp -d $MY_NET --sport 137:138 -j ACCEPT
$IPTABLES -A INPUT -p tcp -m state --state NEW -s $MY_NET --dport 139 -j ACCEPT ! --syn

# ( For DNS Rule1 [ 自ネットワークからのクエリの許可 ] )
$IPTABLES -A INPUT -p udp -s $MY_NET --dport 53 -j ACCEPT
$IPTABLES -A OUTPUT -p udp -d $MY_NET --sport 53 -j ACCEPT
# ( For DNS Rule2 [ 自ネットワークからのクエリの許可 ] )
$IPTABLES -A INPUT -p udp -s $NS3_IP --dport 53 -j ACCEPT
$IPTABLES -A OUTPUT -p udp -d $NS3_IP --sport 53 -j ACCEPT
# ( For DNS Rule2 [ 外部DNSへの問い合わせを許可する ] )
$IPTABLES -A OUTPUT -p udp --dport 53 -j ACCEPT
$IPTABLES -A INPUT -p udp --sport 53 -j ACCEPT
# ( For DNS [ ゾーン転送の許可 ] )
$IPTABLES -A INPUT -p tcp -s $NS2_IP -d $NS1_IP --dport 53 -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -s $NS1_IP -d $NS2_IP --sport 53 -j ACCEPT ! --syn
$IPTABLES -A INPUT -p tcp -s $NS3_IP -d $NS1_IP --dport 53 -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -s $NS1_IP -d $NS3_IP --sport 53 -j ACCEPT ! --syn
$IPTABLES -A INPUT -p tcp -s $NS4_IP -d $NS1_IP --dport 53 -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -s $NS1_IP -d $NS4_IP --sport 53 -j ACCEPT ! --syn

# ( For FTP Control [ 自ネットワークのみ許可 ] )
$IPTABLES -A INPUT -p tcp -d $FTP_IP --dport 21 -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -s $FTP_IP --sport 21 -j ACCEPT ! --syn

# ( For FTP Data by Passive Mode [ 自ネットワークのみ許可 ] )
$IPTABLES -A INPUT -p tcp --dport $FTP_PORT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --sport $FTP_PORT -m state --state ESTABLISHED -j ACCEPT

# ( For NTP [ 外部NTPサーバーからの問い合わせを許可 ] )
$IPTABLES -A INPUT -p udp -s $NTP1_IP --dport 123 -j ACCEPT
$IPTABLES -A OUTPUT -p udp -d $NTP1_IP --sport 123 -j ACCEPT
$IPTABLES -A INPUT -p udp -s $NTP2_IP --dport 123 -j ACCEPT
$IPTABLES -A OUTPUT -p udp -d $NTP2_IP --sport 123 -j ACCEPT

# ( For Ident [ Identサーバーへのアクセスを拒否する])
$IPTABLES -A OUTPUT -p tcp --dport 113 -j REJECT

# ( For dest-unreachable )
$IPTABLES -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
$IPTABLES -A OUTPUT -p icmp --icmp-type destination-unreachable -j ACCEPT

# ( For Ping [ 自ネットワークからのPingに応答 ] )
$IPTABLES -A INPUT -p icmp --icmp-type 8 -s $MY_NET -d $HST_IP -j ACCEPT
$IPTABLES -A OUTPUT -p icmp --icmp-type 0 -s $HST_IP -d $MY_NET -j ACCEPT

#
# End Of Rules


■ステートフル・インスペクション

 NEW 新規の接続を許可する
 ESTABLISHED 戻りパケットを許可する
 RELATED 前の通信と関連のある接続を許可する。FTPのデータコネクションやICMPエラーメッセージの関係などに使用する
 INVALID 接続されていないことを意味する







TOPに戻る

Sponcerd Link


Search
 
Web サイト内
Rental Server

【レンタルサーバのXbit】 低価格・高品質のビジネスクオリティー。300メガ1,050円〜30分で サービススタート可能!


容量300MB、月額125円、高性能なサーバが日本最大級のバックボーンに直結。
さくらのレンタルサーバ




当サイトはLinux自宅サーバーの構築を目的としたサイトです。
当サイトに関するご意見、ご要望等は、こちらのメールアドレスよりお願いします。
Beginning | Introduction | Installation | Server |
Security | Tips | Guest Book | Related-Sites
Copyright©2003-2006 KORO All Rights Reserved.
総計:
今日:
昨日: