犬でも分かるsquid : httpプロキシ

squidは、httpやhttpsアクセスのプロキシサーバとなるソフトウェアです。プロキシ(proxy)とは「代理」という意味であり、クライアントがサーバに直接アクセスする代わりに、プロキシサーバが代理となってサーバにアクセスをしてくれるということです。クライアントがインターネットに直接アクセスできない環境にあっても、プロキシサーバがインターネットにアクセスできれば、プロキシサーバを中継してクライアントがインターネット上のhttpやhttpsサーバにアクセスすることができます。

ネットワーク環境

ウチには2台のミニPCがあります。base0というホストは、ホームネットワーク(192.168.1.0/24)に接続されており、ホームルータを経由(NAT)してインターネット上のhttp/httpsサーバにアクセスができます。もう1台のbase1というホストは、管理ネットワーク(192.168.2.0/24)に接続しているだけなので、インターネットにはアクセスできません。

さて今回は、base0上でプロキシサーバとしてsquidを稼働させることにします。すると、インターネットにアクセスできないbase1からも、base0のsquidを中継して、インターネット上のhttp/httpsサーバにアクセスすることができるようになります。

squidのインストールと設定はすごく簡単

base0のOSはRocky 9.5です。squidは以下のコマンドでインストールできます。

# dnf -y install squid

インストールしたら、以下のようにして自動起動の設定と起動を行いましょう。

# systemctl enable squid
Created symlink /etc/systemd/system/multi-user.target.wants/squid.service → /usr/lib/systemd/system/squid.service.
# systemctl start squid

これだけで、プロキシサーバの機能が有効になります。

設定ファイルを見てプロキシのport番号を確認しよう

squidの設定ファイルは以下のパスです。

/etc/squid/squid.conf

このファイルの以下の行で、プロキシのport番号が 3128 であることが分かります。

# Squid normally listens to port 3128
http_port 3128

プロキシ経由でhttpサーバ,httpsサーバにアクセスできるか試してみる

プロキシサーバを利用するための環境変数

httpアクセスとhttpsアクセスでプロキシサーバを使用するには、それぞれ以下のように環境変数を設定します。

$ export http_proxy=http://192.168.2.200:3128
$ export https_proxy=http://192.168.2.200:3128

ここで、192.168.2.200 は、base1から見たときのbase0のIPアドレスです。

上記の環境変数を設定したら、curlコマンドでwww.google.comにアクセスを試してみましょう。

$ curl http://www.google.com > test.output
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current                                  Dload  Upload   Total   Spent    Left  Speed
100 18567    0 18567    0     0   172k      0 --:--:-- --:--:-- --:--:--  174k

プロキシサーバを利用しているのか確認する方法(1)

プロキシサーバ経由でアクセスしたかどうかは、base0上のアクセスログ /var/log/squid/access.log を見れば分かります。

1748631456.304 949 192.168.2.210 TCP_MISS/200 19480 GET http://www.google.com/ - HIER_DIRECT/142.251.42.196 text/html

TCP_MISS は、squidのキャッシュにデータがないので、オリジナルのサーバからデータを取得したことを意味し、200はアクセスに成功していることを意味しています。

プロキシサーバを利用しているのか確認する方法(2)

curlコマンドを「–head」オプションで実行し、ヘッダ情報を出力させると、「Via: 1.1 base0 (squid/5.5)」という行からsquidを経由してアクセスしたことが確認できます。

$ curl http://www.google.com --head
HTTP/1.1 200 OK
Content-Type: text/html; charset=ISO-8859-1
Content-Security-Policy-Report-Only: object-src 'none';base-uri 'self';script-src 'nonce-5UAzYrEsEbpumO74kaPgJA' 'strict-dynamic' 'report-sample' 'unsafe-eval' 'unsafe-inline' https: http:;report-uri https://csp.withgoogle.com/csp/gws/other-hp
P3P: CP="This is not a P3P policy! See g.co/p3phelp for more info."
Date: Fri, 30 May 2025 19:03:04 GMT
Server: gws
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN
Expires: Fri, 30 May 2025 19:03:04 GMT
Cache-Control: private
Set-Cookie: AEC=AVh_V2jNvrZPHOm48cBtDryKlcE0XMiJInBzE6p6hdXsEsACpYUp0iFmCrc; expires=Wed, 26-Nov-2025 19:03:04 GMT; path=/; domain=.google.com; Secure; HttpOnly; SameSite=lax
Set-Cookie: NID=524=kYjd6W96YY5H0H6uFz5vDv_wrMIcDhQHWWn4gBRzEWrrhjSjX6bhah1R_D69Qt6xRmfyVAu8DpLeU1s-e_4xOFmu1nbk1Hf0HrndoLM3_gGAhHz01r3IbDGvxgk-kV6CaakmRI3PyOW7JpVxplTI_1KEIYvP0sZO4Bwr7-j4xi5pbQDUi6mV2ho74uBh4g5I28QeGRNDCk16nQ; expires=Sat, 29-Nov-2025 19:03:04 GMT; path=/; domain=.google.com; HttpOnly
X-Cache: MISS from base0
X-Cache-Lookup: MISS from base0:3128
Via: 1.1 base0 (squid/5.5)
★これです
Connection: keep-alive

