Linux Lovers
    Fedora Coreで始めるサーバ構築

Home > 運用管理 > ファイアウォールスクリプト

iptablesとは

iptablesコマンドを使用してnetfilterの設定をし、パケットフィルタリングを行なうことができます。
これにより不要なパケットを遮断したり、必要なサービスのポートをオープンさせたりします。

iptablesはコマンドラインからルールの追加や削除を行なうことが可能です。
ただ、ここではスクリプトを作成し、こちらを実行してルールを適用し、パケットフィルタリングを行なうようにします。

なお、ここで作成するスクリプトは、ルータの配下にあるサーバを想定して作成します。



ファイアウォールスクリプトの作成

iptablesを利用して、ファイアウォールスクリプトを作成します。
/rootfirewall.shという名前で作成しました。以下にこのスクリプトの内容を貼り付けます。

#!/bin/sh
#
# NAME:
#    firewall.sh
#
#
################################################################################
# 基本設定
################################################################################
#
# 変数の設定
#
LOCALNET=192.168.1.0/24               # LANネットワーク(自分の環境に)
IPTABLES='/sbin/iptables'                # iptablesコマンド
#
# ルールの初期化
#
/etc/init.d/iptables stop
#
# デフォルトのルール設定
#
$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      # ローカルホストから出るものは許可


################################################################################
# INPUTチェイン
################################################################################

# LAN内からの接続を許可
$IPTABLES -A INPUT -s $LOCALNET -j ACCEPT

# 接続済みは許可
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#
# 外部へ公開するサービス
# ここにサービスで使用するポートを追加する
#
$IPTABLES -A INPUT -p tcp --dport 20 -m state --state NEW -j ACCEPT        # FTP-DATA
$IPTABLES -A INPUT -p tcp --dport 21 -m state --state NEW -j ACCEPT        # FTP
$IPTABLES -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT        # SSH
$IPTABLES -A INPUT -p tcp --dport 25 -m state --state NEW -j ACCEPT        # SMTP
$IPTABLES -A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT        # HTTP
$IPTABLES -A INPUT -p tcp --dport 110 -m state --state NEW -j ACCEPT       # POP3
$IPTABLES -A INPUT -p tcp --dport 143 -m state --state NEW -j ACCEPT       # IMAP
$IPTABLES -A INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT       # HTTPS
$IPTABLES -A INPUT -p tcp --dport 5010:5100 -m state --state NEW -j ACCEPT   # FTP PASV

# AUTHリクエスト拒否
$IPTABLES -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset


################################################################################
# OUTPUTチェイン
################################################################################

# 接続済みは許可
$IPTABLES -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# サーバからインターネットへ新規接続を許可
$IPTABLES -A OUTPUT -m state --state NEW -j ACCEPT


上記のスクリプトはwgetで入手できるようにしています。
また、このfirewall.shのハッシュ値は、c783eaf547abc001e799bf0891ee7e38 です。
wgetで入手後は、ハッシュ値が一致するか確認してください。

# wget http://chibi.name/script/firewall.sh
# md5sum firewall.sh


>>このページのTOPへ

スクリプトの使い方

続いて、このスクリプトの使い方を説明します。パケットフィルタリングはこのスクリプトを
利用して行なうようにしますので、先ずiptablesのサービスを停止します。そのあとでiptablesが自動で
起動しないようにオフ
にします。

# /etc/init.d/iptables stop
# chkconfig --level 2345 iptables off


あとは先ほどのスクリプトに実行権限を付けて、実行すればOKです。

# chmod 700 firewall.sh
# ./firewall.sh
ファイアウォールルールを適用中:         [ OK ]
チェインポリシーをACCEPTに設定中filter    [ OK ]
iptablesモジュールを取り外し中          [ OK ]

実行後、上のようなOKのサインが出れば、ちゃんと起動しました。

次に、コンピュータ起動時にこのスクリプトを実行するようにします。以下のようにします。

# vi /etc/rc.d/rc.local
/root/firewall.sh              ←追加


また、スクリプトのルールを変更して、設定を反映させたい場合は、また実行すればOKです。

# ./firewall.sh
ファイアウォールルールを適用中:         [ OK ]
チェインポリシーをACCEPTに設定中filter    [ OK ]
iptablesモジュールを取り外し中          [ OK ]



