Squid単体をWindows上で起動する手順について書きました。今回は同様にSquidをWindowsで起動させ、フォワードプロキシとリバースプロキシを同時に動かす方法についてメモします。リバプロもプロセス分離もこれまたドキュメント少なくて大変でした。リバプロのコンフィグなんてほぼフルスクラッチだよ。上記を評価環境とします。お勉強のために実際にグローバルIPアドレスを払い出してもらうわけにはいかないので、評価用クライアントPCからのアクセスはインターネットからのアクセスだと仮定するものとします。プロキシサーバとWebサーバの実体は評価用クライアントPCのVirtualBox上で動いているVMです。2016+Squidで、WebサーバはCentOS7.3+httpdです。2016に仮想NICを割り当てます。内部LANはホストオンリーアダプタ+プロミスキャスモードで仮想LANとして作成し、仮想NICを3台のサーバすべてに割り当てます。Squidによるリバースプロキシこのように、インターネットから直接アクセスできない内部LANに存在するWebサーバへのアクセスを、DMZに存在するリバースプロキシが代理で行えるよう構成します。振り分け方法はいろいろあるのですが、今回はホスト名orIPアドレスに続くパス(AAA、BBB)で振り分けることにします。Webサーバの準備(リバースプロキシ用)Webサーバとしてhttpdを構築済みとします。配信するサンプルコンテンツをWebサーバ2台で以下のように作成。これで各Webサーバにアクセスしたとき、そのホスト名が表示されるページが作成できます。squid_reverse.confリバースプロキシの設定ファイルです。設定ファイルはリバースとフォワードで分けたいため、デフォルトのsquid.confから変更して作成します(1で後述)。!dmz#WebサーバAAAへの振り分け設定。Found</h1>」とだけ書いて配置しました。パスによる振り分け設定について以下だけクローズアップします。all12345まず、urlpath_regexでaclを定義します。これはurlのホスト名以下のパスを正規表現で定義できるaclです。」はパスが「/AAA/」で始まるものという意味で、「^/AAA$」はパスが「/AAA」に完全一致するものという意味です。この二つで指定せんと例えば「/AAAAAA/hoge.piyo」なんてパスでもAAAにアクセスできちゃいます。acl行で複数条件を記述すると、OR条件で判断されます。name=serverAAA」で以下の設定をします。192.168.56.202:リバプロ先のIPアドレスparent:リバプロ先が単体の親サーバだと指定(siblingでキャッシュを共有する並列プロキシサーバ、multicastで同内容を複数サーバにリバプロ)80;80番ポートに転送0:ICPを無効化(キャッシュを共有するプロトコル。AAA」で、AAAのaclに当てはまるものはserverAAAへのリバプロを許可し、それ以外は拒否します。BBBも同内容で作成。コンフィグは終わったので起動できますが、その前にフォワードプロキシのコンフィグを作成します。Squidによるフォワードプロキシ今度はフォワードプロキシ。内部LANからインターネットへは直接アクセスできないので、プロキシサーバに代理アクセスをお願いするよう構築します。その際、あらかじめホワイトリスト方式で定義されたドメインにしかアクセスできないようにします。今回はgoogle.comドメインのみ許可します。スクリプトで環境変数を設定します。このディレクトリはbash起動時に読まれます。no_proxy="127.0.0.1,localhost"123456以下のコマンドでbash環境を再読み込みし、環境変数がセットされたか確認。squid_forward.conf内部LANからのホワイトリスト記載のドメインのフォワード要求のみ許可。内部情報が洩れる内部IPアドレスやHTTPヘッダは隠します。13123456789101112131415161718192021222324252627282930以上でリバプロとフォワプロの設定完了。Squidを起動します。Squid複数プロセスを分けて同時起動するフォワードプロキシとリバースプロキシを同時に動かしたい場合、これを一つのサーバプロセスでやると、片方こけたときに逆側の通信もできないなんてことになります。保守運用性を考え、プロセスはなるべく小さく分割します。そのためにやることは以下。1設定ファイルの分離squidの設定ファイルはsquid.confがデフォルト値です。フォワード用、リバース用に設定は分けたいので別名ファイルを作成します。今回はsquid_forward.confとsquid_reverse.confというファイル名にしました。複数プロセスで動かそうと思ったらまずはpidを分けねばなりません。Squidはテキストファイルを作成し、そのファイルに現在起動中のSquidプロセスのpidを記載することで管理しています。このpidファイル名・配置場所をコンフィグファイルで指定することで、pidを分けます。squid_forward.confとsquid_reverse.confに以下を記載します。/var/run/${service_name}.pid1${service_name}は変数。後述のnオプションで指定した値が入ります。3異なるvisible_hostnameをつける複数プロセスを立ち上げる場合は、squidのホスト名も分けます。キャッシュが競合したり、設定によっては通信がループすることもあるとか。4起動時のnオプションプロセスをOSに判別してもらうために、起動時にはnオプションでユニークな名前を付けます。これが先述の${service_name}に読み込まれます。プロキシサーバにて4のコマンドを実行。真っ黒なコマンドプロンプトの画面が二つ出てきたら完了。インターネットからのリバプロアクセス評価用クライアントPCからプロキシサーバへアクセスします。プロキシサーバ自体へパスをつけずアクセス。allで変更しているのでこうなります。つづいてWebサーバAAAにアクセス。hostnameが表示されています。WebサーバBBBも同様。変なパスをつけてもきちんと404返します。インターネットへのフォワプロアクセスWebサーバAAAからcurlコマンドでアクセスしてみます。ホワイトリストには「.google.com」とのみ記載してあります。HREF="https://www.google.co.jp/?gfe_rd=cr&dcr=0&ei=3tm0WcruKOnC8gfB3YzgDA">here</A>.</BODY></HTML>1234567302でアクセスはできていることがわかります。CONNECT12ホワイトリストには記載していないyahoo.comへのアクセスはこのようにSquidで403ではじかれます。複数サーバが連動するシステムをつくりました。vagrantによる環境構築自動化でかなり労力を削減できていて気持ちがいい。Squidは他のプロキシサーバと比較してキャッシュができるのが良い点です。今回の要件ではキャッシュをしません。Squidの悪い点としてはSquidそのものはWebサーバの機能を持たないことです。特定パスにGET打って200帰ってくるかどうか見るみたいなL7レイヤのヘルスチェックができず、L4レイヤでポート監視しかできません。お前それnginxでよくねってこと。