squid による透過型プロキシ Daniel Kiracofe v1.2, 10 October 2000 早川 仁(cz8cb01@linux.or.jp) V1.2j, 2000年10月11日 このドキュメントは Linux と squid だけで透過型の HTTP キャッシングプロ キシサーバーを構築する方法について説明します。 ______________________________________________________________________ 目次 1. イントロダクション 1.1 ご意見 1.2 Copyrights and Trademarks 1.3 #include 1.4 翻訳者謝辞 2. 透過型プロキシの概要 2.1 使う理由 2.2 このドキュメントで取り扱う範囲 3. カーネルの設定 4. squid の設定 5. ipchains の設定 6. まとめ 7. さらに知るには ______________________________________________________________________ 1. イントロダクション 1.1. ご意見 この mini HOWTO に関するご意見やフィードバックを歓迎します。著者である Daniel Kiracofe(drk@unxsoft.com) に直接送ってもらって構いません。 1.2. Copyrights and Trademarks Copyright 2000 by UnxSoft Ltd (www.unxsoft.com) (訳注:読者の利便を考え日本語訳を併記しますが、原文の Copyright が優 先します) This manual may be reproduced in whole or in part, without fee, subject to the following restrictions: 以下の条件を満たせば、この文書の全体または一部分を無償で配布できます。 o The copyright notice above and this permission notice must be preserved complete on all complete or partial copies o Any translation or derived work must be approved by the author in writing before distribution. o If you distribute this work in part, instructions for obtaining the complete version of this manual must be included, and a means for obtaining a complete version provided. o Small portions may be reproduced as illustrations for reviews or quotes in other works without this permission notice if proper citation is given. o すべての完全な、もしくは部分的なコピーに上記の著作権表示とこの許可 告知が完全に保存されていなければならない。 o このドキュメントの翻訳および派生物を作る場合は、配布する前に著者に 文書で承認を得なければならない。 o このドキュメントの一部分を配布する場合は、完全な版を入手する方法お よびそのための手順を提供しなければならない。 o もし適切な引用元が表示されているならば、この許可告知なしでドキュメ ントの短かい部分を他の文書中の論評や引用で例として複製しても良い。 Exceptions to these rules may be granted for academic purposes: Write to the author and ask. These restrictions are here to protect us as authors, not to restrict you as learners and educators. Any source code (aside from the SGML this document was written in) in this document is placed under the GNU General Public License, available via anonymous FTP from the GNU archive. 教育目的の場合はこれらのルールに例外が認められることがありますから、著 者に連絡して尋ねてください。これらの制限は著者である我々を守るための物 で、学習者および教育者のみなさんを制限するための物ではありません。この ドキュメントのすべてのソースコード (このドキュメントが書かれている SGML は除く) は GNU General Public License の下にあります。GPL は GNU アーカイブから anonymous FTP で入手できます。 1.3. #include 明示的、暗黙的に関わらず、無保証です。 1.4. 翻訳者謝辞 翻訳の際には以下の方々に多数の有益なコメント、校正をしていただきまし た。ありがとうございました。 o 加茂智之さん o 佐野武俊さん o 山下義之さん o 武井伸光さん o 中野武雄さん 2. 透過型プロキシの概要 2.1. 使う理由 ``通常'' プロキシを利用するには、利用者が web ブラウザでプロキシのホス ト名とポート番号を指定します。ブラウザはプロキシにリクエストを行ない、 次にプロキシはそのリクエストをアクセスされたサーバーへ転送します。通常 はこれで問題なく動きますが、時には以下のような場面に出くわすこともあり ます。 o 有無を言わさず、ネットワークの利用者にプロキシを使わせるようにした い。 o 利用者にプロキシを使わせたいが、プロキシを利用しているということを 知らせたくない。 o 利用者にプロキシを使わせたいが、何百、何千台という web ブラウザの設 定を変更する手間をかけたくない。 こういった場合に透過型プロキシが役立ちます。これを使うと web へのリク エストをプロキシで透過的に扱うことができます。つまり利用者のソフトウェ アからは相手先のサーバーへ直接接続しているように見えますが、実際にはプ ロキシサーバーへと接続されています。 Cisco のルーターは透過型のプロキシをサポートしていますが、Linux もルー ターとして利用できる上に TCP のコネクションをローカルポートへリダイレ クトすれば透過型プロキシとして動作します。ですが web プロキシが適切な 相手先のサーバーに接続できるようにするためには、リダイレクトされている ことを web プロキシに認識させる作業も必要となります。これには一般に以 下の2 つの方法が用いられます。 ご利用の web プロキシが透過型プロキシとして利用できない時は、web プロ キシの前に全てのややこしい作業を代わりにやってくれる、transproxy とい う名前のデーモンを利用できます。transproxy は John Saunders によって書 かれました。これは や metalab のミラーから入手できます。transproxy についてはこのドキュメン トでは述べません。 (訳注:transproxy の web サイトは にあります) より良い解決方法は、透過型プロキシとして利用できる web プロキシを入手 することです。ここで説明するのは squid です。squid はオープンソースの Unix 用キャッシングプロキシサーバーで、 から入手 できます。 2.2. このドキュメントで取り扱う範囲 このドキュメントでは執筆時点(2000年3月)で最新の安定版である squid バー ジョン 2.3 および Linux カーネルバージョン 2.2 について述べていきます が、 squid 2.0 や Linux カーネル 2.1 でもこのドキュメントの内容が通用 するはずです。それ以前のリリース版での情報が必要であれば からドキュメントを入手できます。 (訳注:翻訳時点(2000年10月)での安定版は squid 2.3 と カーネル 2.2.17 です) Linux 2.3 を使う時には、ipchains の代わりに netfilter という物を使う必 要があります。ですが開発版のカーネルを使っているような方な ら、netfilter に関しては付属のドキュメントを読んで自力で理解できるで しょう。理解できないのであれば開発版カーネルは使うべきではありませ ん(本当ですよ。信じてください)。Linux 2.4 がリリースされたら netfilter についての記述をこのドキュメントにも加えます。 このドキュメントでは HTTP のプロキシだけを扱います。透過型 FTP プロキ シに関する質問の email をたくさんもらいました。理論的には透過型 FTP プ ロキシは不可能ではありませんが HTTP より*かなり*難しいですし、そのため にいま利用できるツールについて知りません。もし方法がわかった場合は、あ なた自身で HOWTO 文書を執筆することをお勧めします。 3. カーネルの設定 まず、カーネルに適切なオプションが指定されていることを確認する必要があ ります。ディストリビューションに同梱されているカーネルを使っている場合 には、透過型プロキシが無効になっているかもしれません(私の記憶が正しけ れば、 Redhat6.1 では有効になっていたと思いますが、保証はできません)。 よく分からない時にはこのセクションは読み飛ばしてしまうのが良いでしょ う。次のセクションで実行するコマンドが妙なエラーを出力した場合、おそら くカーネルが正しく設定されていません。 (訳注: Debian (potato) のカーネル 2.2.13 でも、無効になっているそうで す) 透過型プロキシを使えるようにカーネルが設定されていない時には再コンパイ ルする必要があります。カーネルの再コンパイルの手続きはややこしく(少な くとも、初めての人には)、またこのドキュメントの範疇ではありません。カ ーネルコンパイルに関する情報が必要でしたら を参照して ください。 (訳注: 日本語訳は にあります) 設定する必要のある項目は次の通りです(どれもモジュールにすることはでき ません)。 o Sysctl support o TCP/IP networking o IP: firewalling o IP: always defragment o IP: transparent proxy support o /proc filesystem support 作成したカーネルから起動したら IP フォワーディングを有効にする必要があ るでしょう。IP フォワーディングするとマシンをルーターとして動作しま す。普通のユーザーはこの機能が必要ないため、デフォルトではこの機能は無 効になっていますから、実行時に明示的に有効にする必要があります。ただし ディストリビューションによっては既に有効になっているかもしれません。確 認するには ``cat /proc/sys/net/ipv4/ip_forward'' を実行します。``1'' が表示されれば有効になっています。そうでなかったなら ``echo '1' > /proc/sys/net/ipv4/ip_forward'' を実行します。そして /etc/rc.d/ にある 起動時に実行されるスクリプトにこのコマンドを追加すると良いでしょう。 (訳注:Redhat 系であれば /etc/rc.d/rc.local に記述するか、あるいは /etc/sysconfig/network で FORWARD_IPV4=true を記述しておけば良いでしょ う。 Debian の場合、potato 以前の場合は上記と同様に ``echo '1' > /proc/sys/net/ipv4/ip_forward'' を実行します。potato 以降では /etc/network/options に ip_forward=no というのがあるので、ここを ip_forward=yes に変更すれば /etc/init.d/networking というスクリプトが ``echo '1' > /proc/sys/net/ipv4/ip_forward'' をやってくれます) 4. squid の設定 squid を設定し、実行しましょう。最新の tarball を からダウンロードします。開発版である DEVEL バージョンではな く、安定版である STABLE バージョンであることを確認してください。執筆時 点(2000年10月)の最新版は squid-2.3.STABLE4.tar.gz です。 さて、ダウンロードしたファイルを(``tar -xzf <ファイル名>'' を使用し て)展開して autoconf スクリプト(``./configure'') を実行し、コンパイル (``make'')してインストール(``make install'')しましょう。 次にデフォルトの squid.conf ファイル(変更しない限りインストール先は /usr/local/squid/etc/squid.conf です)を編集します。squid.conf には非常 に多くのコメントが含まれています。実際、squid に関する最も良いドキュメ ントは squid.conf です。全ての設定が終わり起動した後に、もう一度全体を 読みなおした方が良いですが、今の所は最小限の設定だけを行ないましょう。 次のようなディレクティブを探してコメント(行頭の #)を外し、適切な値に変 更します。 o httpd_accel_host virtual o httpd_accel_port 80 o httpd_accel_with_proxy on httpd_accel_uses_host_header on 最後に http_access ディレクティブを見てみましょう。デフォルトでは通常 ``http_access deny all'' になっているため squid へのアクセスは誰もでき ない状態となっています。今の所はこれを ``http_access allow all'' に変 更しても構いませんが、実際に運用する際には ACL(Access Control List) に ついてドキュメントを読み、ローカルのネットワーク(などの限定された範 囲)のユーザーだけが利用できるキャッシュを設定したほうが良いでしょう。 どうでもいいことと思われるかも知れませんが、キャッシュへのアクセスには 何らかの制限をかけた方が良いです。フィルタリングを行なっているファイア ウォール(ポルノのフィルターや言論がそれほど自由でない国のフィルターな ど)の中にいる人は、度々アクセス制限のないプロキシを ``乗っとって'' バ ンド幅を食いつぶしてしまいます。 キャッシュディレクトリを ``squid -z'' で初期化します(squid のバージョ ンが 1.1.16 以降の時だけです。それよりも前の版の時は、飛ばして次を行 なってください)。 /usr/local/squid/bin/ ディレクトリの RunCache スクリプトで squid を起 動しましょう。web ブラウザのプロキシ設定を squid の動作しているマシン のIP アドレスおよびポート 3128(ポート番号をデフォルトから変更していな い場合)に設定すれば、squid を普通のプロキシとして使用できるはずです。 設定に関するより詳細な情報は の squid FAQ を参 照してください。 (訳注: squid Internet Object Cache 関連のペ−ジ やsquid FAQ 日本語版 も 参考になるでしょう) 5. ipchains の設定 ipchains は(カーネル 2.2 ベースの)ほぼ全てのディストリビューションでイ ンストール済みですが、もし無い時には から入手できます。ipchains は非常に パワフルなツールですから、ここでは上っ面しか取り上げません。詳細に関し ては ipchains HOWTO を参照してくださ い。 (訳注: という物もあります。これは翻訳版ではなく、おおつかまさひとさんのオリジ ナルです) ルールを設定するには、プロキシサーバーの IP アドレス(例では192.168.1.1 を使用します)と squid が動作しているポート番号(例ではデフォルトの 3128 です )を知っておく必要があります。 始めに、このサーバー経由で外部の web サーバーへ出ていく全てのパケット を許可します。設定は loopback インターフェースとイーサネットインター フェースの両方で行なった方が良いでしょう。プロキシサーバー上に web サ ーバーが動作していなくても、ここでの作業は飛ばすべきではありません。こ こでのルールが設定されていないと、プロキシが自身へ接続しようとした場合 に無限ループになってしまいますから。次のコマンドを実行しましょう。 o ipchains -A input -p TCP -d 127.0.0.1/32 www -j ACCEPT o ipchains -A input -p TCP -d 192.168.1.1/32 www -j ACCEPT そして透過型プロキシのための魔法の呪文はこれです。 o ipchains -A input -p TCP -d any/0 www -j REDIRECT 3128 上記 3 つのコマンドを /etc/rc.d/ にある適切な起動スクリプトに追加しま しょう。 (訳注: REDIRECT が指定されているとリモートホストへのパケットであって も、ローカルへリダイレクトされます) 6. まとめ 今までの所が全てうまくいったら、他のマシンの設定を行ないましょう。ゲー トウェイを squid の動作しているマシンの IP に変更し、web を回ってみま す。ログファイル /usr/local/squid/logs/access.log を見て、外部へ直接で はなく、本当にプロキシ経由でリクエストがフォワードされているかどうかを 確認しましょう。 (訳注: Debian や Redhat 系の場合 /var/log/squid/access.log です) 7. さらに知るには さらなる助けが必要な時には で squid FAQ や squid メーリングリストを参照してください。また、私(drk@unxsoft.com) に メールしても構いません。時間が許せば(許さない時もあります)、質問に答え ようと思います。その場合は、どうかお願いですから、``ipchains -L'' の出 力および設定ファイルの関係する部分を email に記述するようにしてくださ い。それが無いと、おそらくあまり多くのことはわからないでしょうから。