次に現在実行したパケットフィルタリングのルールを確認したい場合は、以下のようにします。

# iptables -L

Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  192.168.1.0/24       anywhere
ACCEPT     all  --  anywhere             anywhere       state RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere       tcp dpt:ftp-data state NEW
ACCEPT     tcp  --  anywhere             anywhere       tcp dpt:ftp state NEW
ACCEPT     tcp  --  anywhere             anywhere       tcp dpt:ssh state NEW
ACCEPT     tcp  --  anywhere             anywhere       tcp dpt:smtp state NEW
ACCEPT     tcp  --  anywhere             anywhere       tcp dpt:http state NEW
ACCEPT     tcp  --  anywhere             anywhere       tcp dpt:pop3 state NEW
ACCEPT     tcp  --  anywhere             anywhere       tcp dpt:imap state NEW
ACCEPT     tcp  --  anywhere             anywhere       tcp dpt:https state NEW
ACCEPT     tcp  --  anywhere             anywhere       tcp dpts:5010:5100 state NEW
REJECT     tcp  --  anywhere             anywhere       tcp dpt:auth reject-with tcp-reset

Chain FORWARD (policy DROP)
target     prot opt source               destination

Chain OUTPUT (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere        state RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere        state NEW

iptables -Lで確認をすることができます。スクリプトのルールと一致しているか確認してください。

最後に、現在適用されているルールを削除して、パケットフィルタリングを停止したい場合は以下のようにします。

# /etc/init.d/iptables stop
ファイアウォールルールを適用中:         [ OK ]
チェインポリシーをACCEPTに設定中filter    [ OK ]
iptablesモジュールを取り外し中          [ OK ]


この後で、上で紹介した、iptables -Lでルールの確認をしてみてください。先ほどとは違う結果が
返って来ると思います。



>>このページのTOPへ

ファイアウォールスクリプトの解説

先ほどのスクリプトをもう一度ここに書き、大事な部分の説明をしたいと思います。

# vi firewall.sh               ←viで編集する

#!/bin/sh
#
# NAME:
#    firewall.sh
#
#
################################################################################
# 基本設定
################################################################################
#
# 変数の設定
#
LOCALNET=192.168.1.0/24               # LANネットワーク(自分の環境に)
IPTABLES='/sbin/iptables'                # iptablesコマンド
#
# ルールの初期化
#
/etc/init.d/iptables stop
#
# デフォルトのルール設定
#
$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      # ローカルホストから出るものは許可


################################################################################
# INPUTチェイン
################################################################################

# LAN内からの接続を許可
$IPTABLES -A INPUT -s $LOCALNET -j ACCEPT

# 接続済みは許可
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#
# 外部へ公開するサービス
# ここにサービスで使用するポートを追加する
#
$IPTABLES -A INPUT -p tcp --dport 20 -m state --state NEW -j ACCEPT        # FTP-DATA
$IPTABLES -A INPUT -p tcp --dport 21 -m state --state NEW -j ACCEPT        # FTP
$IPTABLES -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT        # SSH
$IPTABLES -A INPUT -p tcp --dport 25 -m state --state NEW -j ACCEPT        # SMTP
$IPTABLES -A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT        # HTTP
$IPTABLES -A INPUT -p tcp --dport 110 -m state --state NEW -j ACCEPT       # POP3
$IPTABLES -A INPUT -p tcp --dport 143 -m state --state NEW -j ACCEPT       # IMAP
$IPTABLES -A INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT       # HTTPS
$IPTABLES -A INPUT -p tcp --dport 5010:5100 -m state --state NEW -j ACCEPT   # FTP PASV

# AUTHリクエスト拒否
$IPTABLES -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset


################################################################################
# OUTPUTチェイン
################################################################################

# 接続済みは許可
$IPTABLES -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# サーバからインターネットへ新規接続を許可
$IPTABLES -A OUTPUT -m state --state NEW -j ACCEPT

先ず、自分の環境に合わせて書き換える部分は、2つです。1つは、基本設定の中の変数の設定の
LOCALNET=の部分です。こちらは自分の環境に合わせて変更します。特にサブネットを分割しているなどが
無い場合は、ネットワークアドレスの後ろの/24はそのままでOKです。

あとは、INPUTチェインの外部へ公開するサービスの部分です。ここでは、当サイトで紹介している
一通りのサービスへの通信はOKにしてあります。足りないものがあれば、追加します。また、不要なものが
あれば削除してください。記述方法は後述します。

それでは、上から順番に見ていきます。このスクリプトでは、大きく3つに分けました。
基本設定INPUTチェインOUTPUTチェインです。

−基本設定−
先ず基本設定のデフォルトのルール設定の部分ですが、全てDROPにしてあります。
基本はインバウンドだろうとアウトバンドだろうと破棄する設定です。あとで必要な通信だけを
許可するようにしますので、これでOKです。なお、FORWARDは転送です。ルータ化した場合に
必要な部分です。ここでは特に必要無いですが、DROPと記述しておきました。

次のループバックアドレスの部分ですが、こちらは内へも外へも許可する必要があります。
この先、よく出てくる記述ですが、-j ACCEPTとなっています。-jの後ろに処理を書くように
なります。この場合は、許可するので-jの後ろをACCEPTとしています。破棄したいなら、DROP
と書きますし、拒否ならREJECTとなり、ログに記録したいならLOGと記述します。


−INPUTチェイン−
一番初めに、LAN内マシンからのアクセスは全て許可にしています。-s $LOCALNETとは、
$LOCALNETは一番最初に設定した変数の部分です。-sはソースアドレスを指定する際のオプションです。
この逆は、-dでデスティネーションアドレスです。この2つを簡単に説明すると、ソースアドレスは
パケットの送り主側です。デスティネーションはパケットの行き着く先、つまり受け取る側です。
-s $LOCALNET -j ACCEPTは、192.168.1.0/24からのパケットは全て-j ACCEPT(許可)ということです。

そして、この先頻繁に登場する-m state --stateですが、これはステートフルインスペクションの記述です。
ポートをただ開放するのではなく、パケットのデータを読み、要求の内容を判断して、ポートを動的に
開放
したりする機能です。-m state --state ESTABLISHED,RELATED -j ACCEPTは、
接続済みのものは許可という設定になります。

外部へ公開するサービスの部分ですが、ここには外部へ公開するサービスのポートを追加します。
LAN内だけに向けたサービスは記述する必要はありません。先ほど、LAN内マシンからの接続は
全て許可にしてあるからです。

この部分の記述に関しては、そのサービスがTCPサービスの場合は、-p tcpとします。
もし、UDPなら-p udpとします。--dportはデスティネーションポートです。宛先のポートという意味です。
--dport 22なら22番ポートへのアクセスです。ここでは出てこないですが、--sportなら、
送り主側のポートの指定
です。先ほど出てきた、ソースアドレス、デスティネーションアドレスと
同じ考え方です。

もし何かのサービスを追加する場合の注意点は、そのサービスがTCPなのかUDPなのか
何番のポートを使用するのかです。デフォルトで書いておいたサービスの記述を参考に
この2点を変更して追加します。

また、この外部へ公開するサービスの部分の最後の行のFTP PASVの行があります。
パッシブモードの設定をしていない場合はこの記述は必要ありません。この記述の中で大事なのは、
--dport 5010:5100の部分です。これは、5010番〜5100番までという意味です。このように
何番から何番までの指定は、「:」で区切って指定します。


−OUTPUTチェイン−
この部分は、この形のままでOKです。接続済みのもののアウトバンドは許可しています。
またこのサーバからの新規の接続も許可にしてあります。


iptablesの書式は複雑ですが、写しでも構わないので、自分で書いてみることをお勧めします。
オプションの意味を調べながら、書いていくうちにきっとiptablesの書式にも慣れてくると思います。

最後に、このスクリプトはルータの配下にあるサーバでのパケットフィルタリングを想定して作成しました。
なので、ICMP系のルールや、ログへの記録などの無い、シンプルなものになりました。
このページを通して、iptablesに興味が湧いた方はぜひ、もっと複雑な書式のスクリプトの作成に
チャレンジしてみてください。


>>このページのTOPへ

最終更新 : 06/17/2005


Fedoraの設定    SSH    Web    Mail    FTP    DNS    ファイルサーバ    運用管理    システム管理    ネットワーク    セキュリティ対策
Copyright (C) 2004-2007 chibi ,All Rights Reserved