Linuxで作るファイアウォール[準備編]
第3回 Linuxで作るファイアウォール[準備編]前回まででホストレベルのセキュリティ対策を行った。今回からはネットワークレベルに目を向けよう。まずはiptablesを使ったパケットフィルタリング機能でファイアウォールを構築する。今回はiptablesを使うための準備について解説する。
現在、多くのサイトでファイアウォールが導入されていますが、商用ファイアウォールを導入したくてもコストの面から導入を見送っているサイトもあるのではないかと思います。
ファイアウォールの種類は、プロキシ型とパケットフィルタリング型に大別できます。両者の違いなどについては省略させていただくとして、今回から比較的安価にファイアウォールを構築できるLinux(iptables)を用いて、パケットフィルタリング型ファイアウォールを構築する方法を説明していきます。
構築の前提条件
![]() |
図1 前提とするネットワーク |
今回もまた、Red Hat Linux7.1J(kernel 2.4系)を例に説明します。kernel 2.2系のipchainsでもファイアウォールを構築することは可能ですが、ipchainsより優れているiptablesを使うことをお勧めします。
以下の解説では、例として次のような構成を前提にファイアウォールの構築を進めていきます。IPアドレスなどについては、適宜自分の環境に読み替えてください。
どのようなファイアウォールになるのかを簡単に説明します。まず、ファイアウォールの外側(インターネット側)のインターフェイスに保護対象となるサーバの仮想IPアドレスを割り当てます。実際のサーバはファイアウォールの内側に設置し、プライベートアドレスを割り当てます。
Webサーバに対してHTTPによるアクセスがあったとします。名前解決によって返されるIPアドレスに対してアクセスしてくるわけですが、これはファイアウォールの外側のインターフェイス(eth0)が受け取ります。ファイアウォールはルールに従ってNAT(Network Address Translator)を実行し、Webサーバに転送します。
ファイアウォールの外側のインターフェイスであるeth0には、以下のように各サーバの仮想IPアドレスを割り当てます。
ルータ | 172.16.0.1 | ||
ファイアウォール | eth0 | 172.16.0.100 | |
eth0:1 | 172.16.0.10 (Webサーバの仮想IPアドレス) | ||
eth0:2 | 172.16.0.20 (メールサーバの仮想IPアドレス) | ||
eth0:3 | 172.16.0.30 (DNSサーバの仮想IPアドレス) | ||
eth1 | 192.168.1.1 | ||
Webサーバ | 192.168.1.10 | ||
メールサーバ | 192.168.1.20 | ||
DNSサーバ | 192.168.1.30 | ||
表 IPアドレス一覧 |
ファイアウォールのための基本設定
これからファイアウォールを構築していくわけですが、その前にいくつかやっておかなければならない作業があります。
■カーネルの再構築
Red Hat Linux 7.1 Jのカーネルは2.4系なのでiptablesに対応しているのですが、デフォルトではモジュールが組み込まれていないため再構築する必要があります。また、せっかくカーネルを再構築するのですから、ついでに最新版にしておきましょう。
カーネルの最新版は、
ftp://ftp.kernel.org/
からダウンロードできます(編注)。2001年10月11日現在の最新版はkernel 2.4.12です。
編注:特に理由がなければミラーサイトからダウンロードすることをお勧めする。カーネルのミラーサイトは、http://www.kernel.org/mirrors/で調べることが可能だ。 |
ダウンロードしたら、カーネルのアップグレード作業を行います。以下に再構築の例を挙げますが、必ずしもここ例と同じ手順で行う必要はありません。重要なのは、iptablesを使うのに必要なモジュールをカーネルに組み込むことです(編注)。
編注:ここではmenuconfigを使っているが、xconfigなどでも構わない。カーネル2.4のインストール/再構築については、カーネル2.4.0導入活用術も参照。 |
$ tar -zxvf linux-2.4.12.tar.gz |
make menuconfigを実行すると、カーネルの設定画面になります。iptablesを組み込むには、まず「Networking options --->」を選択します。
![]() |
画面1 Networking options--->を反転させて[Enter]キーを押す |
次に、「Network packet filtering(replaces ipchains)」にチェックを入れます。
![]() |
画面2 Network packet filteringを選択 |
下の方にある「IP: Netfilter Configuration --->」を選択します。
![]() |
画面3 IP: Netfilter Configuration--->で[Enter]キー |
ここから、iptablesに必要なモジュールを選択していきます。すべて選択しておけばよいでしょう。
![]() |
画面4 モジュールをすべて選択 |
ここではiptablesに関連する部分だけを紹介しましたが、もちろん必要に応じてデバイスそのほかの設定も行っておいてください。設定が終わったらセーブします。これでカーネルをコンパイルする用意が整いました。
次にコンパイル/インストール作業を行います。以下に手順の一例を挙げます。
# make dep; make clean |
カーネルのコンパイルが正常に終了したら、新しいカーネルで起動するように/etc/lilo.confファイルを修正します。
boot=/dev/hda |
/etc/lilo.confを書き換えただけでは有効になりません。ファイルの編集後、以下のコマンドを実行してLILOの新設定を有効にします。
# /sbin/lilo |
以上で、iptablesを組み込んだカーネルが起動するようになりました。
# reboot |
などでファイアウォール用マシンを再起動します。
再起動したら、新カーネルでフィルタリング機能とNAT機能が有効になっているかを確認します。以下のようにオプション付きでiptablesを実行します。
# iptables -L |
以上のように出力されればカーネルの再構築は完了です。うまくいかない場合は、もう一度カーネルを再構築してみてください。
■仮想IPアドレスの割り当て
図1からも分かるように、NIC(Network Interface Card)が2枚挿入されているマシンをファイアウォールにします。NICはLinuxに対応しているものを用意してください。eth0がグローバルアドレス側、eth1がプライベートアドレス側になります。ここでは、外側のインターフェイス(eth0)に仮想IPアドレスを割り当てます。
Red Hat Linux 7.1Jの場合、NICの設定などは/etc/sysconfig/network-scripts以下のファイルで行います。ここにはifcfg-eth0というファイルが存在します。このファイルを起動時に読み込むことにより、インターフェイスにIPアドレスが割り当てられます。内容は次のようなものになります。
# cat /etc/sysconfig/network-scripts/ifcfg-eth0 |
では、OS起動時にeth0に対して仮想IPアドレスが割り当てられるようにしましょう。ifcfg-eth0を参考にして、/etc/sysconfig/network-scripts以下に新しいファイルを作成します。以下はifcfg-eth0:1の例です。
# cd /etc/sysconfig/network-scripts |
ファイルを作成したら、Linuxを再起動して仮想IPアドレスが割り当てられているかどうかを確認します。
# ifconfig -a |
以上のようになっていれば成功です。試しに、仮想IPアドレスに対してpingを打ってみて応答があるか確認してみましょう(注)。同様にして、ほかのサーバに対する仮想IPアドレスも割り当てます。
注:eth0とeth0:1のHWaddrが同じになっていることも確認します。 |
ルールの設計
以上で、カーネルとNICの準備は完了しました。後はiptablesの設定を残すのみとなったわけですが、どのような設定を行うのかが問題です。ルールの設計が不十分だと、せっかくのファイアウォールも無意味になってしまいます。また、セキュリティを強くしすぎて必要なサービスまで使えなくしてしまうと、不便な環境になってしまいます。何を何から守るのか、何が必要で何が不要なのかをしっかり検討して、各自の環境に最適なルールを設計しましょう。
まず、どのようなルールにするのかを書き出してみます。実際に図に書き起こすと分かりやすくなります。対象ホストを書き、パケットの経路を矢印で表します。こうすると、パケットの流れがとても分かりやすくなるのでルールの設計が容易になります。
■フィルタリングルール
今回は、例として以下のようなフィルタリングルールを作成しました。図1と見比べてみてください。
■NATルール
もう1つ、NATルールも作成します。ここのポイントは、eth0に割り当てた仮想IPアドレスと、各サーバの実IPアドレスを結び付けていることです。これによって仮想IPアドレスによるアクセスが各サーバに転送されるようになります。
注: D-Address:Destination IP Address S-Address:Source IP Address |
以上でルールの設計は終わりです。次回は、このルールに従ってiptablesの設定を行います。