■iptablesのインストール
# 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が正常に動作しているかどうかを確認するためには、-Lオプションを使ってコマンドを実行します。以下のように表示されれば正常に稼動しています。コマンド実行結果を見てわかるとおり、iptables
のデフォルトは全ての通信を受け入れるようになっていますので(ACCEPT)、これを必要な通信のみ通し、その他は遮断するというルールを作成していきます。
# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) Chain OUTPUT (policy ACCEPT) |
上記の実行結果で表示されている 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 | 自ホストから外部に出て行くパケットを最後にに処理するチェーン |
![]() |
![]() |
|
filter | パケットフィルタリングをするためのテーブル。INPUT/FORWARD/OUTPUTが存在する |
![]() |
|
nat | アドレス変換のためのテーブル。PREROUTING/POSTROUTING/OUTPUが存在する |
![]() |
|
mangle | 破損パケットのログ、パケットをNAT以外の目的で置き換えるときなどに使用するテーブル。PREROUTING/OUTPUTが存在する |
![]() |
iptablesのターゲットは以下表以外にもSNAT、DNAT、MASQUERADE、REDIRECTなど数多くありますが、その都度説明していきます。
![]() |
|
ACCEPT | ルールにマッチしたパケットの通過を許可する |
![]() |
|
DROP | ルールにマッチしたパケットの通過を廃棄する |
![]() |
|
REJECT | ルールにマッチしたパケットの通過を廃棄し、且つICMPエラーメッセージ(ICMP_UNREACHABLE)を返す。ICMPで送信元にエラーメッセージを返すと攻撃元に対して存在をばらすようなものなので通常は、REJECTではなく、DROPを使用する。 |
![]() |
|
LOG | ルールにマッチしたパケットをログに記録する |
![]() |
|
USER | 処理ルーチンをユーザーが作成した場合に使用する |
![]() |
以下に、基本的な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。 |
![]() |
![]() |
|
-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 | 接続されていないことを意味する |
![]() |
www.it-shikaku.jp
[Top] | |
[講義目次] | |
[327:アクセス制御] | |
[324:ネットワークセキュリティ] | |
![]() | [328.1 ネットワークの堅牢化] |
![]() | [328.2 ネットワークの侵入検知] |
![]() | [328.3 パケットフィルタ] |
![]() | [328.4 仮想プライベートネットワーク(VPN)] |
[330:仮想化] | |
[講義検索] | |
[リンク集] |