【入門】Squid とは?proxy サーバーの構築方法を紹介

Squid

Squid とは、「プロキシ」と「リバースプロキシ」のサーバー機能を持つソフトウェアです。

プロキシサーバー

プロキシサーバーとは、クライアントの代わりに外部サーバーにアクセスするサーバーです。

リバースプロキシサーバー

リバースプロキシサーバーとは、外部からのアクセスを内部サーバーに転送するサーバーです

スポンサーリンク

初めに

「Web/アプリケーション/プロキシ/API」サーバー構築シリーズのプロキシサーバー編です。

その他の記事については、以下の記事をご覧ください。

スポンサーリンク

Squid の用途

Squid、つまりプロキシやリバースプロキシサーバーを置く理由は以下のとおりです。

プロキシサーバーを置く理由

クライアントの次にプロキシサーバーを置く理由は、主に以下の3つです。

  • セキュリティの向上 (フィルタリング)
  • キャッシュサーバーとして利用 (レスポンスの高速化)
  • 踏み台サーバー (プライベートネットワークにいるクライアントから、パブリックネットワークにいるプロキシを経由してインターネットにアクセス)

リバースプロキシサーバーを置く理由

リバースプロキシサーバーをバックエンドサーバーの前段に置く理由は、主に以下の5つです。

  • キャッシュサーバーとして利用 (レスポンスの高速化とバックエンドサーバーの負荷を軽減)
  • レスポンスを圧縮 (レスポンスの転送を高速化)
  • SSL ターミネーション (暗号化や復号化の処理をリバースプロキシにオフロード)
  • セキュリティの向上 (リバースプロキシでフィルタリング、バックエンドサーバーを隠蔽)
  • 拡張性 (クライアントはリバースプロキシと通信するので、バックエンドサーバーを変更可能)

なお、レスポンスを生成してクライアントに返すまでの時間を短縮する、上3つ方法を Web アクセラレーションと言います。

スポンサーリンク

Squid の使い方

Squid の以下の4つについて説明します。

プロキシの設定

まずは Squid をプロキシサーバーとして稼働させます。

sudo yum -y install squid
sudo systemctl start squid

プロキシを利用する別のホストで http_proxy 環境変数を設定します。

赤線箇所は Squid サーバーのプライベート IP アドレスを入力してください。

export http_proxy=http://192.0.2.1:3128
curl www.google.com --head
HTTP/1.1 200 OK
Via: 1.1 ip-192-0-2-1.ap-northeast-1.compute.internal (squid/3.5.20)

Squid サーバー 192.0.2.1 を経由して www.google.com へのアクセスに成功したことがわかります。

Squid の設定ファイル

Squid の設定ファイル(/etc/squid/squid.conf)でよく利用するディレクティブは、以下のとおりです。

ディレクティブ説明
aclACL(Access Control List)を定義
書式は「acl <name> <type> <argument> 」
http_accessACL を許可 or 拒否
http_portlisten ポートを指定

例えば、初期設定の一部は以下の意味となります。

acl localnet src 10.0.0.0/8     # RFC1918 possible internal network
acl Safe_ports port 80          # http
http_access deny !Safe_ports #ACL 名が Safe_ports (port 80)以外は拒否
http_access allow localnet #ACL 名が localnet (10.0.0.0/8)は許可
http_access deny all #上記以外の条件は全部拒否
http_port 3128 #3128 ポートで listen

ディレクティブの一覧は以下のドキュメントにあります。

squid : Optimising Web Delivery

Basic 認証の設定

Squid に Basic 認証を設定します。

sudo yum -y install httpd-tools

hoge ユーザーで Basic 認証用のファイルを作成します。パスワードは「test」で検証します。

sudo htpasswd -c /etc/squid/.htpasswd hoge
New password: 
Re-type new password:
sudo vim /etc/squid/squid.conf

設定ファイルの一番上に以下を記載します。

auth_param basic program /usr/lib64/squid/basic_ncsa_auth /etc/squid/.htpasswd
acl password proxy_auth REQUIRED
http_access allow password
sudo systemctl restart squid

http_proxy 環境変数 (http://192.0.2.1:3128) を設定した別のホストを利用して、プロキシ経由で www.google.com にアクセスします。

curl www.google.com --head
HTTP/1.1 407 Proxy Authentication Required

設定したとおり、Basic 認証をしないとプロキシを通過できなくなりました。

次に Basic 認証情報 http_proxy 環境変数に含めます。

赤線箇所はプロキシのプライベート IP アドレスに変更します。

export http_proxy=http://hoge:test@192.0.2.1
curl www.google.com --head
HTTP/1.1 200 OK
Via: 1.1 ip-172-31-41-193.ap-northeast-1.compute.internal (squid/3.5.20)

http_proxy 環境変数に Basic 認証を含めたのでリクエストが成功しました。

リバースプロキシの設定 (アクセラレータ)

Squid にリバースプロキシの設定をします。

まずは、転送先のホストで Web サーバーを起動しておきます。

今回は Web サーバーnginx を利用します。nginx の詳細は以下の記事でまとめています。

sudo amazon-linux-extras install nginx1 -y
sudo systemctl start nginx

次に Squid の稼働するホストで以下の設定をします。

sudo vim /etc/squid/squid.conf

赤線箇所は Web サーバー (nginx) の稼働するホストの IP アドレスを入力します。

http_port 3129 accel
cache_peer 192.0.2.2 parent 80 0 no-query originserver

http_port の後ろに "accel" をつけるとアクセラレータ(リバースプロキシ)となります。

cache_peer で転送先の Web サーバーの設定をします。

sudo systemctl restart squid
curl hoge:test@localhost:3129 --head
HTTP/1.1 200 OK
Server: nginx/1.20.0
Via: 1.1 ip-192-0-2-1.ap-northeast-1.compute.internal (squid/3.5.20)

Squid サーバー (192.0.2.1) を経由して、nginx サーバー (192.0.2.2) に到達できたことを確認できました。

関連記事

サーバー構築シリーズの続きは以下のとおりです。