未完 Squid on Cloud Run
目的: GKE で一部の通信だけ outgoing ip を固定したい
GKE で IP 固定する際の正道
限定公開クラスタを作り Cloud NAT を割り当てる
オペレーションのためマスターノードへの経路を確保する
マスカレードエージェント(よく知らない)
モチベーション
出口 IP を固定したいのはワークロードのごくごく一部
Cloud NAT 全通しは Cloud NAT の通信コストがかかる
とはいえ普通にゲートウェイサーバーを維持するより Cloud NAT 使うほうが大抵は安いだろう
普通に維持せず激安に済ませたい
クラスタ作り直すのが面倒
作業自体はさほどの手間ではないが...
ごくごく一部のために全体の構成に影響を出したくなくて、局所的に解決したい
Cloud Run で立てる
作業ログ
ローカルで squid コンテナ立ててみる
$ docker run --rm --publish 3128:3128 --volume $PWD/cache:/var/spool/squid sameersbn/squid:3.5.27-2
デフォルトだと http_access deny all なのかな? 諦めてちょっと設定書く
code:squid.conf
acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl localnet src fc00::/7 # RFC 4193 local private network range
acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines
acl SSL_ports port 443
acl CONNECT method CONNECT
http_access deny CONNECT !SSL_ports
acl Safe_ports port 80
acl Safe_ports port 443
http_access deny !Safe_ports
http_access allow localnet
http_access allow localhost
http_access deny all
http_port 3128
acl NOCACHE src all
cache deny NOCACHE
logfile_rotate 0
cache_log stdio:/dev/stdout
access_log stdio:/dev/stdout
cache_store_log stdio:/dev/stdout
pid_filename /var/run/squid/squid.pid
code:Dockerfile
FROM sameersbn/squid:3.5.27
RUN mv /etc/squid/squid.conf /etc/squid/squid.conf.default
COPY squid.conf /etc/squid/squid.conf
RUN mkdir -p /run/squid \
&& chown proxy:proxy /run/squid
USER proxy
うまくいってそう
curl -x http://localhost:3128 で https もとおるんだな
Cloud Run にデプロイしたい
GKE やその他同プロジェクトから叩く時 localnet になるんだろうか
デフォルトネットワークは localnet に入っていると思うけど、なんとか.run で解決されてどうなるのか
まあ一旦気にせずデプロイしてみるか
$ gcloud --project=pokutuna-playground builds submit --tag gcr.io/pokutuna-playground/squid:latest
2021/04/07 19:02:45| ARP query 169.254.8.129 failed: eth1: (25) Inappropriate ioctl for device
icmp_sock: (1) Operation not permitted
CONNECT に対応してない?
は Squid のエラーページ見れる
は手前の LB で 400 返ってる感じがある
TRACE とかは 405 返るな
これって Squid のネットワーク制限が返しているのかな?
一旦全公開でやってみるか
squid 起動時に Inappropriate ioctl for device が出ている
acl CONNECT method CONNECT これの意味も気になる
生で見てみるか...
$ openssl s_client -connect squid-test-b7slekzztq-an.a.run.app:443
GET https://squid-test-b7slekzztq-an.a.run.app/ HTTP/1.1 自体はできる
squid のエラーページが返る
CONNECT は 404 が返る
とかで見た時にも 400 になっている
proxy リクエストの GET にパスではなく schema からの URL がきたり、Host ヘッダで LB が弾いているのかなあ
むりくり Host セットして投げても 404 だな
code:host
Host: squid-test-b7slekzztq-an.a.run.app
うごかない
Cloud Run は CONNECT method に対応してない
Google の LB (Server: Google Frontend) が Host ヘッダとリクエスト先が異なるものはルーティングしない/弾く
code:req
Host: squid-test-b7slekzztq-an.a.run.app
みたいな GET が path でないリクエストは通る
まあそうか...という感じ
Cloud Run FAQ リポジトリの話題
nginx で forward proxy 立てる話
透過的なリクエストは諦めて、envoy を Cloud Run で動かして特定のワークロードだけそこむけるとか...