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
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
230
つなぐ、届ける、変える- コンテンツ配信の最前線ト——ク
kurochan
0
190
サイバーエージェント流クラウドコスト削減施策「みんなで金塊堀太郎」
kurochan
4
3.4k
AWS Elemental MediaPackageと格闘🤼
kurochan
2
160
サイバーエージェントでのSlack活用事例 @ 2025
kurochan
5
300
15年入社者に聞く! これまでのCAのキャリアとこれから
kurochan
1
420
入門 電気通信事業者
kurochan
13
5.9k
AWS x さくらのクラウドのハイブリッドクラウドによる安価なフレッツ閉域網接続の実装
kurochan
10
6.5k
Other Decks in Technology
See All in Technology
自主式軟體工廠
philipz
0
230
オンラインゲームのシステム全体像 - コロプラ 2026年度 新卒研修
colopl
0
740
インバスケット試験対策アプリを 作って見えたAIエージェント構築 ナレッジ2選
shichijoyuhi
1
130
私の推しは「聞いてから進む」AIです -AI-DLCに一人でアプリを作らせた話
yama3133
1
180
自分で立ててみるLLMサービス
y_sera15
0
120
生成AIを使って「人が」考える技術 ― AI時代の人機共想と実践ノウハウ|UNITT AC2026
ishiirikie
0
560
Google Cloud Next Tokyo 26登壇時のスクリプト
recruitengineers
PRO
0
200
More Freedom on the Same Shared GPU Cluster: A Small Team’s Experience with vCluster
nttcom
0
140
【データ横丁主催】AI Agentがコンテキストを使って仕事をした後、何が残るのか― 組織の経験を次の判断に引き継ぐ「Agent Memory」
shisyu_gaku
2
330
BedrockとLambdaで作る リアルタイム進行型推理ゲーム
kawametho
0
190
[2026 Oracle Technical Deep Dive] Apache Iceberg × Oracle AI Database -Oracle Autonomous AI Lakehouseが実現するAI時代のデータ基盤- (2026年9月17日開催)
oracle4engineer
PRO
0
120
Datadog の学び方 - あるいは、オブザーバビリティを学ぶとは何か
mananyuki
1
490
Featured
See All Featured
Navigating Weather and Climate Data
rabernat
0
550
ラッコキーワード サービス紹介資料
rakko
1
5.2M
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
2
2.2k
A Modern Web Designer's Workflow
chriscoyier
699
190k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
Marketing to machines
jonoalderson
1
5.9k
GraphQLとの向き合い方2022年版
quramy
50
15k
Product Roadmaps are Hard
iamctodd
55
13k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
570
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
760
How to train your dragon (web standard)
notwaldorf
96
6.8k
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が全て終了しないとシャットダウンできないように実装するため