あすたぴ.dev

HAProxy,Squidを用いてProxyサーバーを建てた話し

proxy
HAProxy
Squid
プログラミング
2019/08/26 06:22:39

所要でProxyサーバーが必要だった為に構築しました。

要件としてはシンプルに以下です。環境はGCPを使用しています。

  • http(s)のリクエストをproxyできること

  • 複数のproxyサーバーを建てて分散できること

Proxyを建てる上で以下のブログのProxyの説明がとても参考になりました。
https://milestone-of-se.nesuke.com/nw-basic/grasp-nw/proxy/

httpのリクエストとhttpsのリクエストをproxyすることは同じhttpリクエストのようで、全く違いました。
違いをかんたんに書くと、httpはリクエストの中身が暗号化されていない為Proxyサーバーはリクエストを見ることが出来ますが、
httpsのリクエストは暗号化されている為中身を見ることが出来ません。
その為、単に中継サーバーとして リクエスト元のクライアントとリクエスト先のサーバーを繋ぐ役目になります。
その際に使用するのはCONNECメソッドです。
当初、Nginxでproxyサーバーが建てられるのかと思いましたが、
このCONNECTメソッドが、Nginxにはデフォルトではないようで入れるのも大変そうだったので諦めました。

そこで使用したのが Squid でした。

Squid はNginxのようなWebサーバーと違いProxyサーバーとして作られているサーバーです。
Squid はCONNECTメソッドが使用できるので特に複雑な設定を必要とせずに https のproxyをすることが出来ました。
httpsリクエストのproxyについて補足ですが、CONNECTメソッドを行う以外に自身にSSL証明書を持ち、暗号化を一度解いて、proxyサーバーがリクエスト先へ https 接続をする方式もあるようです。
少し検索するとこちらの方法をブログに書いている人が多かったです。
今回はリクエストの中身を見る必要はなく(改ざんとか情報を付与する必要がない)、単純にproxyしたかった為こちらの方式は取っておりません。

Squidはデフォルトでは 443 へのリクエストしか https の proxy ( CONNECT メソッド)を許可していない。

http_access deny CONNECT !SSL_ports

他に port を開けるのもなぁという感じだったので proxy 先をホワイトリストで管理することにした。

http_access deny CONNECT !SSL_ports
acl whitelist dstdomain "/etc/squid/whitelist"
http_access allow whitelist

whitelist はこんな感じ

*.google.com

これで Squid で https リクエストへの proxy が出来るようになったと思う。

さて、 Squid サーバーをいい感じに複数台用意しそれぞれが proxy 出来ることを確認できたら複数台の Squid へ ロードバランシングするサーバーを建てる。

当初、GCPの Cloud LoadBalancerを使用すればいけるかな、と思ったのだが
どうもヘルスチェックがうまくいかなくて諦めた。(たぶん自分の知識が浅いだけでちゃんとやればいけると思うんだけど・・・)
TCPロードバランサーでうまくいけた方いたら押してください。

それで仕方ないので自前でバランシングをすることにした。
調べてみると、HAProxyがproxyサーバーをバランシングするのがいいらしい。
というわけで HAProxyをインストールしたサーバーを建てた。

sudo apt install -y haproxy
sudo vi /etc/haproxy/haproxy.cfg

設定ファイルに以下の記述を追加する

frontend http-in
	bind *:80
	default_backend proxys

backend proxys
	balance roundrobin
	server proxy1 xxx.xxx.xxx.x:xxxx
	server proxy2 xxx.xxx.xxx.x:xxxx

これは HAProxy 自体は 80 ポートで listen すること。
backendとして proxys という backend を指定
proxys は バランシングの方式としてラウンドロビン(デフォルト)を選択。
ラウンドロビンは単純に1リクエストごとにサーバーを切り替えるバランシング方式。
そのあとに、SquidでたてたサーバーのIPアドレスを記載する。

sudo /etc/init.d/haproxy restart
sudo /etc/init.d/haproxy status

これで 設定は終わり。
あとは HAProxyの 80 ポートで proxy のリクエストを送り、Squidを通ってリクエストが proxy されることが確認できればOK。

Copyright © astapi