技術メモなど

ほぼ自分用の技術メモです。

Squidで特定ドメインまたはURLの場合のみ上位プロキシを通し、それ以外は上位プロキシを通さない振り分け設定

Squidで特定のドメインの場合は指定した上位プロキシ経由でアクセスし、それ以外は上位プロキシを通さず自身でアクセスするようにする設定です。また、アクセス方法がHTTPSでなく平文のHTTPである場合のみ、特定のURLで振り分けることも可能です。

クラウドの業務システム向け通信は上位プロキシ、それ以外のインターネット向け通信は全て自プロキシ、といったことが実現できます。

検証はSquidのバージョン3.5で行っています。

なお、多段プロキシ構成で特定ドメインまたはURLで上位プロキシを振り分ける設定の場合は以下のページにまとめています。

takeda-h.hatenablog.com

概要

/etc/squid/squid.confに次の通り記載。

  • cache_peerに上位プロキシを定義。
  • aclに振り分けたい特定ドメインを定義。
  • cache_peer_accessに振り分けたい特定ドメインを定義したaclと経由したい上位プロキシを定義したcache_peerを紐付け。
  • never_direct allow acl_name, always_direct deny acl_name, always_direct allow allを記載すると、aclに当てはまらない通信は全て上位プロキシを経由せず自身でアクセスするようになる。

設定例

構成

多段プロキシ構成は以下の通りとします。上位プロキシには振り分けに関する設定は不要で、全て下位プロキシ側に設定することになります。

プロキシサーバ ホストと待受けポート
Aプロキシ(特定ドメインまたはURLの場合経由させたい上位プロキシ) system-proxy.example.com:3128
Bプロキシ(クライアント側に設定しているプロキシ〔下位プロキシ〕) client-proxy.example.com:8080

下位プロキシ側(Bプロキシ)の設定

コンフィグ例

/etc/squid/squid.confに以下の通り追記(または変更)します。

# 上位プロキシの定義
# Aプロキシ(特定ドメインまたはURLの場合経由させたい上位プロキシ)
cache_peer system-proxy.example.com parent 3128 0 no-query

# 振り分けたい特定ドメイン・URLの定義
# 振分け対象ドメイン
acl system-domain dstdomain "/etc/squid/system-domain.acl"
# 振り分け対象URL(ただしHTTPSだとURLで振り分けることはできないのでドメインで振り分けるしかない)
acl system-url url_regex "/etc/squid/system-url.acl"

# 振分け対象特定ドメイン・URLとAプロキシの紐付け
cache_peer_access system-proxy.example.com allow system-domain
cache_peer_access system-proxy.example.com allow system-url

# 振分け対象特定ドメイン・URL以外は全てBプロキシ(自分自身)経由にする
never_direct allow system-domain
never_direct allow system-url
always_direct deny system-domain
always_direct deny system-url
always_direct allow all

ポイントは、

  • never_direct allowとalways_direct denyの両方にACLをセットで設定する必要があること。
  • 最後にalways_direct allow allをすること。

です。

振分け対象ドメインの指定

振り分けたい特定ドメインをここではsystem-domainという名前(名前は任意で大丈夫)のaclに定義しています。

acl system-domain dstdomain "/etc/squid/system-domain.acl"

dstdomainの後に対象ドメインをベタ書きしてもいいのですが、メンテしやすいよう/etc/squid/system-domain.aclというテキストファイルを作成し、対象ドメインを列記するようにします。

/etc/squid/system-domain.aclの内容は次の通りです。振り分けたい特定ドメインがsystem01.example.comというドメインと、system02.example.comサブドメインという想定です。

system01.example.com
.system02.example.com

振分け対象URLの指定

同様に、振り分けたい特定URLをsystem-urlという名前のaclに定義しています。/etc/squid/system-url.aclというテキストファイルを作成し、対象URLを列記するようにします。

acl system-url url_regex "/etc/squid/system-url.acl"

ポイントは、aclのurl_regex対象URLを正規表現で記載できることです。dstdomainの方は正規表現は使えないので注意です。

ただし、HTTPSの場合はURLでの振分けは使えません。後で検証の際にSquidaccess.logを見れば分かるのですが、HTTPSの場合、クライアントと通信先サーバとの間で暗号化されているので参照先URLがSquidからは見えないためだと思われます。

/etc/squid/system-url.aclの内容は次の通りです。振り分けたい特定URLがhttp://system03.example.com/maintener/以下という想定です。

^http://system03\.example\.com/maintener/.*$

設定の反映

コンフィグに誤りがないことが確認できたら、Bプロキシのsquidサービスをリロード(または再起動)します。

# systemctl reload squid

振分けができているか確認

期待した通りに振分け設定ができていれば、Bプロキシのaccess.logには次のようなログが出力されます。

651285320.368 1663 198.51.100.123 TCP_TUNNEL/200 3878 CONNECT system01.example.com:443 - FIRSTUP_PARENT/192.0.2.1 -

上位プロキシ側は次のようなログが出力されます。

651285320.370  1441 192.0.2.1 TCP_TUNNEL/200 3139 CONNECT system01.example.com:443 - HIER_DIRECT/203.0.113.200 -