Upgrade to Pro — share decks privately, control downloads, hide ads and more …

GoでTCP Proxyを実装してみよう

Kurochan
January 16, 2024

GoでTCP Proxyを実装してみよう

社内勉強会でLTした時の資料です

Kurochan

January 16, 2024
Tweet

More Decks by Kurochan

Other Decks in Technology

Transcript

  1. WireGuardとOpenID Connectの連携 • 実装してみて、 一 応動いたが… • 便利だったようで 一 気に数

    十人 使うようになった • 実装に必要な前提知識が意外と多くてメンテを誰かに引き継げる気がしなかった • WireGuard、OIDC CIBA Flow、nftables、netlink、Go 言 語でのこれらの動的操作 • 固定IPだけに頼るのはイケてない • せっかく社内に内製IdPがあるので柔軟な認可の制御もしたい • VPC内アクセスとかもしたい
  2. 脱WireGuard • WireGuardの導 入 によって開発プロジェクト 用 のVPNの需要は把握 • もっとやりたいことが増えてきた •

    通信先によってアクセス元IPアドレスを変えたい • 人 や役割によってアクセス可否を変えたい(認可をちゃんとやりたい) • 通信先によってVPNを切り替えるのが 面 倒 • ちょうどいい製品を探し始めた
  3. Cloud fl are Zero Trust • いろんな機能があって充実している • アイデア次第で 色

    々できそう • その分最初は使い 方 を迷うかも…? • スマホ対応は必須だった • スマホアプリの開発で開発環境のAPIのアクセス制御もしたいのでブラウザ対応だけではダメ • APIで操作するためのクライアントライブラリが公式で 用 意されている • https://github.com/cloud fl are/cloud fl are-go • 安い!!!!!! • $ 8 /user • 現在90ユーザ使っているので、 $8 x 9 0 = $ 720 /month • 通信量課 金 なし!!!!!!
  4. cloud fl aredに中継する • cloud fl aredで100.64.0.1をlistenする • Cloud fl

    are Zero Trustの設定で100.64.0.1/24をcloud fl aredに転送する • nginxで本来の宛先にTCP Proxy
  5. cloud fl aredに中継する • cloud fl aredで100.64.0.1をlistenする • Cloud fl

    are Zero Trustの設定で100.64.0.1/24をcloud fl aredに転送する • nginxで本来の宛先にTCP Proxy ↑↑今回の本題!↑↑
  6. Acceptするループ • "accept()"するループはgoroutineで独 立 させる • 後述する終了処理のため • 無限ループしてコネクションを待ち受ける •

    コネクションが貼れたら別のgoroutine(p.handleConn())に処理させる • Acceptのループでコネクションを処理すると新規のコネクションが受けつけられない!
  7. TCP Clientの実装 • サーバ側に 比 べると仕事が少ない • コネクションは最 大 でも10分に限定

    • コネクションのリーク防 止 • 10分で切られて困る場合はもう少し丁寧に実装する
  8. おわり • 思ったより簡単なことが伝わるはず(?) • goroutineがあるおかげで難しいことを考えずある程度のパフォーマンスが出る • OSのネイティブスレッドで同じような処理をするとオーバーヘッドがきついかも • 何かしら並 行

    処理っぽい実装をすることになるはず • errgroupを使うことでgoroutine leakしにくい実装に • errgroup経由で作成したgoroutineが全て終了しないとシャットダウンできないように実装するため