ここでは、プロキシサーバーであるSquid
について解説していきます。プロキシサーバーには、いくつか役割があり、ひとつはキャッシュサーバーとしての働きがあります。LAN内のクライアントがプロキシサーバーを中継点としてインターネットにアクセスすれば、次回、同じサイトにアクセスする際にはキャッシュとしてプロキシサーバーに情報が蓄積されていくために、一度目よりも2度目の方が高速にアクセスすることができます。キャッシュとしての機能は、ブラウザにも標準で付属しているものですが、これはあくまでも自分のマシンのみ。他のマシンでアクセスする場合には、当然、キャッシュがあるはずがありません。そこで、これらのキャッシュをプロキシサーバーに集積させ、複数の人数、複数のマシンで有効に活用しよう、というのがプロキシサーバーの利点です。
その他、有害な情報を表示しないようアクセス規制をかけたり、ウィルスの侵入をブロックしたりすることができます。また、匿名性を高める効果もあり、LAN内のマシンをプロキシサーバーを中継させることで送信元IPアドレスを一本化することができるようになり、これによって、セキュリティ強化も図ることができるのです。このように、プロキシサーバーを利用すると一種のファイアーウォールを構築することもできるのです。
|
|
■RPMパッケージからインストール
Squid がインストールされていないことを確認します。
$ rpm -q squid
パッケージ squidはインストールされていません |
|
rootでログインしてから、RPMパッケージをインストールします。
$ su -
Password:
# rpm -ivh squid-2.5.STABLE1-2.i386.rpm |
|
■自動起動の設定
ランレベル3と5でdhcpdが自動起動するように設定します。
# chkconfig --level
35 squid on
# chkconfig --list squid
squid 0:オフ 1:オフ 2:オフ 3:オン 4:オフ 5:オン 6:オフ |
|
■/etc/squid/squid.conf の編集
squid.conf は行数にすると3000行以上もあるので、必要な箇所のみピックアップして解説していきます。行数は長いけれども、設定する箇所自体はそんなに多くはありません。Squid
はデフォルトで3128番ポートを使用します。外部公開プロキシサーバーを構築するのでなければ、セキュリティ対策として、ルータ等で3128番は必ず閉じておくようにしてください。また、プロキシサーバーが使用するポートは通常、8080番や8008番などの数字に8がつく番号を使用するのが慣例となっています。もし、squid
のデフォルトポートを変更したいのであれば「# http_port 3128」の行を以下のように変更してください。
■キャッシュサーバーとして動作させる
Squid を単体で稼動させ、多段プロキシ構成にしていない場合は、「# icp_port 3130」の箇所のコメントを削除し、且つ、ポート番号を"0"とします。icp_port
はキャッシュサーバー同士の問い合わせに使用するポートで、多段構成の場合のみデフォルトで3130番を使用します。
次に、プロキシサーバーへの接続を許可するネットワークの指定を行います。デフォルトでは、Squid がインストールされたマシンのみのアクセスしか許可していないため、クライアントマシンがプロキシサーバーへの中継を許可する定義を作成しなくてはなりません。以下の行を探してアクセスを許可するネットワークを赤字で示したように追記してください。赤字で記した2行はペアの設定になっており、「aclで定義したネットワークは、httpアクセスを許可します」、という意味になります。ここでは、172.16.50.0/27と172.16.51.0/28のネットワークに対してHTTPアクセスを許可する設定を行っています。
#Recommended minimum
configuration:
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl localnet src
172.16.50.0/255.255.255.224 172.16.51.0/255.255.255.240
#改行なしで空白を空けてネットワークを指定する
acl to_localhost dst 127.0.0.0/8
acl SSL_ports port 443 563
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
中略
# INSERT YOUR OWN RULE(S) HERE TO ALLOW
ACCESS FROM YOUR CLIENTS
# Exampe rule allowing access from your
local networks. Adapt
# to list your (internal) IP networks
from where browsing should
# be allowed
#acl our_networks src 192.168.1.0/24 192.168.2.0/24
#http_access allow our_networks
# And finally deny all other access to
this proxy
http_access allow localhost
http_access allow
localnet
http_access deny all
|
|
「ftp_user」では、ユーザーが匿名FTPアクセスをした際に、FTPサーバーに返す管理者のメールアドレスを指定します。変更しなくても構いませんが、FTPサイトによっては管理者の正規のメールアドレスを指定していないとアクセスを拒否されてしまう場合も結構ありますので、とりあえず管理者のメールアドレスを記入しておいてください。
■Squid の再起動
以上の設定を終えたら、Squid を起動してください。「OK」と表示されたら、実際にクライアントマシンからプロキシサーバーにアクセスしてみてください。
# /etc/init.d/squid
start
init_cache_dir /var/spool/squid... squidを起動中:
.. [ OK ] |
|
以下図は、Internet Explorerのプロキシの設定例です。正常にインターネットに接続することができたら、プロキシサーバーに接続できています。念のため、
こちらの環境変数で本当にSquid
を経由しているかどうか確認することができます。「HTTP_VIA」の箇所に「
squid/2.5.STABLE1」と表示されればOKです。
■キャッシュサイズを変更する
Squid はキャッシュサイズをカスタマイズすることで、パフォーマンスをより高めることができるようになります。「cache_mem」オプションは、キャッシュに使用するメモリのサイズを指定し、値を大きくするとレスポンスの向上につながります。ただし、あまり大きくしすぎても返ってサーバー全体のレスポンスを低下させてしまうので、搭載しているメモリ量や他に稼動しているサーバープロセスを考慮にいれながら、環境によって適度な値に設定するようにします。デフォルトの値は8MBです。
「maximum_object_size」は、キャッシュする単一オブジェクトの最大サイズを指定します。値を大きくすればするほど、より大きなファイルをキャッシュとして保存することができます。デフォルトは4MBですが、ここでは16MBに指定しています。
maximum_object_size
16384 KB |
|
FQDNの最大キャッシュ数を設定します。必要に応じてコメントを削除してください。
「cache_dir」ではディスクにキャッシュしておける容量(MB単位)を指定します。左から説明すると、2000がディスクキャッシュ容量、16が一次ディレクトリ数、256が二次ディレクトリ数を表しています。デフォルトのディスクキャッシュ量は100MBですが、最近のHDDは大容量化がすすんでいるので数GB確保しても問題ないでしょう。一次ディレクトリと二次ディレクトリは、/var/spool/squid
以下に格納されており、16進表記でディレクトリが作成されています。
cache_dir ufs /var/spool/squid
2000 16 256 |
|
■各種ログファイルの場所
アクセスログを記録したファイルです。特に変更の必要はありません。
# cache_access_log
/var/log/squid/access.log |
|
Squid のキャッシュ状態を記録するログファイルです。
# cache_log /var/log/squid/cache.log |
|
ストレージ・マネージャーの状況を記録するログファイルです。見てもなにがなんだかよくわからないですね(笑)。
# cache_store_log
/var/log/squid/store.log |
|
■URLフィルタリング
特定サイトの閲覧を禁止するURLフィルタリングについて解説します。この機能は、会社などで業務をさぼらせないよう無関係なサイトへのアクセスを禁止する場合などにはもしかしたら役にたつのかもしれませんが、自宅内でフィルタリングしてもね~という気はします。家庭内で使うとしたら…親バカの父親ぐらいですかね…(笑) それでは、筆者のサイトのフィルタリングをしてみましょう。以下のようにアクセスリストを定義し、フィルタリングしたいサイトのドメインを記述します。複数指定する場合は空白をあけて列挙していってください。
# INSERT YOUR OWN RULE(S)
HERE TO ALLOW ACCESS FROM YOUR CLIENTS
# Exampe rule allowing access from your
local networks. Adapt
# to list your (internal) IP networks from
where browsing should
# be allowed
#acl our_networks src 192.168.1.0/24 192.168.2.0/24
#http_access allow our_networks
# And finally deny all other access to this
proxy
acl denydomain dstdomain .kororo.jp
http_access deny denydomain
http_access allow localhost
http_access allow localnet
http_access deny all |
|
設定を有効にするためにSquidをリロードします。
# /etc/init.d/squid
reload |
|
ブラウザをリロードして指定してドメインがフィルタリングされたかどうか確認してください。フィルタリングに成功すると以下図のようなメッセージが表示されます。自宅内でこんなメッセージがでてきたらびっくりでしょうね…。いや、少なくとも筆者はびびりますね(笑)。
■匿名性を高める
それでは、プロキシサーバーの売り(?)でもある匿名性について解説していきます。自宅内にあるプロキシサーバーを中継する場合は、結局は情報がばればれになるので匿名性を高めるという点ではあまり効果は望めないのですが、それでも表示させたくない情報というのも、少なからずあるでしょう。ブラウザでネットサーフィンをしていると、知らず知らずのうちにある程度の情報は漏れてしまっています。これは、クライアント(ブラウザ)がWebサーバーに環境変数を送信しているためです。先ほどみてもらった
環境変数をみてもらえばわかると思いますが、これらの情報は一部ですがアクセスをするだけで筒抜け状態になっていることがわかります。もう少し、詳しい情報が知りたい方は
ENV_CHECKER(CyberSyndrome)を参照してみてください。それでは実際に、squid.conf
を編集してこれらの情報の匿名性を高めてみましょう。なお、Squid2.5以降から編集するセクションの名前が結構、変わっているように感じました。
■ホスト名の非表示
まず、「HTTP_VIA」というプロキシサーバーのホスト名を表示する環境変数を表示させないようにします。squid.conf
では、「visible_hostname」というセクションがこれに対応しており、ここには通常は自分のホスト名を記述するのですが、「unknown」としてあたかも判別できなかったかのようにします。下記のように編集することで、HTTP_VIA
の環境変数は「1.0
unknown:8080 (squid/2.5.STABLE1) 」のように表示されるはずです。なお、空白は不可です。
■プロキシサーバーのIPアドレスの非表示
プロキシサーバーの接続元IPアドレスを表示させないようにするには、「HTTP_X_FORWARDED_FOR
」を編集します。squid.conf では、「forwarded_for」セクションが対応しています。これをoff
にすることで接続元IPアドレスを隠蔽することができます。編集し終えたら、ENV_CHECKERで、「HTTP_X_FORWARDED_FOR」の箇所を参照してください。
■参照元URLの非表示
次に参照元URLを表示しないようにします。参照元URLとは、どのURL(=サイト)を経由して辿り着いたかの情報を表示する環境変数で、「HTTP_REFERER」を使います。squid.conf
での対応セクションは、「header_access」です。コメントを削除して有効にしてください。
header_access Referer
deny all |
|
■ユーザーエージェントの非表示
次に、「USER_AGENT」(ユーザーエージェント)の非表示です。ユーザーエージェントとは、ブラウザの種類やOSのヴァージョンを表示する環境変数です。IE6.0、Windows2000を使っているならば、「Mozilla/4.0
(compatible; MSIE 6.0; Windows NT 5.0)」のように表示されます。できることなら、ブラウザやOSのバージョン等はセキュリティホールを突かれる可能性もあるのであまり知られたくないものです。
header_access User-Agent
deny all |
|
■ユーザーエージェントの偽装
上の例ではユーザーエージェントそのものを非表示にするというものでした。しかし、サイトによってはユーザーエージェントを非表示にしていると正しく表示されないこともあります。なので、今度は非表示ではなく、ユーザーエージェントの偽装を行ってみます。ここでは、デフォルトで用意されている「Nutscrape/1.0
(CP/M; 8-bit)」を使って偽装してみることとします。squid.conf での対応セクションは、「header_replace」です。なお、2.5以前のバージョンにおいては「fake_user_agent」で設定を行います。
#
#Default:
# none
# TAG: header_replace
# Usage: header_replace header_name message
# Example: header_replace User-Agent Nutscrape/1.0
(CP/M; 8-bit)
#
# This option allows you to change the
contents of headers
# denied with header_access above, by
replacing them with
# some fixed string. This replaces the
old fake_user_agent
# option.
#
# By default, headers are removed if denied.
#
#Default:
# none
# none を削除して、header_replace
User-Agent Nutscrape/1.0 (CP/M;
8-bit) として置き換えてください。
|
|
|
|
その他、細かく制御したいのであれば、以下コメントを削除し、「allow」を「deny」に書き変えます。けれども、あまりに匿名性を高くしすぎても見れないサイトが多くなるだけなので、その都度、プロキシをはずしていたのでは本末転倒なのでくれぐれもほどほどにしましょう(゚ー゚;A
# header_access Allow
allow all
# header_access Authorization allow all
# header_access Cache-Control allow all
# header_access Content-Encoding allow all
# header_access Content-Length allow all
# header_access Content-Type allow all
# header_access Date allow all
# header_access Expires allow all
# header_access Host deny all
# header_access If-Modified-Since allow
all
# header_access Last-Modified allow all
# header_access Location allow all
# header_access Pragma allow all
# header_access Accept allow all
# header_access Accept-Charset allow all
# header_access Accept-Encoding allow all
# header_access Accept-Language allow all
# header_access Content-Language allow all
# header_access Mime-Version allow all
# header_access Retry-After allow all
# header_access Title allow all
# header_access Connection allow all
# header_access Proxy-Connection allow all |
|
最後に完全な匿名にしたい場合(いわゆるAnonymousB )は、以下の行のコメントを削除すればできますが、見れないサイトが圧倒的に多くります。
header_access All
deny all |
|
■Squid をソースからインストール
※squid-2.5.STABLE10.tar.gz でも動作確認済み
■squid 専用のユーザーとグループの作成
まず、squid 専用のユーザーとグループを作成します。useradd の -m オプションは、ホームディレクトリが存在しない場合に、ホームディレクトリを作成します。現時点では、/usr/local/squid
は存在しないため、-m オプションを指定しています。
# groupadd squid
# useradd -g squid -d /usr/local/squid -m
squid
# su squid
$ cd
$ pwd
/usr/local/squid
$ mkdir src
$ cd src
$ tar xzvf /usr/local/src/squid-2.5.STABLE4.tar.gz
$ cd squid-2.5.STABLE4/
|
|
configure オプションを指定します。2.4以降のsquid ではオプションを指定することでRefereやUseragentの情報も取得できるようになります。下記にオプションを記しましたが、他にもたくさんのオプションがありますのでconfigure
--help で確認してください。試してみないといまいちどんな効果があるのかわからなかったりします(^▽^;) 自信がないのでオプションは各自おもしろそうなのを見つけて指定してください。
$ ./configure --enable-default-err-language=Japanese \
--enable-icmp \
--enable-useragent-log \
--enable-referer-log \
--enable-snmp \
--with-openssl=/usr/local/ssl
$ make all
$ make install |
|
--enable-default-err-language=lang
エラーページに表示される言語にを日本語を使用できるようになります。
--enable-err-languages="lang1 lang2.."
インストールする言語を列挙します。デフォルトでは全てインストールされます。
--enable-icmp
Ping が可能になります。
--enable-useragent-log
Useragentの情報を取得できるようになります。
--enable-referer-log
Refefer(参照先)の情報を取得できるようになります。
--enable-snmp
SNMPを使ってモニタリングできます。
--disable-internal-dns
LAN内(internal )のDNSメッセージを受け取らないようにします。
--enable-ssl --with-openssl[=prefix]
SSLが使えるようになります。
■キャッシュディレクトリの作成/初期化
squid.conf でデフォルトで指定されている
cache_dirには16個の1次ディレクトリと256個の2次ディレクトリがなくてはなりませんがデフォルトでは用意されていませんので
で以下のように編集します。
cache_dir ufs /usr/local/squid/var/cache
1000 16 256 |
|
squid -z で、スワップディレクトリを初期化します。実行するユーザーはsquid として実行しないと、
FATAL:
Failed to make swap directory /usr/local/squid/var/cache:
(13) Permission denied と言われてしまいますので注意してください。
# mkdir /var/spool/squid
# mkdir /var/log/squid
# chown -R squid.squid /var/spool/squid
# chown -R squid.squid /var/log/squid
# su squid
$ /usr/local/squid/sbin/squid -z
2004/01/01 02:08:11| Creating Swap Directories |
|
■squid の起動
$ /usr/local/squid/sbin/squid
-D |
|
■squid の停止
$ /usr/local/squid/sbin/squid
-k shutdown |
|
■エラー画面の変更
Squid のエラー画面はデフォルトでは英語になっていますが、これを日本語に変更することができます。まず、ソースディレクトリ内に格納されているerrorsディレクトリを/usr/local/squid/errors
にコピーしておきます。
$ cd /usr/local/squid/src/squid-2.5.STABLE4
$ cp -r errors/ /usr/local/squid/ |
|
squid.conf にてerror_directory のパスを変更します。
$ vi squid.conf
error_directory /usr/local/squid/errors/Japanese/ |
|
■ログのローテート
squid ユーザとしてcrontab に登録します。/etc/crontab では、rootユーザにしか書き込みできませんが、crontab
-e ならば一般ユーザでも書き込みをすることができます。因みに、
/var/spool/cron 以下にユーザ名のファイルが作成されます。
$ crontab -e
00 4 * * * /usr/local/squid/sbin/squid
-k rotate |
|