Hateburo: kazeburo hatenablog

SRE / 運用系小姑 / Goを書くPerl Monger

TCP over WebSocket & IAP

Googlehuproxyみたいなもので、任意のprotocolが通しやすく、Google Cloud Load BalancingのIdentity aware proxyに対応したものが欲しかったので、作ってみた。

github.com

github.com

GCPの中のMySQLに対して、service accountで認証して接続するイメージとしては以下のようになる。

f:id:kazeburo:20181022164001p:plain

server側

pathとforward先の設定を行うmapファイルをまずつくる

mysql,10.0.x.x:3306
ssh,127.0.0.1:22

起動

$ wsgate-server --listen 0.0.0.0:8080 --map map-server.txt

これで、

ws://example.com/proxy/mysql にWebSocketで通信を行うと 10.0.x.xの3306 に対してforwardするproxyが起動する

client側

serverと同じようにmapファイルをつくる。今度はportと行き先のurl

127.0.0.1:8306,https://example.com/proxy/mysql
127.0.0.1:8022,https://example.com/proxy/ssh

起動

$ wsgate-client --map map-client.txt

これで各サーバにログインできるようになる。

# mysql
$ mysql -h 127.0.0.1 --port 8306 --user ...

# ssh
ssh -p 8022 user@127.0.0.1

IAPを使う場合

Google Cloud Load Balancing を設定し、IAPを有効にする。 WebSocketを使う場合、timeoutを長くするのがおすすめ

f:id:kazeburo:20181022164955p:plain

クライアント側は、service accountのJSONファイルと、OAuth2のClient IDを指定して起動する

$ wsgate-client --map map-client.txt --iap-credential=/path/to/json --iap-client-id=foo.bar

これで、service accountで認証しつつ、任意のサーバと通信ができるようになる。

この他、wsgate-server, wsgate-clientには簡単な公開鍵認証と、任意のヘッダがつけれる仕組みがあるので、認証しつつ任意のプロトコルで通信することが簡単に実現できる。

TCP over WebSocket、去年の夏にインターンに来てくれた若者がアイディアを出してくれて、それ以降少しずつ使っているところが増えている。便利