こんにちは.前回のポストからだいぶ時間が空きましたが,相変わらず緊急事態宣言中で自宅待機なので時間を持て余しています.
ONE PIECEを読み返していたんですが,無料で読める分を読み終わってしまったので暇です.
今回はdockerに使用されているコンテナランタイムであるrunc
を使ってみました.
では,いきます.
セキュアなコンテナgVisor
こんにちは.緊急事態宣言が出ているため相変わらず外出ができません.早く収束して欲しいものです. 今回はdocker関連の話題についてです.Googleが開発したgVisorというコンテナランタイムについて調べてみました.
gVisor
Documentを意訳
gVisorとはGo言語で実装されたユーザー空間カーネルです.ほとんどのLinuxシステムコールインターフェースを実装しており,ホストOSと起動しているアプリケーションとの間に隔離層を設けることで安全性を実現しています.
gVisorにはrunsc
というOCI仕様に準拠したコンテナランタイムを含んでいます.runsc
はDockerやKubernetesで使用でき,簡単にサンドボックス化されたコンテナを実行できます.
gVisorは既存のサンドボックス化ツールと異なるアプローチを用いています.
ネットワークを作って理解しようとする(ARP編)
こんにちは. 新型コロナの影響で外出を控えているのですが,ずっと自宅にいるのも結構しんどいですね. この前見始めた鬼滅の刃ももう見終わってしまいました.続きが気になります. さて,今回もネットワークシリーズです.
ネットワークを作って理解する
ネットワークの仕組みを理解するためには作ってみるのが一番ということでプロトコルスタックを自作してみます. 前回はEthernetを実装してみました.前回のポストはこちら 今回はデータリンク層のアドレスとネットワーク層のアドレスを解決するARPを実装してみたいと思います.使用言語はgolangです.
[Read More]ネットワークを作って理解しようとする(Ethernet編)
こんにちは. 今週末は新型コロナの影響で外出自粛なので暇を持て余しております. 暇なのでNetflixで鬼滅の刃を見始めました.面白いですね〜.
ネットワークを作って理解する
最近の興味としてネットワークの仕組みを理解したいというのがあり,プロトコルスタック自作なるものを知りました.とはいえ僕はC言語が得意でないのでGo言語で作ってみようと思い作成を始めました.というわけて何回かに分けて紹介したいと思います.
OSI参照モデル
OSI参照モデルとはコンピュータの通信機能を階層構造に分割したモデルです.
各階層にはそれぞれが担うべき機能が定義されています.
データリンク層では隣接するノード間のデータの通信をサポートします.
開発環境
開発環境は以下の通りです.ioctl
などのシステムコールを扱うためprivilegeオプションを有効にしたLinuxコンテナを作成してプログラムをビルドします.
また,実行はコンテナの中でネットワーク名前空間を分離して行います.
- Mac OS Catalina
- VSCode
- Docker version 19.03.5, build 633a0ea
実装
リポジトリはこちら
物理層からデータを受け取る
今回のプログラムでは生のパケットを受け取る必要があります.golangの標準パッケージでは生のパケットを扱うことができないため別の方法で生のパケットを取得しなければいけません.そこで今回のプログラムでは以下の二つの方法で生のパケットを取得します.
- PF_PACKET
- Tun/Tapデバイス
PF_PACKET
PF_PACKETはLinuxのsocketシステムコールで生のパケットを扱うためのドメインです.syscallパッケージのSocket関数を用いて以下のようにソケットを開きます.
protocol := hton16(syscall.ETH_P_ALL)
fd, err := syscall.Socket(syscall.AF_PACKET, syscall.SOCK_RAW, int(protocol))
if err != nil {
return -1, err
}
開いたソケットを用いてPFPacket構造体を定義します.
type PFPacket struct {
fd int
name string
address ethernet.HardwareAddress
netInfo ip.IPSubnetMask
registeredProtocol []LinkNetProtocol
MTU int
buffer chan *ethernet.EthernetFrame
}
Tun/Tap
Tun/TapはUnixで使用できる仮想ネットワークデバイスです.Tun/Tapデバイスに届いたパケットは直接ユーザープログラムに送られます. Tun/Tapデバイスは以下のように開きます.
const device = "/dev/net/tun"
file, err := os.OpenFile(device, os.O_RDWR, 0600)
if err != nil {
return "", nil, err
}
開いたファイルを用いてTun構造体を定義します.
type Tun struct {
file io.ReadWriteCloser
name string
address ethernet.HardwareAddress
netInfo ip.IPSubnetMask
registeredProtocol []LinkNetProtocol
MTU int
buffer chan *ethernet.EthernetFrame
}
Deviceインターフェース
DeviceインターフェースでPF_PACKETとTunデバイスの差を吸収します.
[Read More]ネットワークを作って理解しようとする(DHCP編)
今回はDHCPプロトコルをサーバーを実装することで理解してみます.使用する言語はRustです.普段はGoを書いていますが,新しい言語としてRustの勉強を始めたため学習のため選択しました.Rustはプログラミング言語Rustを一通り読んだだけで実際にプログラムを書いたことはほどんどありません.なので読みにくいです.ちなみにモチベ維持のため作りながら書いてます.
- リポジトリ rusdhcp