JF-INDEX (document list of JF Project)

squid による透過型プロキシ

Daniel Kiracofe

v1.3, January 2001

早川 仁(cz8cb01@linux.or.jp)

V1.3j, 2001年02月17日


このドキュメントは Linux と squid だけで透過型の HTTP キャッシングプロキシサーバーを構築する方法について説明します。

1. イントロダクション

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:

以下の条件を満たせば、この文書の全体または一部分を無償で配布できます。

  • The copyright notice above and this permission notice must be preserved complete on all complete or partial copies
  • Translation to another language is permitted, provided that the author is notified prior to the translation.
  • Any derived work must be approved by the author in writing before distribution.
  • 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.
  • Small portions may be reproduced as illustrations for reviews or quotes in other works without this permission notice if proper citation is given.
  • すべての完全な、もしくは部分的なコピーに 上記の著作権表示とこの許可告知が完全に保存されていなければならない。
  • 他の言語に翻訳する際は事前に著者に通知すること。
  • このドキュメントの派生物を作る場合、配布の前に著者に承認を得ること。
  • このドキュメントの一部分を配布する場合は、 完全な版を入手する方法およびそのための手順を提供しなければならない。
  • もし適切な引用元が表示されているならば、この許可告知なしで ドキュメントの短かい部分を他の文書中の論評や引用で例として複製しても良い。

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 <disclaimer.h>

明示的、暗黙的に関わらず、無保証です。

1.4 翻訳者謝辞

翻訳の際には以下の方々に多数の有益なコメント、校正をしていただきました。 ありがとうございました。

  • 加茂智之さん
  • 佐野武俊さん
  • 山下義之さん
  • 武井伸光さん
  • 中野武雄さん

2. 透過型プロキシの概要

2.1 使う理由

``通常'' プロキシを利用するには、利用者が web ブラウザでプロキシのホスト名と ポート番号を指定します。ブラウザはプロキシにリクエストを行ない、次にプロキシはその リクエストをアクセスされたサーバーへ転送します。 通常はこれで問題なく動きますが、時には以下のような場面に出くわすこともあります。

  • 有無を言わさず、ネットワークの利用者にプロキシを使わせるようにしたい。
  • 利用者にプロキシを使わせたいが、プロキシを利用しているということを 知らせたくない。
  • 利用者にプロキシを使わせたいが、何百、何千台という web ブラウザの設定を変更す る手間をかけたくない。

こういった場合に透過型プロキシが役立ちます。これを使うと web へのリクエ ストをプロキシで透過的に扱うことができます。つまり利用者のソフトウェア からは相手先のサーバーへ直接接続しているように見えますが、実際にはプロキ シサーバーへと接続されています。

Cisco のルーターは多くのスイッチと同様に透過型のプロキシをサポートしていますが、Linux もルーター として利用できる上に TCP のコネクションをローカルポートへリダイレクトすれ ば透過型プロキシとして動作します。ですが web プロキシが適切な相手先のサー バーに接続できるようにするためには、リダイレクトされていることを web プロ キシに認識させる作業も必要となります。これには一般に以下の2 つの方法が用い られます。

ご利用の web プロキシが透過型プロキシとして利用できない時は、web プロキ シの前に全てのややこしい作業を代わりにやってくれる、transproxy という名 前のデーモンを利用できます。transproxy は John Saunders によって書かれま した。これは ftp://ftp.nlc.net.au/pub/unix/transproxy/ や metalab のミラーから入手できます。transproxy についてはこのドキュメントで は述べません。

