Skip to content

Squid で多段プロキシを構成する

Squid は多段にし、例えば「ローカルネット宛の通信は上位プロキシへ転送しない」「その他の通信は上位プロキシへ転送する」といった設定が可能です。 今回はこういった場合の設定例をメモしておきます。 検証は Ubuntu 22.04LTS で行いました。

構成

以下の構成で検証しました。

file

Squid のインストール

Squid1 と Squid2 へ squid をインストールしていきます (ややこしい)。

Squid1 & Squid2

apt でインストールするだけです。 インストール直後から Squid のサービスは開始されていました。

1
apt -y install squid apache2-utils

Squid の設定

Squid を設定していきます。

Squid1

1 段目の Squid を設定します。 cache_peer の設定により、上位プロキシを参照させます。 但し、localdst (ここではプライベートアドレスを定義) に対しては `always_direct allow localdst を指定し、上位プロキシを経由させず、1 段目のプロキシでそのままインターネットアクセスさせます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
cat << EOF > /etc/squid/squid.conf
acl localsrc src 10.0.0.0/8
acl localsrc src 172.16.0.0/12
acl localsrc src 192.168.0.0/16

acl SSL_ports port 443
acl Safe_ports port 80
acl Safe_ports port 443
acl CONNECT method CONNECT

http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localsrc
include /etc/squid/conf.d/*.conf
http_access deny all

acl localdst dst 10.0.0.0/8
acl localdst dst 172.16.0.0/12
acl localdst dst 192.168.0.0/16
always_direct allow localdst
cache_peer 10.0.0.3 parent 8080 7 no-query
never_direct allow all
never_direct allow CONNECT

http_port 8080

cache deny all

httpd_suppress_version_string on
visible_hostname unknown
forwarded_for off
coredump_dir /var/spool/squid
EOF

Squid2

目立った特徴の無い設定をしています。 下記では送信元を localsrc (プライベートアドレスを定義) としていますが、場合によっては「1 段目のプロキシのみ、許可する」という設計も有り得ると思われます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
cat << EOF > /etc/squid/squid.conf
acl localsrc src 10.0.0.0/8
acl localsrc src 172.16.0.0/12
acl localsrc src 192.168.0.0/16

acl SSL_ports port 443
acl Safe_ports port 80
acl Safe_ports port 443
acl CONNECT method CONNECT

http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localsrc
include /etc/squid/conf.d/*.conf
http_access deny all

http_port 8080

cache deny all

httpd_suppress_version_string on
visible_hostname unknown
forwarded_for off
coredump_dir /var/spool/squid
EOF

Squid の再起動

Squid1 と Squid2 の両方で Squid を再起動し、設定変更を反映しておきます。

1
systemctl restart squid.service

通信テスト

グローバルアドレスに対する通信

クライアントから 1 段目のプロキシを参照し、グローバルアドレス宛の通信を行うと「クライアント → Squid1 → Squid2」と多段にアクセスが行われます。

file

プライベートアドレスに対する通信

クライアントから 1 段目のプロキシを参照し、プライベートアドレス宛の通信を行うと「クライアント → Squid1」というトラフィックフローとなり、Squid2 は経由しません。

file