
| iptablesとは |
iptablesコマンドを使用してnetfilterの設定をし、パケットフィルタリングを行なうことができます。
これにより不要なパケットを遮断したり、必要なサービスのポートをオープンさせたりします。
iptablesはコマンドラインからルールの追加や削除を行なうことが可能です。
ただ、ここではスクリプトを作成し、こちらを実行してルールを適用し、パケットフィルタリングを行なうようにします。
なお、ここで作成するスクリプトは、ルータの配下にあるサーバを想定して作成します。
| ファイアウォールスクリプトの作成 |
iptablesを利用して、ファイアウォールスクリプトを作成します。
/rootにfirewall.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 |
| スクリプトの使い方 |
続いて、このスクリプトの使い方を説明します。パケットフィルタリングはこのスクリプトを
利用して行なうようにしますので、先ず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でルールの確認をしてみてください。先ほどとは違う結果が
返って来ると思います。
| ファイアウォールスクリプトの解説 |
先ほどのスクリプトをもう一度ここに書き、大事な部分の説明をしたいと思います。
| # 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に興味が湧いた方はぜひ、もっと複雑な書式のスクリプトの作成に
チャレンジしてみてください。
最終更新 : 06/17/2005