wireguard-goコードリーディングメモ
wireguard-goの立ち位置
WireGuardはLinux Kernel version 5.6以降でKernel本体に取り込まれている 一方でLinux Kernelが古い、あるいはLinux以外のプラットフォームでWireGuardを利用したいことがある
それらのための実装がwireguard-go
古いLinux Kernelの場合、backport実装を用いるという方法もある
そのため、WireGuardのコアプロトコルだけではなく、Network I/Fをどやこやしたりする機能が含まれている
LinuxやWindows、Unixなどといったプラットフォーム固有のコードが含まれているのはこのせい
プラットフォームによっては追加のコンポーネントが必要になる
コードの中身
当然ながらmain.goがエントリポイント (Windowsの場合はmain_windows.go)
ごちゃごちゃコマンドラインの設定をしたあとにTUN device (あるいは渡されたfd) をopenしている
渡されたfdというのは WG_TUN_FD 環境変数越しに渡される
fdがあると処理が分岐する
createTunでTUN deviceが作成される
socketを開いて、それを生成されたfdを使ってtunnel deviceを作成している
tun Deviceが何をやっているのか
tun.Deviceで定義されている
socketは2つある
routeSocket
control plane
up/downとか、MTUの変更とか
tunFile
data plane
基本的に低レイヤのパケットのやりとり
Deviceがコア
以下はキューにより非同期で処理されており、CPU個数ぶんだけ非同期処理のgo routineが起動される
handshake
encryption
decryption
以下も非同期に処理されている
tunからパケット読んできて、ヘッダにあるIPアドレスに応じてpeerをlookupして対応するpeerが発見された場合、そのpeerの stagePacket を送信している
Misc