squid は Linux プラットフォームや Unix プラットフォームで幅広く使用されている、キャッシュ機能付きプロキシサーバです。 Web や FTP サーバなどのインターネット側のオブジェクトに対して、元のサーバよりも端末側に近いマシンが代行してアクセスを行い、それらを保管しておくことができます。また、このようなプロキシを複数階層の構成にして、応答時間の削減やネットワーク負荷の軽減などを行うこともできます。このようにして複数階層の構成にしても、エンドユーザからその構造が見えることはなく、透過的に動作させることができます。
squid はプロキシキャッシュとして動作します。クライアント (一般的には Web ブラウザ) からのオブジェクト要求をサーバに転送します。相手側のサーバから必要なオブジェクトが届くと、それをクライアントに対して配信するとともに、ハードディスク内のキャッシュとして、そのコピーを保存しておきます。このようなキャッシュの仕組みにより、複数のクライアントが同じオブジェクトを要求した場合に、ハードディスク内のキャッシュからオブジェクトを提供できるようになります。これはインターネットに直接アクセスするよりもずっと高速であるだけでなく、ネットワーク負荷の軽減にも繋がります。
squid では、キャッシュ機能のほかに、下記のような幅広い機能を提供します:
プロキシサーバ間の相互通信による負荷分散
プロキシにアクセスする全てのクライアントに対して適用できる、厳密なアクセス制御リスト
他のアプリケーションを併用することで実現できる、特定の Web ページへのアクセス許可やアクセスの禁止
Web アクセスの傾向を確認するための Web ページ統計情報機能
squid は汎用のプロキシサーバではありません。通常は HTTP 接続のみを取り扱います。 FTP, Gopher, SSL, WAIS などのプロトコルにも対応していますが、 news プロトコルやビデオ会議プロトコルなどの他のインターネットプロトコルには対応していません。また squid では、 UDP プロトコルへの対応はプロキシキャッシュ間の通信にのみ対応しているため、ほとんどのマルチメディアプログラムにも対応していません。
squid はキャッシュ機能付きプロキシサーバとして、様々な用途に使用することができます。たとえばファイアウオールと併用すると、セキュリティを高めることができます。また、プロキシは複数を組み合わせて使用することもできます。また、キャッシュ対象とするオブジェクトの種類を指定したり、どれだけの期間保存しておくのかを指定したりすることもできます。
squid とファイアウオールを併用することで、外部の攻撃から内部ネットワークを保護することができるようになります。ファイアウオールでは、 squid を除いて全てのクライアントからの外部サービスアクセスを拒否するように設定することで、全ての Web 接続をプロキシ経由で行わせることができます。これにより、 squid で Web アクセスの全てを制御できるようになります。
ファイアウオールの設定内に DMZ の構成が含まれる場合、プロキシは DMZ 内で動作させるべきです。 26.6項 「透過型プロキシの設定」 では、 透過型 プロキシを実装するための手順を説明しています。この透過型プロキシの構成により、クライアント側ではプロキシに関する設定を行う必要がなくなりますので、設定をより簡単に済ませることができます。
複数の squid インスタンスを動作させて、お互いにオブジェクトを交換できるように設定することもできます。これによりシステム全体の負荷を軽減し、ローカルネットワーク内でオブジェクトの取得を完了させる機会を増やすことができます。また、キャッシュには階層構造を設定することもできます。これにより、オブジェクトへの要求を兄弟関係にあるキャッシュに転送したり、親キャッシュに転送したりすることができるようになります。これにより、ローカルネットワーク内の他のキャッシュからオブジェクトを提供するか、直接情報源から取得するかを効率的に選択することができるようになります。
キャッシュの階層構造を構築するにあたっては、適切なトポロジ選択が重要です。なぜなら、ネットワーク内のトラフィック量を減らすことが、プロキシキャッシュの目的の 1 つであるからです。巨大なネットワークの場合、それぞれのサブネット内にそれぞれプロキシサーバを設置して、それらは親プロキシサーバに接続して、親プロキシサーバからインターネットに直接アクセスするような構成が良いでしょう。
ここで行われる通信は、 UDP プロトコル上で動作する ICP (Internet Cache Protocol) で行われます。キャッシュ間のデータ転送は、 TCP をベースにした HTTP (HyperText Transmission Protocol) で行われます。
特定のオブジェクトを要求するにあたって、最も適切なサーバを選択する目的で、キャッシュは全ての兄弟関係のプロキシに対して、 ICP リクエストを送信します。 ICP リクエストを受け取ったプロキシは、 ICP レスポンスとしてそれらの要求に応答します。オブジェクトが見つかった場合は HIT
を、見つからなかった場合は MISS
を使用して応答します。
複数の HIT
応答が届いた場合、プロキシサーバは最も高速に応答したサーバや、最も近いサーバなどの判断基準で、特定のサーバを選択します。逆に、必要な応答が届かなかった場合、要求はそのまま親キャッシュに送信されます。
ネットワーク内の複数のキャッシュ間でオブジェクトの重複を防ぐため、 CARP (Cache Array Routing Protocol) や HTCP (HyperText Cache Protocol) などの他の ICP プロトコルを使用します。ネットワーク内で保持されるオブジェクトが増えれば増えるほど、必要なオブジェクトを見つける機会が増えることになります。
動的に生成されるページや TLS/SSL で暗号化されたコンテンツなど、ネットワーク内にある多くのオブジェクトは静的なものではありません。これらのオブジェクトは、アクセスが行われるたびに変化するものであることから、キャッシュが行われません。
また、キャッシュ内にオブジェクトを保持する期間を判断する目的で、オブジェクトには状態が割り当てられます。 Web やプロキシサーバでは、 「最終更新日時」 や 「期限切れ日時」 などの仕組みを用意することで、これらのオブジェクトに対して状態を付与できるようになっています。なお、オブジェクトに含まれるその他のヘッダ情報については、そのままキャッシュ内に保持されます。
キャッシュ内のオブジェクトは、ディスク領域の不足などを理由として置き換えられるのが一般的です。この処理を行うにあたっては、 LRU (Least Recently Used) などのアルゴリズムを使用します。これにより、最も長い時間使われていないオブジェクトは、キャッシュから消滅することを意味します。
システムに対する要件は、システムが耐えられるべき最大のネットワーク負荷に依存して決まります。ネットワークの負荷は、最大では日々の平均の 4 倍を超えるようなことも珍しくありません。また、心配な場合は、システムの要件よりも少し多めに見積もっておくとよいでしょう。これは、 squid は性能の限界まで使用されてしまうと、サービス品質の観点で多大な損失が発生してしまうためです。下記には、システム要件の要素として重要な順序を示しています:
メモリサイズ
CPU の速度/物理 CPU コア数
ディスクキャッシュのサイズ
ハードディスクか SSD か、およびその構造
squid で必要とされるメモリ量は、キャッシュ内のオブジェクトの数に依存して決まります。メモリはハードディスクや SSD より高速に動作するものであるため、 squid プロセスに対しては十分なメモリの割り当てが重要となります。メモリが不足してスワップディスクを使用してしまうと、システムの性能が劇的に下がる結果になります。
squid では、データの取得を高速化する目的で、キャッシュオブジェクトの参照と頻繁に要求されるオブジェクトについては、メインメモリ内に保持するようになっています。これに加えて、処理した全ての IP アドレスの一覧やドメイン名の正確なキャッシュ、そして最もよく要求されるオブジェクトやアクセス制御リスト、バッファなどについても、 squid はメモリ内に保持する必要があります。
squid はプロセッサのコア数の少ない (物理コア数で 4 〜 8 コア程度) 環境でも十分に動作するようチューニングされています。また、ハイパースレッディングなどの仮想的なコアでは、性能が十分に引き出せない場合があります。
複数の CPU コアを効率的に使用するため、異なるキャッシュデバイスに書き込むワーカースレッド数を多くする必要があります。既定では、マルチコアサポートが無効化されています。
小さなキャッシュの場合は、 HIT
(つまり、オブジェクトが既に取得済みのものである) の確率が小さくなります。なぜなら、小さなキャッシュではすぐにオブジェクトで埋め尽くされてしまうため、頻繁に使用されるものであっても容易に廃棄されてしまうからです。たとえばキャッシュに 1 GB を割り当てていて、ユーザが 1 日あたり 10 MB 程度のアクセスしかしない環境であれば、キャッシュを埋め尽くすのに 100 日程度かかることになります。
キャッシュとして必要なサイズを判断するのに最も簡単な方法は、インターネット接続の最大転送速度から見積もる方法です。たとえば 1 Mbit/s のインターネット接続の場合、最大転送速度は 128 KB/s になります。キャッシュ内を 1 時間で埋め尽くすと仮定すると、必要なサイズは 460 MB になります。また、業務時間を 8 時間と仮定すると、 1 日あたり 3.6 GB になります。インターネット接続は一般に、最大まで使用することはありませんので、キャッシュとして使用するのはおおよそ 2 GB 程度で十分ということになります。そのため、この例では squid に対して 2 GB 程度のキャッシュを設定することで、 1 日分に相当するデータをキャッシュできることになります。
キャッシュ処理においては、速度が重要となります。そのため、この要素に対しては特別に配慮しておくことをお勧めします。ハードディスクや SSD の場合、このパラメータは ランダムシークタイム や ランダムリードパフォーマンス などとして示され、多くはミリ秒で示されます。 squid からハードディスクや SSD に書き込んだり、それらから読み込んだりするデータは小さいものであるため、データのスループットよりはシークタイムや読み込み性能のほうがより重要となります。
プロキシとして使用する場合、高速回転のハードディスクや SSD を使用しておくことが最適な選択となります。ハードディスクを使用する場合、複数の小さなハードディスクを使用して、それぞれにキャッシュディレクトリを設定することで、読み込み時間を削減することができます。
RAID システムを使用すると、速度を犠牲にして信頼性を増すことができますが、性能上の理由から、 (ソフトウエア) RAID5 やそれに類似の設定は避けておくことをお勧めします。
ほとんどの場合において、ファイルシステムの選択はそれほど重要ではありません。ただし、マウントオプションに noatime
を指定することで、性能を改善することができます。これは、 squid では独自のタイムスタンプを保持しているため、ファイルシステム側でアクセス日時を管理する必要が無いためです。
openSUSE® Leap では squid
は既定でインストールされませんので、まずはお使いのシステムにインストールを行ってください。
squid は openSUSE Leap 側であらかじめ設定済みであるため、インストール直後からすぐに起動することができます。なお、起動時の問題を回避するため、あらかじめインターネットに接続しておき、少なくとも 1 つ以上のネームサーバを設定しておいてください。また、動的な DNS 設定でダイヤルアップ接続を行っている場合は、起動時に問題が発生する場合があります。これは、 squid では、 /var/run/netconfig/resolv.conf
内に DNS サーバの設定が存在しないと、開始することができないことによるもので、この場合は少なくとも 1 つ以上のネームサーバを固定で設定しておいてください。
squid を起動するには、下記のコマンドを実行します:
>
sudo
systemctl start squid
システムの起動時に squid を開始するように設定したい場合は、 systemctl enable squid
のように実行して、サービスを有効化します。
squid が動作しているかどうかを確認するには、下記のコマンドを実行します:
systemctl
を使用する場合:
>
systemctl status squid
上記のコマンドの出力に loaded
と active (running)
が含まれていれば、 squid が動作していることになります。
また、 squid 自身でも確認することができます:
>
sudo
squid -k check | echo $?
このコマンドの出力は 0
であるべきですが、追加の警告やメッセージが含まれることもあります。
ローカルシステム内で squid の機能をテストするには、下記のいずれかの方法を使用します:
テストを行うには、 squidclient
と呼ばれるコマンドラインツールをお使いください。これは Web リクエストを送信して出力を表示することのできるツールで、 wget
や curl
に似た仕組みです。
なお、 wget
や curl
等のツールとは異なり、 squidclient
はローカルの squid (localhost:3128
) に対して接続を行います。 squid 側の設定でポートを変更している場合は、 squidclient
のコマンドラインオプションを指定して、プロキシを指定する必要があります。詳しくは squidclient --help
をお読みください。
squidclient
によるリクエスト送信 #>
squidclient http://www.example.org
HTTP/1.1 200 OK Cache-Control: max-age=604800 Content-Type: text/html Date: Fri, 22 Jun 2016 12:00:00 GMT Expires: Fri, 29 Jun 2016 12:00:00 GMT Last-Modified: Fri, 09 Aug 2013 23:54:35 GMT Server: ECS (iad/182A) Vary: Accept-Encoding X-Cache: HIT x-ec-custom-error: 1 Content-Length: 1270 X-Cache: MISS from moon1 X-Cache-Lookup: MISS from moon:3128 Via: 1.1 moon (squid/3.5.16)2 Connection: close <!doctype html> <html> <head> <title>Example domain</title> [...] </body> </html>
例26.1「squidclient
によるリクエスト送信」 に示されている出力は、 2 つのパートから構成されています:
応答のプロトコルヘッダ: 1 行分の空き (空行) より前の部分がそれにあたります。
応答の本体: 空行より後ろの部分がそれにあたります。
squid を使用していることを確認するため、下記のヘッダ行をご確認ください:
次にブラウザを利用して確認します: プロキシサーバに localhost
を、プロキシサーバのポートに 3128
を指定してブラウザを設定します。この状態から何らかの Web ページを開いて、ブラウザの インスペクタ や 開発者ツール 内にある パネルから、応答ヘッダを確認してください。 例26.1「squidclient
によるリクエスト送信」 と同様のヘッダが存在しているはずです。
ローカルシステムや他のシステムから squid 経由でインターネットにアクセスできるようにするには、設定ファイル /etc/squid/squid.conf
内にある http_access deny all
を http_access allow all
に変更してください。ただし、この設定を実施すると、 squid は誰からもアクセスできるようになってしまうことに注意してください。アクセスできるユーザを制限したい場合は、 ACL (Access Control List; アクセス制御リスト) を設定して行います。また、設定ファイルを変更した場合は、 squid を再読み込みさせるか、再起動しなければなりません。 ACL について、詳しくは 26.5.2項 「アクセス制御用オプション」 をお読みください。
squid が正しく開始できているにもかかわらず、しばらくして squid が停止してしまうような場合は、ネームサーバの設定が正しく行われていないか、 /var/run/netconfig/resolv.conf
ファイルがそもそも存在していないことが考えられます。 squid では、開始時の問題を /var/log/squid/cache.log
ファイル内に記録します。
squid を再読み込みさせるには、下記のいずれかを実施します:
systemctl
を使用する場合:
>
sudo
systemctl
reload squid
もしくは、下記のように実行してもかまいません:
>
sudo
systemctl
restart squid
YaST を使用する場合は、下記のようにします:
squid モジュールを起動して
ボタンを押します。squid を停止するには、下記のいずれかを実施します:
systemctl
を使用する場合:
>
sudo
systemctl
stop squid
YaST を使用する場合:
squid モジュールを起動して
ボタンを押します。squid は、その停止時にクライアントとの接続を切断し、データをディスクに書き込む処理を行うため、最大で 30 秒程度の時間がかかります (/etc/squid/squid.conf
内の shutdown_lifetime
オプションで設定することができます) 。
squid を停止させる際は、 kill
や killall
コマンドで停止させてはなりません。これを行ってしまうと、キャッシュデータを壊してしまう可能性があります。この場合、 squid を再度開始できるようにするには、キャッシュデータを削除しなければならなくなります。
システムから squid を削除しても、キャッシュ構造やログファイルについては削除が行われません。これらを削除するには、 /var/cache/squid
ディレクトリを手作業で削除してください。
たとえ自分自身でドメインを所有していなくても、ローカルで DNS サーバを構築しておくことには意味があります。ローカルの DNS サーバは、キャッシュ専用のネームサーバとして動作させることで、特別な設定を行わなくてもルートネームサーバへの DNS 要求ができるようになります (詳しくは 19.4項 「BIND ネームサーバの起動」 をお読みください) 。このようなローカルの DNS サーバは、インターネットの接続にあたって動的に DNS サーバの設定を取得しているのか、静的に取得しているのかによって、やるべき作業が異なる点にも注意してください。
動的に DNS 設定を取得している場合、 DNS サーバの情報はインターネットの接続時にプロバイダ側から提供され、それにあわせてローカルの /var/run/netconfig/resolv.conf
が自動的に調整されるようになっています。この動作は、 /etc/sysconfig/network/config
内の NETCONFIG_DNS_POLICY
という sysconfig 変数で変更することができます。 YaST sysconfig エディタなどを利用して、 NETCONFIG_DNS_POLICY
を ""
に設定してください。
その後、 /var/run/netconfig/resolv.conf
内にローカルの DNS サーバを設定します。具体的には、 localhost
を意味する 127.0.0.1
の IP アドレスを設定します。これにより、 squid は開始時にローカルのネームサーバを常に見つけられるようになります。
また、プロバイダのネームサーバにアクセスできるようにするため、 /etc/named.conf
内の forwarders
以下に、 プロバイダのネームサーバを IP アドレスで指定します。動的に取得する環境の場合は、 sysconfig 変数の NETCONFIG_DNS_POLICY
を auto
にすることで、自動的に調整させることができるようになります。
静的な DNS 設定の場合、接続を行っても自動的に DNS の設定が更新されることはありません。そのため、 sysconfig 変数についても、特に変更を行う必要はありません。しかしながら、 動的に DNS 設定を取得している場合 で説明しているとおり、 /var/run/netconfig/resolv.conf
ファイルでローカルの DNS サーバを指定しておかなければなりません。これに加えて、 /etc/named.conf
ファイル内の forwarders
以下に、 IP アドレスでプロバイダのネームサーバを指定してください。
ファイアウオールを動作させている場合は、 DNS の要求を通すことができるように設定してください。
YaST の squid モジュールには、それぞれ下記のタブが用意されています:
squid の起動方法や、どのインターフェイスに対してファイアウオールのポートを開くかなどの設定を行います。
squid がクライアントからの HTTP リクエストを待ち受けるポートを指定します。
squid でのキャッシュ内オブジェクトの取り扱い方法を設定します。
最大オブジェクトサイズや最小オブジェクトサイズなど、キャッシュメモリに関する設定を行います。
squid が全てのキャッシュスワップファイルを保存するディレクトリを設定します。
ACL グループを介した squid サーバへのアクセス制御を行います。
接続タイムアウトやクライアントの生存時間に加えて、アクセスログ、キャッシュログ、キャッシュ保存ログの保存先を設定します。
言語や管理者のメールアドレスの設定を行います。
squid プロキシサーバの設定は、 /etc/squid/squid.conf
ファイルで行います。 squid を初めて起動した場合は、このファイルを修正する必要はありませんが、初期状態では外部からのアクセスが全て拒否されるようになっています。そのため、プロキシは localhost
専用のものとなります。また、既定のポートは 3128
です。あらかじめ用意されている /etc/squid/squid.conf
には、オプションに関する様々な説明や設定例が示されています。
多くの項目は #
というコメント文字でコメントアウトされていて、その後ろに様々な設定が書かれています。記述されている値は、通常は既定値が書かれているものであるため、コメントアウトを外しても squid の動作は変わりません。また、可能であればコメントアウトされた行は変更せず、その下に行を挿入して必要な設定と値を記述してください。これにより、何らかの設定を間違ってしまっていても、すぐに元に戻すことができるためです。
古いバージョンの squid から更新する場合は、設定ファイルをそのままコピーせず、新しい /etc/squid/squid.conf
から必要に応じて変更していく方法で実施することをお勧めします。
squid では、バージョンが変わるごとにオプションが追加/削除/変更されます。そのため、古いバージョンに対応した squid.conf
を新しいバージョンで使用すると、正しく動作しないことがあります。
下記には、 squid の設定オプションのうち主なものを一覧で示しています。下記は全ての設定を網羅しているわけではありません。 squid パッケージ内には、全てのオプションを簡易に説明した文書が用意されています。詳しくは /etc/squid/squid.conf.documented
ファイルをお読みください。
http_port ポート
squid がクライアントからの要求を待ち受けるポートを指定します。既定値は 3128
ですが、一般的には 8080
を使用することもあります。
cache_peer ホスト名 種類 プロキシポート ICP_ポート
このオプションは、相互に通信を行うキャッシュネットワークを作成するためのオプションです。 cache_peer
で指定する相手は、この squid と同じくネットワークキャッシュを提供するコンピュータで、相互に関係性を持たせるためのものです。関係性の種類は 種類 で指定します。ここには parent
(親) もしくは sibling
(兄弟) のいずれかを指定します。
ホスト名 には対向のプロキシをホスト名または IP アドレスで指定します。 プロキシポート には一般的なブラウザからアクセスする際のポート (通常は 8080
) を設定します。また、 ICP_ポート には 7
を指定するか、もしくは ICP ポートが分からない場合や、この相手に対しては使用しない場合、 0
を指定します。
また、 squid をプロキシではなく Web ブラウザのように動作させたい場合は、 default
および no-query
のオプションを追加して、 ICP プロトコルの使用を禁止してください。
cache_mem サイズ
このオプションには、 squid が最もよく使用するオブジェクトに対して使用するメモリ量を設定します。既定値は 8 MB
です。ただし、ここで指定した値は squid 全体のメモリ使用を制限するものではありません。そのため、ここで指定した値を超えてメモリを使用することがあります。
cache_dir ストレージの種類 キャッシュディレクトリ キャッシュサイズ レベル_1_ディレクトリ レベル_2_ディレクトリ
cache_dir
オプションは、ディスクキャッシュのディレクトリを指定するためのオプションです。 openSUSE Leap の既定の設定では、 squid はディスクキャッシュを作成しません。
ストレージの種類 では、下記のいずれかを指定することができます:
ディレクトリのストレージ: ufs
, aufs
(既定値), diskd
のいずれかを指定します。 3 種類はいずれも ufs
という形式のストレージを使用しますが、 ufs
を指定すると squid の中枢スレッド内で、 aufs
を指定すると別途のスレッドとして、 diskd
を指定すると別途のプロセスとしてそれぞれストレージが動作するようになります。後者 2 種類については、ディスクの I/O による squid の一時的な処理停止を防ぐことができます。
データベースのストレージ: rock
を指定します。このストレージ形式は単一のデータベースファイルから構成される仕組みで、それぞれのオブジェクトが固定長のメモリユニットを 1 つもしくは複数確保することで動作します。
なお、下記はストレージの種類に ufs
を選択した場合の説明になります。 rock
を選択した場合は異なる設定になります。
キャッシュディレクトリ には、ディスクキャッシュを配置するディレクトリを指定します。既定では /var/cache/squid
が指定されています。 キャッシュサイズ はディレクトリに対する最大のサイズを指定します。既定では 100 MB に設定されています。利用可能なディスク領域のうち、 50% から 80% 程度までの範囲で指定してください。
レベル_1_ディレクトリ と レベル_2_ディレクトリ には、 キャッシュディレクトリ 内に作成するサブディレクトリの数を設定します。既定では レベル_1_ディレクトリ が 16 に、 レベル_2_ディレクトリ が 256 に設定されています。 レベル_2_ディレクトリ は、 レベル_1_ディレクトリ 内のサブディレクトリとなります。なお、これらの値を増やす場合は注意して設定してください。ディレクトリ数が多すぎると、性能面で問題を引き起こす場合があります。
キャッシュを複数のディスクにまたがって設定したい場合は、 cache_dir
を複数個指定してください。
cache_access_log ログファイル
, cache_log ログファイル
, cache_store_log ログファイル
これら 3 種類のオプションは、 squid が様々な動作に対してログ記録を残すためのファイルを指定するためのものです。通常は特に変更する必要はありません。ただし、 squid 側の負荷が高い場合は、キャッシュとログファイルを複数のディスクに分割して設定するとよいでしょう。
client_netmask ネットマスク
このオプションは、ログファイル内でサブネットマスクを適用することによって、クライアントの IP アドレスをマスクする処理を行います。たとえば IP アドレスの末尾を 0
に設定したい場合は、 255.255.255.0
を指定します。
ftp_user 電子メールアドレス
このオプションは、匿名 FTP ログイン時に入力するパスワードを指定します。 FTP サーバによっては、電子メールアドレスが正しいかどうかを検証することがありますので、通常は正しい電子メールアドレスを指定します。
cache_mgr 電子メールアドレス
何らかの問題で squid がクラッシュしてしまった場合、 squid はここで指定した電子メールアドレスに対して、メッセージを送信します。既定値は webmaster です。
logfile_rotate 値
squid
-k rotate
を実行すると、 squid
はログファイルをローテーションします (切り替えます) 。ログファイルの末尾には番号が付けられて保存されるほか、古いものから順に上書きされるようになります。既定値は 10
で、この場合は末尾に 0 から 9 までの番号が付くことになります。
なお、 openSUSE Leap ではログファイルの切り替えは logrotate
と /etc/logrotate.d/squid
を使用して自動的に実施しています。
append_domain ドメイン名
append_domain は、何もドメインを指定しない場合に自動的に追加するドメイン名を指定します。通常はご利用のドメインを指定しますが、このように設定すると、ブラウザで www とだけ入力すると、ご利用のドメインの Web サーバを表示させることができます。
forwarded_for 状態
このオプションを on
に設定した場合、下記のようなヘッダが追加されます:
X-Forwarded-For: 192.168.0.1
このオプションを off
に設定した場合、 squid は HTTP リクエスト内にある IP アドレスとシステム名の情報を削除します。
negative_ttl 時間
, negative_dns_ttl 時間
これらのオプションを設定すると、 squid は 404
応答などを含むいくつかの種類の失敗をキャッシュするようになります。失敗をキャッシュした場合は、元のリソースが利用可能な状態になっても、新しい要求を拒否するようになります。
既定では negative_ttl
は 0
に、 negative_dns_ttl
1 minutes
(1 分) に設定されています。 これらの設定値では、 Web リクエストに対する否定応答はキャッシュされないものの、 DNS リクエストに対する否定応答は 1 分間だけキャッシュされるようになります。
never_direct allow ACL_名
squid がインターネットに対して直接接続することを防ぐには、 never_direct
を指定して他のプロキシへの接続を強制することをお勧めします。この場合、接続先のプロキシは cache_peer
で指定したものを使用します。 ACL_名 に all
を指定すると、全ての要求を 親
宛に転送するようになります。これはたとえば、プロバイダ側でプロキシの使用を求めていて、インターネットへの直接アクセスを拒否しているような場合に必要な設定となります。
squid では アクセス制御リスト (ACL; Access Control List) を利用してプロキシサーバへのアクセスを制御します。 ACL は上から順に処理されるルールを一覧で指定する形を取るほか、指定する前に定義を行う必要もあります。また、既定の ACL である all
と localhost
については、定義せずに利用することができます。しかしながら、 ACL の設定だけでは何も効果がありません。対応する http_access
ルールなどを設定することではじめて効果があります。
acl
オプションの書式は下記のとおりです:
acl ACL_名 種類 データ
それぞれの項目の意味は下記のとおりです:
ACL_名 には任意の名前を指定します。
種類 には様々な値を指定することができます。詳しくは /etc/squid/squid.conf
ファイル内の ACCESS CONTROLS
セクションをお読みください。
データ は ACL の種類ごとに異なるデータを指定する箇所で、たとえばホスト名や IP アドレス、 URL などを指定します。
YaST の squid モジュールでルールを追加する場合は、モジュールを開いて
タブを選択します。あとは ACL グループの一覧から ボタンを押して、ルールの名前と種類、パラメータを指定します。ACL ルールに関するより詳しい説明については、 https://www.squid-cache.org/Versions/v3/3.5/cfgman/acl.html にある squid のドキュメンテーションをお読みください。
acl mysurfers srcdomain .example.com 1 acl teachers src 192.168.1.0/255.255.255.0 2 acl students src 192.168.7.0-192.168.9.0/255.255.255.0 3 acl lunch time MTWHF 12:00-15:00 4
この ACL は | |
この ACL は | |
この ACL は | |
この ACL は |
http_access
では、プロキシを使用できるユーザと、そのユーザがどのサイトにアクセスできるのかをそれぞれ設定します。ここでは ACL_名 を指定しますので、対応する ACL をあらかじめ定義しておく必要があります。なお、上述のとおり localhost
と all
は最初から定義されているため、 deny
や allow
で禁止や許可を設定することができます。また http_access
は必要な数だけ記述することができ、それぞれ上から順に解釈されます。そのため、どちらが最初に現れるのかによって、許可と拒否が入れ替わることもあります。また、末尾には http_access deny all
を指定しておくと良いでしょう。下記の例は、 localhost
からのアクセスであれば、どのサイトに対しても自由にアクセスすることができますが、その他のホストからのアクセスは拒否する設定です:
http_access allow localhost http_access deny all
もう 1 つの例では、下記のようなルールになっています。グループ teachers
は常にインターネットへのアクセスが許可されます。グループ students
については、月曜日から金曜日までのランチタイムにのみアクセスが許可されます。
http_access deny localhost http_access allow teachers http_access allow students lunch time http_access deny all
可読性を高めるため、 http_access
は /etc/squid/squid.conf
ファイル内の一カ所に集めておくことをお勧めします。
url_rewrite_program パス
このオプションを使用すると、 URL の書き換えプログラムを指定することができます。
auth_param basic program パス
利用者に対してプロキシへのアクセスに際して認証を求める場合、ここでプログラムを指定します。たとえば /usr/sbin/pam_auth
のように指定します。 pam_auth
では、はじめてアクセスすると、ユーザに対してユーザ名とパスワードの入力を求めます。この設定に加えて ACL を定義することで、インターネットへのアクセス時に正しい認証情報を求めるようにすることができます:
acl password proxy_auth REQUIRED http_access allow password http_access deny all
acl proxy_auth
では REQUIRED
と指定していますが、これはユーザ名とパスワードが適合していれば、どのユーザに対してもアクセスを許可する意味になります。 REQUIRED
の代わりに、許可するユーザの一覧を記述してもかまいません。
ident_lookup_access allow ACL_名
このオプションを指定すると、 src
の種類の ACL で定義される全てのクライアントに対して、ユーザの識別情報を取得するために ident 要求を実行します。全てのクライアントに対して処理を行いたい場合は、 ACL_名 にあらかじめ設定されている ACL 名である all
を指定してください。
なお、 ident_lookup_access
を指定した全てのクライアントでは、 ident デーモンを動作させなければならなくなります。 Linux の場合、 ident デーモンとして pidentd
(pidentd パッケージ) を使用することができます。 ident 要求に対して正常に応答したクライアントだけにアクセスを許可したい場合は、下記のような ACL を設定します:
acl identhosts ident REQUIRED http_access allow identhosts http_access deny all
acl identhosts ident
オプションに書かれている REQUIRED
は、正しくユーザ名が設定されていれば全てのユーザを受け入れる意味になります。 REQUIRED
の箇所を許可するユーザの一覧に変更すれば、そのユーザに対してのみ許可することができるようになります。
なお、 ident
オプションを指定すると、 squid への要求が発生するたびに ident の参照が発生するため、アクセスに時間がかかるようになりますので、あらかじめご注意ください。
透過型プロキシの場合は、プロキシサーバが Web ブラウザの要求を仲介して処理を行います。そのため、 Web ブラウザはプロキシの存在に気付くことがありませんし、名前のとおりユーザに対しても透明な存在になります。
プロキシサーバは一般に、プロキシ内のキャッシュに存在するかどうかに関わらず、 Web ブラウザからの要求を受け取ってインターネットへのアクセスを代行する処理を行いますが、それ以外にも透過型プロキシと呼ばれる形態で動作させることもできます。たとえば下記のような用途が考えられます:
セキュリティ上の理由から、インターネットにアクセスするにあたって全てのクライアントがプロキシを使用することが推奨される場合。
全てのクライアントに対して、プロキシの存在に気付くことなく使用させたい場合。
ネットワーク内のプロキシを移設したいが、既存のクライアント側の設定をいちいち変更させたくない場合。
まずは /etc/squid/squid.conf
内で、 http_port
に transparent
というパラメータを指定したものを追加します。たとえば下記のようになります:
http_port 3128⎄ http_port 3128 transparent
squid を再起動します:
>
sudo
systemctl restart squid
あとはファイアウオールを設定して、 HTTP のトラフィックを http_proxy
で指定したポート (上記の例では 3128) に転送するようにします。設定後はファイアウオールの設定を再読み込みします。なお、お使いの LAN インターフェイスが internal
ゾーン内に存在している必要があります。
>
sudo
firewall-cmd
--permanent --zone=internal \ --add-forward-port=port=80:proto=tcp:toport=3128:toaddr=LAN_IP>
sudo
firewall-cmd
--permanent --zone=internal --add-port=3128/tcp>
sudo
firewall-cmd
--reload
なお、 LAN_IP の箇所には、お使いの LAN インターフェイスか squid が待ち受けているインターフェイスの IP アドレスを入力してください。
全てが正しく動作していることを確認したい場合は、 /var/log/squid/access.log
にある squid のログファイルを確認してください。
cachemgr.cgi
) #Edit sourcesquid キャッシュマネージャ CGI インターフェイス ( cachemgr.cgi
) は、動作中の squid プロセスに対して、メモリの使用状況の統計を表示するための CGI ユーティリティです。サーバにログインすることなく、キャッシュを管理したり統計情報を表示したりすることができます。
cachemgr.cgi
の設定 #まずはお使いのシステムで Apache Web サーバを動作させます。 Apache の設定方法について、詳しくは 第24章 「Apache HTTP サーバ」 をお読みください。特に 24.5項 「CGI スクリプトの有効化」 をよくお読みください。 Apache が動作していることを確認するには、下記のコマンドを実行します:
>
sudo
systemctl status apache2
inactive
(動作していない) と表示されてしまった場合は、 openSUSE Leap の既定の設定では下記のようにして Apache を開始します:
>
sudo
systemctl start apache2
これで cachemgr.cgi
を使用する準備が整いました。あとは ScriptAlias
に対する設定ファイルを作成します。
/etc/apache2/conf.d
ディレクトリ内に cachemgr.conf
というファイルを作成し、下記の内容を記述します:
ScriptAlias /squid/cgi-bin/ /usr/lib64/squid/ <Directory "/usr/lib64/squid/"> Options +ExecCGI AddHandler cgi-script .cgi Require host ホスト名 </Directory>
なお ホスト名 の箇所は、 cachemgr.cgi
へのアクセスを許可するコンピュータのホスト名を指定します。これにより、 cachemgr.cgi
へのアクセスを制限することができます。どのコンピュータからもアクセスできるように設定したい場合は、代わりに Require all granted
を指定してください。
なお、 squid と Apache Web サーバが同じコンピュータで動作している場合は、 /etc/squid/squid.conf
を変更する必要はありません。ただし、 /etc/squid/squid.conf
内に下記の内容が含まれていることをご確認ください:
http_access allow manager localhost http_access deny manager
これらの行は、マネージャインターフェイスに対して、そのコンピュータ自身 ( localhost
) からのみアクセスを許可する設定になります。
squid と Apache Web サーバが別々のコンピュータで動作している場合は、 squid に対して特定のコンピュータからキャッシュマネージャにアクセスできるように設定する必要があります。この場合は、下記のような ACL になります (Web_サーバの_IP には、 Web サーバの IP アドレスを指定します):
acl webserver src Web_サーバの_IP/255.255.255.255
あとは設定ファイル内に下記のルールを記述します。順序を間違えないように注意してください。
http_access allow manager localhost http_access allow manager webserver http_access deny manager
また、必要であれば cachemgr.cgi
に対して 1 つもしくは複数のパスワードを設定することもできます。この設定では、キャッシュをリモートから閉じたり、キャッシュに対する詳細情報を取得したりする際にパスワードを求めたりすることもできます。この場合は、 cache_mgr
や cachemgr_passwd
のオプションに対して複数のパスワードを設定して、そのパスワードを入力した際に許可するアクションを指定します。
たとえばトップページ (メニュー) と 60 分間の平均値の表示についてはパスワード入力を求めず、オフラインモードへの移行にはパスワード入力 secretpassword
を求め、それ以外の全ては無効化したい場合、下記のような設定になります:
cache_mgr user cachemgr_passwd none index menu 60min cachemgr_passwd secretpassword offline_toggle cachemgr_passwd disable all
cache_mgr
ではユーザ名を指定します。 cachemgr_passwd
では、パスワードと許可するアクションをそれぞれ指定します。
なお、 none
と disable
は特別な意味を持つキーワードです。 none
はパスワードの入力を求めず、 disable
はその機能を無効化する意味になります。
アクションの一覧については、 cachemgr.cgi
にログインしてご確認ください。また、設定ファイル内でのキーワードについては、それぞれのアクションページ内の &operation=
内に書かれています。なお、アクションで all
を指定すると、全てのアクションを意味することになります。
squid と apache の設定を変更した場合は、それぞれ再読み込みを行います:
>
sudo
systemctl reload squid
統計情報を表示するには、ここまでで設定した cachemgr.cgi
のページを表示させてください。たとえば http://webserver.example.org/squid/cgi-bin/cachemgr.cgi
のような URL になるはずです。
サーバ名の指定のほか、ユーザ名とパスワードを設定していれば、それらも正しく入力してください。あとは
を押すと、異なる統計情報を表示することができます。Calamaris は ASCII や HTML の出力形式に対応した Perl スクリプトで、 squid のアクセスログファイルを読み込んでキャッシュ動作のレポート生成を行います。このツールは openSUSE Leap の既定ではインストールが行われません。必要な場合は calamaris
パッケージをインストールしてお使いください。なお、 Calamaris の Web ページは https://cord.de/calamaris-english (英語) にあります。
まずは root
でログインして、下記のように入力します:
#
cat access1.log [access2.log access3.log] | calamaris オプション > レポートファイル
複数のログファイルを指定する場合は、それらを時系列で古いものから順に並べて指定してください。上記のように複数のファイルを順に指定してもかまいませんし、 access{1..3}.log
のように指定してもかまいません。
calamaris
では下記のようなオプションを指定することができます:
-a
利用可能な全てのレポートを出力します。
-w
HTML 形式で出力します。
-l
レポートヘッダ内にメッセージやロゴを含めます。
上記以外のオプションについては、マニュアルページ内に説明があります。詳しくは man
calamaris
を実行してください。
一般的な使用方法は下記のとおりです:
#
cat access.log.{10..1} access.log | calamaris -a -w \
> /usr/local/httpd/htdocs/Squid/squidreport.html
上記のように実行すると、 Web サーバのディレクトリ内にレポートを出力します。レポートを表示するには、 Apache を動作させる必要があります。
squid の Web ページは https://www.squid-cache.org/ にあります。ここには 「Squid User Guide」 (squid ユーザガイド) としてマニュアルが用意されているほか、 squid の FAQ なども用意されています。
squid のメーリングリストもあります。詳しくは https://www.squid-cache.org/Support/mailing-lists.html をお読みください。