Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
GoでTCP Proxyを実装してみよう
Search
Kurochan
January 16, 2024
Technology
1.4k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
GoでTCP Proxyを実装してみよう
社内勉強会でLTした時の資料です
Kurochan
January 16, 2024
More Decks by Kurochan
See All by Kurochan
ABEMAのバグバウンティの取り組み
kurochan
1
1.1k
2026年の個人的テーマ: 「計算機を燃やせ🔥」
kurochan
1
190
つなぐ、届ける、変える- コンテンツ配信の最前線ト——ク
kurochan
0
170
サイバーエージェント流クラウドコスト削減施策「みんなで金塊堀太郎」
kurochan
4
3.3k
AWS Elemental MediaPackageと格闘🤼
kurochan
2
140
サイバーエージェントでのSlack活用事例 @ 2025
kurochan
5
280
15年入社者に聞く! これまでのCAのキャリアとこれから
kurochan
1
400
入門 電気通信事業者
kurochan
13
5.9k
AWS x さくらのクラウドのハイブリッドクラウドによる安価なフレッツ閉域網接続の実装
kurochan
9
6.4k
Other Decks in Technology
See All in Technology
1000⼈規模のClaude Enterprise運⽤を「Oktaのグループ」と「Slack」に集約する
sansantech
PRO
1
530
AI駆動開発をチームに根付かせる - 「1行も書かない」チームがHarnessを育てた1年 -
kenichirokimura
6
3.5k
Digital Credentials API × OpenID4VP ブラウザ完結型本人確認の実装知見(OAuth/OIDC Numa (Immersion) Workshop 2026)
oidfj
PRO
0
380
OAuth SPIFFE Client Authentication(OAuth/OIDC Numa (Immersion) Workshop 2026)
oidfj
PRO
0
400
研究開発部の紹介 / Sansan R&D Profile
sansan33
PRO
4
25k
IHV like なユースケースへのOpenID Connect 関連仕様の適用事例
optim
0
410
【5分でわかる】セーフィー エンジニア向け会社紹介
safie_recruit
0
54k
[RSJ26] Flow as Flow: Modeling Robot Velocity Fields as Probability Velocity Fields
keio_smilab
PRO
0
160
tamachi.goを支える技術
rymiyamoto
0
120
Data Hubグループ 紹介資料
sansan33
PRO
0
3.2k
パスキーでドライブする アカウント統合(OAuth/OIDC Numa (Immersion) Workshop 2026)
oidfj
PRO
0
410
Claude Teamプランの コスト最適化を考える
rfdnxbro
2
840
Featured
See All Featured
Visualization
eitanlees
152
17k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
550
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.3k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
440
How to train your dragon (web standard)
notwaldorf
97
6.8k
Site-Speed That Sticks
csswizardry
13
1.5k
Marketing to machines
jonoalderson
1
5.7k
Typedesign – Prime Four
hannesfritz
42
3.2k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.6k
Chasing Engaging Ingredients in Design
codingconduct
0
290
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.5k
Code Reviewing Like a Champion
maltzj
528
40k
Transcript
GoでTCP Proxyを実装してみよう 株式会社サイバーエージェント AI事業本部 黒崎 優太 (@kuro_m 88 ) CA.go
LT会
ࠇ࡚ ༏ଠ גࣜձࣾαΠόʔΤʔδΣϯτ AIࣄۀຊ෦ @kurochan @kuro_m88 αΠόʔΤʔδΣϯτ CTO౷ׅࣨ
TCP Proxyを作った背景
TCP Proxyを作ったきっかけ https://speakerdeck.com/kurochan/securing-development-environments-using-cloud fl a 7
WireGuardとOpenID Connectの連携 https://speakerdeck.com/kurochan/wireguardtoopenid-connectfalselian-xi-wogoteshi-zhuang-sitemita
WireGuardとOpenID Connectの連携 • 実装してみて、 一 応動いたが… • 便利だったようで 一 気に数
十人 使うようになった • 実装に必要な前提知識が意外と多くてメンテを誰かに引き継げる気がしなかった • WireGuard、OIDC CIBA Flow、nftables、netlink、Go 言 語でのこれらの動的操作 • 固定IPだけに頼るのはイケてない • せっかく社内に内製IdPがあるので柔軟な認可の制御もしたい • VPC内アクセスとかもしたい
脱WireGuard • WireGuardの導 入 によって開発プロジェクト 用 のVPNの需要は把握 • もっとやりたいことが増えてきた •
通信先によってアクセス元IPアドレスを変えたい • 人 や役割によってアクセス可否を変えたい(認可をちゃんとやりたい) • 通信先によってVPNを切り替えるのが 面 倒 • ちょうどいい製品を探し始めた
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 • 通信量課 金 なし!!!!!!
Cloud fl are Zero Trustの導 入 • 構成の概要
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
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 ↑↑今回の本題!↑↑
TCP Proxyを実装してみよう
TCP Proxyとは • 中継するもの、 土 管(パイプ)みたいなイメージ
もうちょっと掘り下げる • Proxy 自身 もサーバとクライアントから構成されていることがわかる
TCP Server
TCPの3-Way Handshake • Wikipediaより • 基本的にはOS側で処理してくれるので、アプリを実装する 人 は コネクションを"accept()"すればいい
もうちょっと掘り下げる • OS側でACK状態になっている通信をアプリでAcceptすることを繰り返す
もうちょっと掘り下げる • サーバは複数コネクション 生 成すれば複数クライアントと同時に通信可能
TCP Serverの実装 • みていきましょう
Listen 終了処理 Acceptするループ
Listen • 特定のポートをTCPで待ち受ける(acceptできる状態にする) • contextをとらないので終了処理を実装する必要アリ
Acceptするループ • "accept()"するループはgoroutineで独 立 させる • 後述する終了処理のため • 無限ループしてコネクションを待ち受ける •
コネクションが貼れたら別のgoroutine(p.handleConn())に処理させる • Acceptのループでコネクションを処理すると新規のコネクションが受けつけられない!
終了処理 • contextがキャンセルされたら新規にacceptできないようにする • 新規にacceptできないだけで既に確 立 したコネクションはそのまま • Acceptするループはこれによりaccept()不能になるため、 •
エラーになってループを抜ける
TCP Client
TCP Clientの実装 • サーバ側に 比 べると仕事が少ない • コネクションは最 大 でも10分に限定
• コネクションのリーク防 止 • 10分で切られて困る場合はもう少し丁寧に実装する
Proxyする
Proxyの実装(ServerとClientをつなぐ) • みていきましょう
終了処理 Server → Clientのプロキシ Client → Serverのプロキシ
TCPは双 方 向ストリーミング TCP 送信 受信 送信 受信
双 方 向の通信をつなぐ • コネクションが続く限りデータをコピーする • 何かしらの理由でコピーできなかった場合はプロキシ不能なので サーバ側もクライアント側もコネクションを閉じる
データのコピー • 読んだデータをそのまま書き込むのをループでひたすら繰り返す • これがProxy
終了処理 • contextが終了したらコネクションを切断する • コネクションをハンドリングしているgoroutineがエラーで終了する
全体像
全体像 • contextの流れ • cancelが伝搬する
おわり • 思ったより簡単なことが伝わるはず(?) • goroutineがあるおかげで難しいことを考えずある程度のパフォーマンスが出る • OSのネイティブスレッドで同じような処理をするとオーバーヘッドがきついかも • 何かしら並 行
処理っぽい実装をすることになるはず • errgroupを使うことでgoroutine leakしにくい実装に • errgroup経由で作成したgoroutineが全て終了しないとシャットダウンできないように実装するため