Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
GoでTCP Proxyを実装してみよう
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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.2k
2026年の個人的テーマ: 「計算機を燃やせ🔥」
kurochan
1
260
つなぐ、届ける、変える- コンテンツ配信の最前線ト——ク
kurochan
0
200
サイバーエージェント流クラウドコスト削減施策「みんなで金塊堀太郎」
kurochan
4
3.4k
AWS Elemental MediaPackageと格闘🤼
kurochan
2
170
サイバーエージェントでのSlack活用事例 @ 2025
kurochan
5
310
15年入社者に聞く! これまでのCAのキャリアとこれから
kurochan
1
430
入門 電気通信事業者
kurochan
13
5.9k
AWS x さくらのクラウドのハイブリッドクラウドによる安価なフレッツ閉域網接続の実装
kurochan
10
6.5k
Other Decks in Technology
See All in Technology
AI AgentによるEmbedded SREの取り組み
tgidgd
1
230
Claude Codeから見る、エンジニアの世界の変容とその先
oikon48
7
4.8k
[FECONF-2026] 신대륙을 향한 카카오페이증권 프론트엔드 항해기 (이주승)
l1ghthouse
0
310
Draft AIエージェントの トークン消費を最小化する 8つの原則
kinopeee
6
1.9k
OneLakeをデータソースにした AI Search(Foundry IQ)の ライフサイクル管理
ryuseiiida
0
200
Content Mapper APIの応用例~CSS Modules、言語ファイル~
uhyo
2
300
cdk deployとcdkd deploy、実際にデプロイして5倍速近くの差を実測した
yama3133
1
120
Flutter Widget Previewerで始めるUIプレビューとVRTの自動化
sakusaku3939
0
180
AIエージェント時代、Kaggleにどう取り組むか
takanao
2
410
アクセラレーターで実現するServiceNow活用の高速化 / ServiceNow World Forum 2026
visional_engineering_and_design
0
100
You Have Agency(サンキュー、Ruby)
snoozer05
PRO
4
610
reInvent2026stby LT00 "Change your life!"
shinichirokawano
1
480
Featured
See All Featured
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
340
Into the Great Unknown - MozCon
thekraken
41
2.8k
A designer walks into a library…
pauljervisheath
211
25k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
20k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.2k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
540
Between Models and Reality
mayunak
4
530
Automating Front-end Workflow
addyosmani
1370
210k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.2k
Designing Experiences People Love
moore
143
24k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
18k
Navigating Team Friction
lara
192
16k
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が全て終了しないとシャットダウンできないように実装するため