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
1k
2026年の個人的テーマ: 「計算機を燃やせ🔥」
kurochan
1
160
つなぐ、届ける、変える- コンテンツ配信の最前線ト——ク
kurochan
0
150
サイバーエージェント流クラウドコスト削減施策「みんなで金塊堀太郎」
kurochan
4
3.3k
AWS Elemental MediaPackageと格闘🤼
kurochan
2
110
サイバーエージェントでのSlack活用事例 @ 2025
kurochan
5
260
15年入社者に聞く! これまでのCAのキャリアとこれから
kurochan
1
380
入門 電気通信事業者
kurochan
13
5.9k
AWS x さくらのクラウドのハイブリッドクラウドによる安価なフレッツ閉域網接続の実装
kurochan
9
6.3k
Other Decks in Technology
See All in Technology
”AIを使う” から ”AIに任せる” へ ─ 開発プロセスを再設計してAIを組織標準にするまで
cyberagentdevelopers
PRO
1
120
AIレビューはどこまで任せられるのか?自動化と人が背負うレビューの境界
sansantech
PRO
3
1.2k
CDKで書くECSのベストプラクティス、 改めて考え直す2026 #cdkconf2026
makies
3
910
生成 AI 時代にいま一度「問い合わせ」について考えてみる
kazzpapa3
1
110
AI x 開発生産性を取り巻く予算戦略と投資対効果
i35_267
6
2.6k
仕様駆動開発、導入半年。「本当に速くなってるの?」にデータで答える / AICon2026_hirakawa
rakus_dev
0
300
LLM/Agent評価:トップ営業の発言を「正解」にする 〜暗黙的正解による評価を営業資産に変える〜
takkuhiro
1
240
ファミコンでPHPを動かす / PHP on the Famicom
tomzoh
2
570
ここは地獄!つらい朝会を体験することで、チームとしてのより良い振る舞いに気づくワークショップ / The stand-up meeting from hell in the game industry
scrummasudar
0
200
LLMやAIエージェントをソフトウェアに組み込むプラクティス
shibuiwilliam
2
440
AI Native なプロダクト組織の立ち上げ方 : 生産性 100 倍への挑戦
mikesorae
0
1.1k
プロダクト開発組織の現在地(Ver.2026/07) / product-organization
kaonavi
0
200
Featured
See All Featured
Producing Creativity
orderedlist
PRO
348
40k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Balancing Empowerment & Direction
lara
6
1.2k
Designing for humans not robots
tammielis
254
26k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
64
56k
We Have a Design System, Now What?
morganepeng
55
8.2k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.5k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
190
Navigating Weather and Climate Data
rabernat
0
390
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.6k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
260
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が全て終了しないとシャットダウンできないように実装するため