Squid で多段プロキシを構成する
Squid は多段にし、例えば「ローカルネット宛の通信は上位プロキシへ転送しない」「その他の通信は上位プロキシへ転送する」といった設定が可能です。 今回はこういった場合の設定例をメモしておきます。 検証は Ubuntu 22.04LTS で行いました。
構成
以下の構成で検証しました。
Squid のインストール
Squid1 と Squid2 へ squid をインストールしていきます (ややこしい)。
Squid1 & Squid2
apt でインストールするだけです。 インストール直後から Squid のサービスは開始されていました。
| 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 を再起動し、設定変更を反映しておきます。
| systemctl restart squid.service
|
通信テスト
グローバルアドレスに対する通信
クライアントから 1 段目のプロキシを参照し、グローバルアドレス宛の通信を行うと「クライアント → Squid1 → Squid2」と多段にアクセスが行われます。
プライベートアドレスに対する通信
クライアントから 1 段目のプロキシを参照し、プライベートアドレス宛の通信を行うと「クライアント → Squid1」というトラフィックフローとなり、Squid2 は経由しません。