はじめに

セキュリティ対策等でVPCからのアウトバウンドを絞りたい場合があります。最近ではAWS Network Firewallもありますが、HTTPのHostヘッダやSNIのserver_nameを変えると任意の宛先に出れてしまうようです。そのため、VPCからのアウトバウンドをより厳しく絞りたい場合、VPCにフォワードプロキシを立てます。

 

VPC内にフォワードプロキシを立てる方法は多々ありますが、EKSのFargateでSquidのフォワードプロキシを立てる方法を解説します。

Squidとは

Squid は、HTTP、HTTPS、FTP などをサポートする Web 用のキャッシング プロキシです。頻繁に要求される Web ページをキャッシュして再利用することにより、帯域幅を削減し、応答時間を改善します。Squid には広範なアクセス制御があり、優れたサーバー アクセラレータになります。Windows を含むほとんどの利用可能なオペレーティング システムで実行され、GNU GPL の下でライセンスされています。

全体像

EKS FargateでSquidのPodを動かします。このPodはVPC内部のNLBで公開します。プロキシを経由してインターネットへ出たいサービスはこのNLBのDNS名をプロキシサーバーとして指定します。Squid PodはNAT Gatewayを経由してインターネットへ出ます。

構築方法

資材はこちらのmoriryota62/squid-on-eksにも一式あります。

1. EKSデプロイ

EKSデプロイ済の場合は飛ばしてください。
Squidを動かすEKSをデプロイします。terraform/eks配下のコードでデプロイできます。terraform.tfvarsは環境に合わせて修正してください。

2. ALB Controllerデプロイ

ALB Controllerデプロイ済の場合は飛ばしてください。
Squidで内部NLBを使用するためALB Controllerをデプロイします。terraform/fargate-albおよびterraform/alb-iam-for-sa配下のコードでデプロイできます。terraform.tfvarsは環境に合わせて修正してください。
その後、k8s/alb-controller配下の手順でALB Controllerをk8sにデプロイしてください。

3. Squid用Fargate Profileデプロイ

SquidをFargateで動かすFargate Profileをデプロイします。terraform/fargate-squid配下のコードでデプロイしてください。terraform.tfvarsは環境に合わせて修正してください。

4. Dockerイメージの準備

SquidのDockerイメージを準備します。すでにビルド済のイメージとしてzakihmkc/squidがシンプルかつsquidのログを標準出力に出せるので良いと思います。自分でイメージをビルドしたい場合、image配下のDockerfileを参考にしてください。

5. Squidデプロイ

Squidをデプロイします。k8s/squid以下のマニフェストをデプロイします。configmapの値は環境に合わせて修正してください。

6. 動作確認

  1. テスト用にNginxのPodを起動します。curlコマンドが使えればNginxでなくても構いません。
    $ kubectl run nginx --image=nginx -n kube-system -l app:squid
  2. NginxのPodに入ります。
    $ kubectl exec -it nginx -n kube-system -- /bin/sh
  3. 以下のようにプロキシを指定してcurlを実行します。-xオプションでプロキシを指定します。whitelistで許可したドメインには問題なくアクセスできます。
    > curl https://www.tis.co.jp -x http://k8s-kubesyst-squid-9805ffda40-3605941818c5eae9.elb.ap-northeast-1.amazonaws.com:3128
  4. 以下のようにプロキシを指定してcurlを実行します。-xオプションでプロキシを指定します。whitelistで許可していないドメインにはアクセスできません。
    > curl https://www.google.com -x http://k8s-kubesyst-squid-9805ffda40-3605941818c5eae9.elb.ap-northeast-1.amazonaws.com:3128
  5. Nginx Podから抜けます。
    > exit
  6. 以下コマンドでSquidのログを確認します。上記アクセスした際のログが記録されています。
    $ kubectl get pod -n kube-system
    $ kubectl logs -n kube-system squid-XXXXXXXX
    ...
    2022/08/31 07:12:14| 192.168.13.79 TCP_TUNNEL/200 46966 CONNECT www.tis.co.jp:443 - HIER_DIRECT/163.44.161.163 -
    2022/08/31 07:13:05| 192.168.13.79 TCP_DENIED/403 3867 CONNECT www.google.com:443 - HIER_NONE/- text/html

     

参考記事

本ドキュメントは以下の文書を基に作成しました。

squid-cache.org http://www.squid-cache.org/

[Docker] コンテナでSquidを動かしてproxyサーバーを構築 https://zaki-hmkc.hatenablog.com/entry/2020/09/04/224822