ITの窓辺から

三流IT技術者の日常

Squidで多段プロキシ設定

Squidで多段プロキシを構成してみます。クラウドサービスのHTTPプロキシを使用する場合等、未だに多段プロキシ環境はよく見られます。クライアントには1段目のプロキシを設定し、宛先URL等によりクラウドサービスプロキシを使用させたり、ダイレクトというか1段目プロキシからアクセスさせるような構成です。クラウドサービスのプロキシのセキュリティ機能により業務上必要な通信が遮断されてしまうケースもよくあるので、こうした環境を整えておくことは必須でしょう。

環境はCentOS7、Squid3.5.2です。1段目のプロキシサーバをSquidとすることを想定した構成です。2段目のプロキシサーバとして、このCentOSをクローンしてやっつけSquidを構成しました。

基本設定

設定はシンプルです。1段目のCentOS内のsquid.confに以下の設定をします。

cache_peer <PROXY HOST> <TYPE> <HTTP PORT> <ICP PORT> <ICP OPTION>

<PROXY HOST> : 多段プロキシ先のホスト名やIPアドレスを指定します。

<TYPE> : 多段プロキシ構成とする場合、「parent」を指定します。他にも設定値はありますが今回の記事では触れません。

<HTTP PORT> : 上位プロキシの待受TCPポートを指定します。

<ICP PORT> : ICPを使用する場合にポート番号を指定します。今回は特にキャッシュサーバとしては期待しませんし、無効とするための「0」を指定します。

<ICP OPTION> : ICPを使用しないので「no-query」を指定します。

以上を踏まえて今回は下記のように設定します。

cache_peer 192.168.0.160 parent 8080 0 no-query

尚、クライアントは1段目のプロキシサーバとして192.168.0.159を指定します。2段目プロキシでは忘れずに1段目プロキシからのアクセスを受け付けるようにACLを設定します。

すべて終わったら2段目プロキシでアクセスログ監視します。

tail -f /var/log/squid/access.log

・・・全くログが出てこない。

追加設定

Squidのオフィシャルサイトのコマンドを見ていると、never_directというコマンドがありました。

http://www.squid-cache.org/Doc/config/never_direct/

説明を見る限り、never_directの設定値をallow allとすることで全てのHTTPアクセスがcache_peerで設定した上位プロキシに転送されるようになるみたいです。と書くと若干語弊があるので正確に。この設定は、プロキシ自身が直接宛先サーバに通信をしに行く必要のないものを指定するものです。書式は以下の通りです。

never_direct [allow | deny] <ACL NAME>

この設定がない場合、Squidcache_peer設定がある場合でも、必ずしも上位プロキシに転送する動作はしないことがあるようです。宛先からの応答速度等を基準として、上位プロキシより自分でアクセスしに行った方がより良いと判断すれば、自らアクセスしに行く動作とのことでした。上位プロキシがダウンしている時には助かるかもしれませんが分かりづらい。

気を取り直して、1段目のプロキシサーバのsquid.confに以下のように設定します。

 never_direct allow all

そして再度ログ監視。以下のログが確認できました。

1533048539.182 30996 192.168.0.159 TCP_TUNNEL/200 21021 CONNECT www.apple.com:443 - HIER_DIRECT/116.223.168.112 - 31/Jul/2018:23:48:59 +0900
1533048539.183 30998 192.168.0.159 TCP_TUNNEL/200 99247 CONNECT www.apple.com:443 - HIER_DIRECT/116.223.168.112 - 31/Jul/2018:23:48:59 +0900

キチンとクライアントIPアドレスが1段目のプロキシサーバのものになっています。

その他

never_directという設定が出てきましたが、always_directというコマンドもあるようです。こちらの設定はnever_directと逆にプロキシ自身が直接宛先サーバに通信しにいく必要のあるものを指定するものです。設定書式は全く同じ。

always_direct [allow | deny] <ACL NAME>

このあたりの設定を使用して宛先によるプロキシ分岐ができそうですね。次も多段プロキシに関する記事にしようと思います。