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
この行は、それぞれ以下の意味を持ちます。
| ufs | ufs は 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_TUNNEL | CONNECT メソッドでトンネルを確立。HTTPSの場合は、Squid は暗号化通信の中身を見ず、単にトンネル(双方向通信)を確立して中継する。 |
| TCP_HIT | キャッシュに存在したので、キャッシュから取得 |
TCP_MISS (http) または TCP_TUNNEL (https) ならキャッシュに存在しないのでオリジナルを参照、TCP_HIT ならキャッシュに存在するのでキャッシュを参照しています。
ところで、サーバによっては、squidのキャッシュを無視する場合があります。例えば、httpヘッダに、Cache-Control: no-store や private のレスポンスが含まれるケースです。
これに該当するかどうかは分からないですが、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台を使っています)。


コメント