(訳注:transproxy の web サイトは http://www.transproxy.nlc.net.au/ にあります)

より良い解決方法は、透過型プロキシとして利用できる web プロキシを入手す ることです。ここで説明するのは squid です。squid はオープンソース の Unix 用キャッシングプロキシサーバーで、 http://www.squid-cache.org から入手できます。

2.2 このドキュメントで取り扱う範囲

このドキュメントでは執筆時点(2001年01月)で最新の安定版である squid バー ジョン 2.3 および Linux カーネルバージョン 2.4 について述べていきますが、 squid 2.0 や Linux カーネル 2.3 でもこのドキュメントの内容が通用するはず です。それ以前のリリース版での情報が必要であれば http://www.unxsoft.com からドキュメントを入手できます。

(訳注:翻訳時点(2001年02月)での安定版は squid 2.3 と カーネル 2.2.18/2.4.1 です)

開発版のカーネルや squid を使う場合、自身の責任で使うようにしてください。 このドキュメントが助けになるかもしれませんが、保証はできません。

このドキュメントでは HTTP のプロキシだけを扱います。透過型 FTP プロキシに 関する質問の email をたくさんもらいました。理論的には透過型 FTP プロキシは 不可能ではありませんが HTTP より*かなり*難しいですし、そのためにいま利用で きるツールについて知りません。もし方法がわかった場合は、あなた自身で HOWTO 文書を執筆することをお勧めします。


3. カーネルの設定

まず、カーネルに適切なオプションが指定されていることを確認する必要があり ます。ディストリビューションに同梱されているカーネルを使っている場合には、 透過型プロキシが無効になっているかもしれません。よく分からない時にはこの セクションは読み飛ばしてしまうのが良いでしょう。次のセクションで実行する コマンドが妙なエラーを出力した場合、おそらくカーネルが正しく設定されてい ません。

(訳注: Debian (potato) のカーネルでも、無効になっているそうです)

透過型プロキシを使えるようにカーネルが設定されていない時には再コンパイルす る必要があります。カーネルの再コンパイルの手続きはややこしく(少なくとも、 初めての人には)、またこのドキュメントの範疇ではありません。カーネルコンパ イルに関する情報が必要でしたら http://metalab.unc.edu/pub/Linux/docs/HOWTO/Kernel-HOWTO を参照して ください。

(訳注: 日本語訳は http://www.linux.or.jp/JF/JFdocs/Kernel-HOWTO.html にあります)

設定する必要のある項目は次の通りです(どれもモジュールにすることはできません)。

  • Networking support(カーネル2.4のみ)
  • Sysctl support
  • Network packet filtering(カーネル2.4のみ)
  • TCP/IP networking
  • Connection tracking (menuconfig の``IP: Netfilter Configuration''の下で す)(カーネル2.4のみ)
  • IP: firewalling(カーネル2.2のみ)
  • IP tables support(カーネル2.4のみ)
  • IP: always defragment(カーネル2.2のみ)
  • Full NAT(カーネル2.4のみ)
  • IP: transparent proxy support(カーネル2.2のみ)
  • REDIRECT target support(カーネル2.4のみ)
  • /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 を http://www.squid-cache.org からダウンロードします。開発版である 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 です。全ての設定が終わり起動した後に、もう一度全体を読みなおし た方が良いですが、今の所は最小限の設定だけを行ないましょう。次のようなディ レクティブを探してコメント(行頭の #)を外し、適切な値に変更します。

  • httpd_accel_host virtual
  • httpd_accel_port 80
  • 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 を普通のプロキシとして使用できるはずです。

設定に関するより詳細な情報は http://www.squid-cache.org の 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 ベースの、ほぼ全てのディストリビューションでインス トール済みです。もしインストールされていない時には ftp://ftp.rustcorp.com/ipchains/ から入手できます。ipchains は非常 にパワフルなツールですから、ここでは上っ面しか取り上げません。詳細に関して は ipchains HOWTO を参照してください。

(訳注: http://www.linux.or.jp/JF/JFdocs/ipchains-mini-HOWTO.html というもの もあります。これは翻訳版ではなく、おおつかまさひとさんのオリジナルです)

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 サーバーが動作し ていなくても、ここでの作業は飛ばすべきではありません。 ここでのルールが設定されていないと、プロキシが自身へ接続しようとした場合 に無限ループになってしまいますから。次のコマンドを実行しましょう。

  • ipchains -A input -p TCP -d 127.0.0.1/32 www -j ACCEPT
  • ipchains -A input -p TCP -d 192.168.1.1/32 www -j ACCEPT

透過型プロキシのための魔法の呪文はこれです。

  • ipchains -A input -p TCP -d any/0 www -j REDIRECT 3128

なお iptables を使う場合は下記のコマンドだけで構いません。

  • 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. さらに知るには

さらなる助けが必要な時には http://www.squid-cache.org で squid FAQ や squid メーリングリストを参照してください。また、私(drk@unxsoft.com) にメー ルしても構いません。時間が許せば(許さない時もあります)、質問に答えようと思 います。その場合は、``ipchains -L''あるいは``iptables -t nat -L''の出力および設定 ファイルの関係する部分を email に記述するようにしてください。それが無いと、 おそらくあまり多くのことはわからないでしょうから。


sgml21html conversion date: Sat Mar 31 17:59:24 JST 2001

[