HTTP Tunneling in Go

By Kazuki Higashiguchi

Elevator Pitch

HTTP Tunneling can be used in situations similar to the requirements of using VPN, for example, to be able to access a localhost server from outside. This talk will introduce the specific implementation of HTTP tunneling and give audiences a deep knowledge of TCP and HTTP level implementation in Go.

Description

While it is common to implement HTTP servers or proxies, there are probably few people who have ever implemented an HTTP-level tunnel.

HTTP Tunneling can be used in situations similar to the requirements of using a VPN, for example, to be able to access a localhost server from outside.

In this talk, I will introduce specific implementation concepts to archive this. This talk will give audiences a deep knowledge of TCP and HTTP level implementation in Go.

Two tunnel designs will be discussed.

  1. HTTP Tunnel using HTTP method CONNECT
  2. WebSocket HTTP tunneling

The following technical issues and solutions will be explained while showing Go code in touching on the above designs.

  • Basic knowledge of TCP sessions and how to handle them in Go
  • Packet transferring
  • Periodic communication implementation of maintaining tunnel connection
  • Design and implementation of WebSocket server and client
  • Shutdown implementation to handle system signals
  • …etc

This talk will provide time to learn basic concepts not limited to Go, such as TCP, HTTP, WebSocket, etc…, as well as Go implementation under a little bit complex requirements at the intermediate level and above.

Notes

(プロポーザル採択会議にあたってご参照ください。日本語訳です)

APIサーバーを作ったり通信を中継するプロキシの実装は一般的ですが、HTTPレベルでのTunnelを作成したことのある方は、特殊な要件ゆえ少ないためコードレベルでサクッとイメージができる人は少ないのではないでしょうか。

HTTP Tunnelingはより低レイヤであればVPNを用いる要件に近いシーンで用いられる。たとえば外から自身のlocalhostに立ち上げてるサーバーにアクセスできるようにする。これを実現する具体的な実装コンセプトを紹介します。

簡易化した実装コンセプトを紹介するだけでもGoでのhttp server開発のためのより深い知識が得られるセッションになるでしょう。本トークでは2パターンのTunneling modelについて触れます。

  • HTTP Method CONNECT をベースとしたHTTP Proxy chaining model
  • WebSocket を用いたHTTP通信のtunneling

上記テーマに触れる中でGoコードを示しながら下記のような技術的課題とソリューションを解説します。

  • TCPセッションの基礎知識とその扱い方
  • パケット転送
  • 接続維持の定期的なコネクション実装
  • アプリ停止シグナルをハンドリングするシャットダウン実装
  • WebSocketサーバー・クライアントの設計・実装

TCPやHTTP・WebSocketなどのGoに限らず汎用的な基礎的な概念から、中級レベル以上の少し複雑な要件下におけるGo実装を学ぶ時間を提供します