キャッシュ機能を使ってみよう

squidのキャッシュ機能を有効にすると、過去にアクセスしたURLに再度アクセスしたときに、オリジナルからデータを取得せずに、キャッシュからデータを取得することができます。クライアントの台数が多い場合は、キャッシュ機能を有効にすることで、インターネットへのトラフィックを減らすことが期待できます。

キャッシュを有効にするための設定

インストール直後の /etc/squid/squid.conf では、キャッシュの設定(cache行)はコメントアウトされているので、有効にします。

# Uncomment and adjust the following to add a disk cache directory.
cache_dir ufs /var/spool/squid 100 16 256

この行は、それぞれ以下の意味を持ちます。

ufsufs は Unix File System の略で、Squid で最も一般的なストレージ方式(シンプルなファイルベース)。
/var/spool/squidキャッシュディレクトリのパス
100ディスクキャッシュの最大サイズ(MB単位)として 100MB を指定。このサイズを超えると、古いキャッシュから削除されていく。
16レベル1ディレクトリの数(= /var/spool/squid/00 〜 /var/spool/squid/0f のように作成される)として16を指定。
256各レベル1ディレクトリの中に作成されるレベル2ディレクトリの数として256を指定。
すなわち、この例では、最大で 16 × 256 = 4096 個のディレクトリ構造が作成され、キャッシュファイルが分散されて保存される。

/etc/squid/squid.conf を変更したら、squidを再起動しましょう。

# systemctl restart squid

再起動になんかすこし時間がかかるようになりました。

キャッシュが有効になっているかを確認する方法

http/httpsアクセスしたときに、squidのキャッシュを参照したのか、オリジナルのURLを参照したのかは、アクセスログ /var/log/squid/access.log を見れば分かります。

TCP_MISSキャッシュに存在せず、オリジナルのURLから取得
TCP_TUNNELCONNECT メソッドでトンネルを確立。HTTPSの場合は、Squid は暗号化通信の中身を見ず、単にトンネル(双方向通信)を確立して中継する。
TCP_HITキャッシュに存在したので、キャッシュから取得

TCP_MISS (http) または TCP_TUNNEL (https) ならキャッシュに存在しないのでオリジナルを参照、TCP_HIT ならキャッシュに存在するのでキャッシュを参照しています。

ところで、サーバによっては、squidのキャッシュを無視する場合があります。例えば、httpヘッダに、Cache-Control: no-storeprivate のレスポンスが含まれるケースです。
これに該当するかどうかは分からないですが、http://www.google.com はキャッシュされなかったです。
その一方で、SPEED TESTのダウンロードファイル http://speedtest.tele2.net/1MB.zip は、キャッシュが有効になりました。

恒久的にプロキシサーバを利用するように設定する方法

前述のように、環境変数の設定することで、http/httpsアクセスのときにプロキシサーバを利用するようにできます。いちいち設定が面倒な場合は、/etc/environment ファイルに以下を定義しておくと便利です。以下はbase1において、base0(192.168.2.200)をプロキシサーバとして設定する定義です。

export http_proxy=http://192.168.2.200:3128
export https_proxy=http://192.168.2.200:3128

OSのPKGインストールやupdateの場合も、プロキシサーバを利用することが可能です。その設定例を以下の通りです(base1を想定した例です)。

RHEL, Rockyの場合

/etc/dnf/dnf.conf に以下の定義を追記します。

proxy=http://192.168.2.200:3128

Ubuntuの場合

/etc/apt/apt.conf.d/95proxyies を作成し、以下の定義を記述します。

Acquire::http::Proxy "http://192.168.2.200:3128/";
Acquire::https::Proxy "http://192.168.2.200:3128/";

広告主へのリンク

おうちでLinuxやるなら、ミニPCがちょうど良いです(私はこの3台を使っています)。

コメント

タイトルとURLをコピーしました