Proxyサーバとは、通常のシステムデーモン(telnetd、ftpd、httpdなど) を特別なサーバで置き換えたマシンのことで、これらのサーバは、通常は 中継を行って特定方向への接続だけを許します。
例えば、telnet proxy サーバをファイアウォールホストで走らせ ておくと、外部からユーザがファイアウォールホストに対して telnet を 実行すると、proxy telnet サーバが応答して、何らかの認証メカニズム を実行します。
Proxyサーバは、通常、普通のサーバより堅固に構築されており、 しばしば「使い捨て」パスワードシステムなどを含む、多種多様な認証メ カニズムを持っています。
Proxyサーバは、アクセス制限の方法をいくつも持っていて、特定 のホストだけが Proxyサーバへのアクセス権を得ることができるようにな っています。また、目的のマシンと通信できるユーザを制限するように設定 することもできます。
Proxyサーバの大きな機能の1つに、Webキャッシュというものがあ ります。これは、クライアントから要求のあったオブフェクト(Webページ) をサーバのメモリやディスクに保存しながらクライアントに送るものです。 そして再び同じオブジェクトに対するリクエストを受けると、オブジェク ト実体へのアクセスを行わずに先程のデータを取り出して、要求のあった クライアントにデータを送ります。このような機能を持っているため、ク ライアントからの2回目以降の要求は、極めて高速に処理することができ、 ネットワークへの負荷を軽減することが可能となります。
Proxyサーバには利点ばかりではなく、問題点もいくつかあります。
サーチエンジンの検索結果、アクセスする度に内容が変化するア クセスカウンタなど、動的なオブジェクトは再利用できません。
Webキャッシュで、オブジェクトが一度キャッシュに蓄えられた後、 情報発信元のオブジェクトが更新された場合、2回目以降はオブジェクト の実体にアクセスしないのでオブジェクトが更新されず、何回リクエスト しても新しい情報が入手できない場合があります。
キャッシュサーバにもメモリやディスクの量に制限があるため、有効と 思われるオブジェクトでも状況によっては捨てなければなりません。このため、 どのオブジェクトから捨てるのかを判断するためのアルゴリズムが重要と なります。
WWWサーバのアクセス制限をしている場合に、Proxyサーバを経由する ことにより、制限から外れ、アクセス可能になる場合があります。
Proxyサーバを実現するにはいろいろな方法があります。1つは、WWWサー バに付属している Proxyサーバを用いるもので、これには Cern httpd や Apache httpd があります。だが、これらはキャッシング機能が弱いため、 サーバダウンのトラブルに見舞われやすいようです。そこでここでは、 もう1つのWWWのキャッシング専用プロトコルを装備した、プロキシを専用 に請け負うソフトウェアを使用します。これには、Cached と Squid があ りますが、ここでは Cached を改良したものである Squid を使用します。Cachedの特徴
Proxyサーバ専用に開発されたため、高速なアクセスとキャッシン グ機能を持っています。
FTPは外部プログラムによって実行されます。
ネットワークに分散配置されたキャッシュサーバを、キャッシュ アクセス専用のプロトコルで接続し、一つのキャッシュシステムに見 せることができます。
DNSデータのキャッシングが可能です。
キャッシュ用ディスクを複数のパーティションに分割できます。
Squidのインストール
今回、squid は FreeBSD-2.2.8Release にインストールしました。 Squid は以下の URL から入手できます。今回は、squid-2.2.STABLE4-src.tar.gz を入手しました。
- http://www.nlanr.net/Squid/
- ftp://ftp.lab.kdd.co.jp/infosystems/squid/
- ftp://ftp.dti.ad.jp/pub/unix/net/proxy/squid/
- ftp://ftp.TokyoNet.AD.JP/pub/network/WWW/squid/
- ftp://ftp.win.or.jp/pub/network/www/squid/
ソースファイルを入手したら、適当なディレクトリで展開し、 サーバの環境を調査するため、configure スクリプトを実行します。 すると、諸設定及び Makefile が自動的に作成されます。 その後は、make all 、make install で OK です。 デフォルトのインストールディレクトリは、/usr/local/squid になります。 この手順を具体的に以下に示します。% tar xvfz squid-2.2.STABLE4-src.tar.gz % cd squid-2.2.STABLE4 % ./configure % make all % su Password: # make installSquidの設定
Squid の設定は、/usr/local/squid/etc/squid.conf によって行 ないます。以下に主な変更点を示します。また、変更前のデフォルトの squid.conf をここに、 変更後の squid.conf をここに置いておきます。
http_port
SquidがHTTPクライアントからリクエストを受けるTCPポート番号を指定します。 デフォルトは3128番ですが、ここでは8080番に変更しました。icp_port
隣接CachedからのICPを受け付けるUDPポート番号です。デフォルトは3130 番です。ここではコメントアウトのままです。mcast_groups 239.128.16.128
マルチキャストを用いる場合に設定します。通常は設定の必要は無いため、 ここではコメントアウトのままです。tcp_incoming_address
以下の4つはキャッシュサーバが複数のネットワークインターフェースを持っている 場合に設定します。クライアントや他のキャッシュサーバからHTTP接続を受け付ける アドレスを記述します。ここではコメントアウトのままです。tcp_outgoing_address
接続できるサーバや他のキャッシュサーバのアドレスを記述します。ここではコメ ントアウトのままです。udp_incoming_address
他のキャッシュサーバからICPを受け付けるアドレスを記述します。ここ ではコメントアウトのままです。udp_outgoing_address
他のキャッシュサーバにICPを送信できるアドレスを記述します。ここで はコメントアウトのままです。cache_peer hostname type proxy_port icp_port options
他のキャッシュサーバに接続する場合は、そのキャッシュサーバを階層的に指定 します。hostname キャッシュホスト名 type キャッシュのタイプ(parent , sibling , multicast) proxy_port Proxy用のHTTPポート番号 icp_port キャッシュオプジェクトについて問い合わせを行うICPポート番号。 options 'proxy-only'はこのホストがローカルにキャッシュを保持していないことを意味します。 'weight=n'はneighborに対する重み付けを行います。デフォルトはn=1です。cache_peer_domain
ある接続キャッシュにおいて、オブジェクトのドメインを限定したい場合に設定 します。ここではコメントアウトのままです。neighbor_type_domain
ある接続キャッシュにおいて、オブジェクトのドメインによって、親・隣接続を 切り換えたい場合に設定します。ここではコメントアウトのままです。hierarchy_stoplist cgi-bin ?
キャッシュの接続によらず、常に直接取得するオブジェクトを定義します。 CGIなどのキャッシュしても無意味なオブジェクトのURLの一部を設定します。inside_firewall
ファイアウォール内のドメインリストを設定します。 この指定にマッチするドメインへのリクエストに対しては、直接オブジェクトを 取得し、それ以外のオブジェクトに関しては、親、もしくは隣キャッシュサーバ に送られます。また、'none'と指定した場合は全てのリクエストが送られます。 ここではコメントアウトのままです。local_domain
サイトのドメイン名を指定します。ここで指定されたドメインの中にある WWWサーバにはキャッシュを参照せずに直接アクセスします。ここでは eg.t.kanazawa-u.ac.jpとしました。local_ip
local_domainと同様ですが、IPアドレスで指定します。ただし、 local_domainはlocal_ipに優先します。ここでは研究室のマシンのIPアド レスを列挙しました。firewall_ip
inside_firewallと同様ですが、IPアドレスで指定します。ただし、 firewall_ipを使用した場合、local_ipは無視されます。ここではコメン トアウトのままです。cache_mem
キャッシュに用いるメモリ量を指定します。単位はMBです。この値は Proxyサーバにするマシンのメモリ量によって慎重に決める必要があります。 ただし、対象はのサイズの最大値であり、Squidのオブジェクトが管理用に使用するメモリなどは 含まれていません。設定値の目安としては、単位時間あたりのオブジェクト要求 バイト数ですが、これはキャッシュサーバが日々、どれだけ活躍しているかに よります。デフォルトは8MBですが、これは Squid が動作するための必要最小限の 値です。ここではデフォルトの 8MB のままで変更はしていません。
- 現在、送受信しているオブジェクト
- スワップに保存しないオブジェクト
- ホットなオブジェクト
cache_swap
キャッシュに用いるディスク容量を指定します。単位はMBです。この値は Proxyサーバを利用するユーザ数、一定期間のキャッシュの量、オブジェクト の最長保存期間により設定する必要があります。cache_dir で指定するキャッシュ ディレクトリが複数に分かれている場合は、その和を計算した総容量を指定します。 ここではデフォルトの100MBのままで変更はしていません。- cache_swap_low
- cache_swap_high
キャッシュに用いるディスクの使用量(%)を指定します。ここではデフォル ト(cache_swap_low=90%、cache_swap_high=95%)のままで変更はしていません。- cache_mem_low
- cache_mem_high
キャッシュに用いるメモリの使用量(%)を指定します。ここではデフォル ト(cache_mem_low=75%、cache_mem_high=90%)のままで変更はしていません。maximum_object_size
キャッシュするオブジェクトの最大の大きさを指定します。単位はKBで す。この値より大きいデータはディスクに保存されません。ここではデフォ ルトの4096KBのままで変更はしていません。cache_dir
キャッシュデータを置くディレクトリを指定します。必要であれば複数の ディレクトリが指定できます。指定したディレクトリは Squid の起動時に作成 しておき、UID,GID を cache_effective_user の設定に合わせておきます。 ここではデフォルトの /usr/local/squid/cacheのままで変更はしていません。cache_access_log
HTTPとICP要求を記録するファイルを指定します。オブジェクトのアクセス時に 1行の情報が出力されるため、かなりサイズが大きくなります。ここではデフォルトの /usr/local/squid/logs/access.log のままで変更はしていません。cache_log
キャッシュ状況を記録するファイルを指定します。レベルは 'debug_options'で設定します。ここではデフォルトの /usr/local/squid/logs/cache.log のままで変更はしていません。cache_store_log
キャッシュ管理の動作状況を記録するファイルを指定します。記録を取ら ない場合、'none'と指定します。ここではデフォルトの /usr/local/squid/logs/store.log のままで変更はしていません。pid_filename
Squid のプロセスIDを記録するファイルを指定します。記録しない場合は 'none'と指定します。ここではデフォルトの /usr/local/squid/logs/squid.pid のままで変更はしていません。debug_options
ロギングのレベルを指定します。通常はデフォルトの' ALL,1'と 指定しておきます。log_fqdn
ログをドメイン名称で取る場合には'on'、IPアドレスで取る場合には'off' にします。ここではデフォルトの'off'のままに設定しています。ftp_user
anonymous FTP サーバに対する anonymous ログインパスワードを指定し ます。ここではホームページ管理者のメールアドレスである www@oak.eg.t.kanazawa-u.ac.jp と指定しました。cache_dns_program /usr/local/squid/bin/dnsserver
dns_children
DNSを正引き(サーバ名→IPアドレス)するために利用する外部プログラムを指定します。 dns_children で DNS の名前引きをサービスするプロセス数を設定します。 デフォルトは 5、上限は 32 です。ユーザ数が多い場合にはこの数を大きくします。 少なすぎると、DNSの名前引きによる遅れが生じますが、多すぎるとメモリの無駄に なります。ここではデフォルトの 5 としました。reference_age
最後にアクセスしたキャッシュデータをどれだけの期間、保存するか (最長保存期間)を指定します。単位としては year(s)、month(s)、week(s)、 day(s)、hour(s)があります。この値は、キャッシュディスクの容量や取 得したオブジェクトの有用性、新たなオブジェクトの取得状況によって 決定する必要があります。デフォルトは 1 year ですが、ここでは 10 days と設定しました。- acl aclname acltype string1 ...
- acl aclname acltype "file" ...
- http_access allow|deny aclname
アクセス制限の設定をします。acl でアクセスリストの設定をし、実際の アクセス制限は http_access で行います。また、アクセスリストは常に 先頭から参照されます。詳細は squid.conf のコメント部を参照してください。 アクセス制限としては、アドレスによるアクセス制限の他、時間帯による アクセス制限も可能です。デフォルトの設定は以下のようになっており、 アクセス制限をしない設定になっています。acl manager proto cache_object acl localhost src 127.0.0.1/255.255.255.255 acl all src 0.0.0.0/0.0.0.0 acl SSL_ports port 443 563 acl Dangerous_ports port 7 9 19 acl CONNECT method CONNECT # http_access deny manager !localhost http_access deny CONNECT !SSL_ports http_access deny Dangerous_ports # http_access allow all # icp_access allow allここでは、研究室内のマシンのみにアクセスを許す制限にするため、
acl funa src 研究室内のマシンのIPアドレスを列挙
を加え、
http_access allow funa
icp_access allow funa
のように変更します。cache_mgr
Proxyサーバの管理者のメールアドレスを指定します。何らかのトラブル によりサーバが稼働停止した場合、ブラウザにこのメールアドレスが表示 されるので、メールを送ることによりサーバの復旧を促すことができます。 ここではホームページの管理者のメールアドレスである www@oak.eg.t.kanazawa-u.ac.jpとしました。cache_effective_user
Squid Version1.1.6以降では root ユーザで実行できません。root ユーザ で実行する場合にはこの cache_effective_user を指定して、実行するユーザ とグループを指定します。ここではユーザを nobody、グループを nogroup としました。visible_hostname
キャッシュサーバ名を指定します。Squid が独自に作成するエラーメッセージ等に 記録されるサーバ名を指定します。
Squidの起動
今回はキャッシュディレクトリを /usr/local/squid/cache に、ログディ レクトリを /usr/local/squid/logs に設定したため、これらのディレク トリを作成します。% cd /usr/local/squid % su Password: # mkdir cache logs次に各ディレクトリに書き込み権限があるのを確認しておきます。そして、 /usr/local/squid/ 以下の所有者を nobody、グループを nogroup に 変更します。# chown -R nobody.nogroup /usr/local/squid/*次にキャッシュ用のディレクトリを構築します。実行は以下のように -z オプションを付けて実行します。# /usr/local/squid/bin/squid -zキャッシュディレクトリの構築が終了したら、以下のようにして squid を起動します。&を付けるのを忘れないでください。# /usr/local/squid/bin/squid -f /usr/local/squid/etc/squid.conf &squidを起動すると、squid、dnsserver、ftpget デーモンが起動します。 マシンの再起動時に squid が自動的に起動するようにするために、 /etc/rc.local に以下を追加します。# # Starting Proxy Server # if [ -x /usr/local/squid/bin/RunCache -a -f /usr/local/squid/etc/squid.conf ]; then echo -n 'Starting Proxy Server:' (cd /tmp; /usr/local/squid/bin/squid -f /usr/local/squid/etc/squid.conf > /dev/null 2>&1 &) echo ' Squid.' fiSquidの停止
Squid を停止するには、以下のようにします。# kill -TERM `cat /usr/local/squid/logs/squid.pid`また、Squid を再起動させるには以下のようにします。# kill -HUP `cat /usr/local/squid/logs/squid.pid`その他
Squid のログファイルをローテートするには、# /usr/local/squid/bin/squid -k rotateと実行するか、# /bin/kill -USR1 `cat /usr/local/squid/logs/squid.pid`として、Squid を完全再起動します。cron で実行させるようにするため、 /etc/crontab に0 3 * * 7 nobody /bin/kill -USR1 `cat /usr/local/squid/logs/squid.pid`と書くと、毎週日曜日午前3時に実行されます。Squid のログファイルは、アイコンなど の転送も記録するので、かなり巨大になります。ディスクの容量が十分でない場合、 ローテートの間隔を狭めたり、古いログファイルを早めに消去するよう設定したりします。