squid による透過型プロキシ Daniel Kiracofe v1.3, January 2001 早川 仁(cz8cb01@linux.or.jp) V1.3j, 2001年02月17日 このドキュメントは 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. Netfilter(ipchains)の設定 6. まとめ 7. さらに知るには ______________________________________________________________________ 1. イントロダクション 1.1. ご意見 この mini HOWTO に関するご意見やフィードバックを歓迎します。著者である Daniel Kiracofe(drk@unxsoft.com) に直接送ってもらって構いません。 1.2. Copyrights and Trademarks Copyright 2000-2001 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 Translation to another language is permitted, provided that the author is notified prior to the translation. o Any 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 このドキュメントの一部分を配布する場合は、完全な版を入手する方法お よびそのための手順を提供しなければならない。 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. このドキュメントで取り扱う範囲 このドキュメントでは執筆時点(2001年01月)で最新の安定版である squid バ ージョン 2.3 および Linux カーネルバージョン 2.4 について述べていきま すが、 squid 2.0 や Linux カーネル 2.3 でもこのドキュメントの内容が通 用するはずです。それ以前のリリース版での情報が必要であれば からドキュメントを入手できます。 (訳注:翻訳時点(2001年02月)での安定版は squid 2.3 と カーネル 2.2.18/2.4.1 です) 開発版のカーネルや squid を使う場合、自身の責任で使うようにしてくださ い。このドキュメントが助けになるかもしれませんが、保証はできません。 このドキュメントでは HTTP のプロキシだけを扱います。透過型 FTP プロキ シに関する質問の email をたくさんもらいました。理論的には透過型 FTP プ ロキシは不可能ではありませんが HTTP より*かなり*難しいですし、そのため にいま利用できるツールについて知りません。もし方法がわかった場合は、あ なた自身で HOWTO 文書を執筆することをお勧めします。 3. カーネルの設定 まず、カーネルに適切なオプションが指定されていることを確認する必要があ ります。ディストリビューションに同梱されているカーネルを使っている場合 には、透過型プロキシが無効になっているかもしれません。よく分からない時 にはこのセクションは読み飛ばしてしまうのが良いでしょう。次のセクション で実行するコマンドが妙なエラーを出力した場合、おそらくカーネルが正しく 設定されていません。 (訳注: Debian (potato) のカーネルでも、無効になっているそうです) 透過型プロキシを使えるようにカーネルが設定されていない時には再コンパイ ルする必要があります。カーネルの再コンパイルの手続きはややこしく(少な くとも、初めての人には)、またこのドキュメントの範疇ではありません。カ ーネルコンパイルに関する情報が必要でしたら を参照して ください。 (訳注: 日本語訳は にあります) 設定する必要のある項目は次の通りです(どれもモジュールにすることはでき ません)。 o Networking support(カーネル2.4のみ) o Sysctl support o Network packet filtering(カーネル2.4のみ) o TCP/IP networking o Connection tracking (menuconfig の``IP: Netfilter Configuration''の 下です)(カーネル2.4のみ) o IP: firewalling(カーネル2.2のみ) o IP tables support(カーネル2.4のみ) o IP: always defragment(カーネル2.2のみ) o Full NAT(カーネル2.4のみ) o IP: transparent proxy support(カーネル2.2のみ) o REDIRECT target support(カーネル2.4のみ) o /proc filesystem support ``Fast switching''は NO にする必要があります(カーネル2.4のみ) 作成したカーネルから起動したら 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 バージョンであることを確認してください。執筆時 点(2001年02月)の最新版は 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 o 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. Netfilter(ipchains)の設定 (訳注:ipchains に関する説明はカーネル 2.2 系が対象です。カーネル 2.4 系を利用する場合、基本的には netfilter(つまり iptablesコマンド)を使用 してください。もしカーネル 2.4 系でも ipchains を使いたい場 合、modprobe ipchains.o することにより ipchains を利用できます。その場 合はカーネル 2.4 系に於いても ipchains に関する説明を参照してください) ipchains はカーネル 2.2 ベースの、ほぼ全てのディストリビューションでイ ンストール済みです。もしインストールされていない時には から入手できます。ipchains は非常に パワフルなツールですから、ここでは上っ面しか取り上げません。詳細に関し ては ipchains HOWTO を参照してくださ い。 (訳注: というものもあります。これは翻訳版ではなく、おおつかまさひとさんのオリ ジナルです) iptables は ipchains を置き換えるもので、Linux kernel 2.4 より導入され ました。ご利用のディストリビューションのカーネルが 2.4 の場合、既に iptables はインストールされているはずです(訳注:2001年02月現在では訳者 が知る限り、SuSE 7.1 と RedHat 7.0.x だけです)。インストールされていな い時には netfilter.kernelnotes.org から入手してください。筆者は知りませんが、バイナリの RPM もどこかにあ るはずです。netfilter のサイトには詳細なドキュメントもあります。 ルールを設定するには squid が動作しているポート番号(デフォルトの 3128 とします)を知っておく必要があります。 また ipchains の場合は LAN 側の IP アドレス(192.168.1.1 とします)が、 iptables の場合にはプロキシを行うパケットが送られてくるインターフェー ス (ここでは eth0 とします)が必要となります。 ipchains を使う場合(訳注:つまりカーネル 2.2 あるいはカーネル 2.4 系で ipchains.o を使う場合)には始めに、このサーバー経由で外部の 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 なお iptables を使う場合は下記のコマンドだけで構いません。 o iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128 上記のコマンドを /etc/rc.d/ にある適切な起動スクリプトに追加しましょ う。カーネル2.2ではフォワードのループを防ぐためのコマンドが必要でした が、カーネル2.4の場合は特に何もしなくても著者の環境ではループは発生し ませんでした。もし発生した場合には drk@unxsoft.com までメールでお知ら せください。 (訳注: ipchains の時にループが発生するのは、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''あるいは``iptables -t nat -L''の出力および設定ファイルの関係する部分を email に記述するようにし てください。それが無いと、おそらくあまり多くのことはわからないでしょう から。