2024-01-01から1年間の記事一覧

xdp-tutorial packet03-redirectingをやってみる

github.com 前提 alias t='sudo ../testenv/testenv.sh' Assignment1 ICMP echoサーバーを実装するというもの。 テスト環境構築 t setup --name test --legacy-ip コード修正 まずは以下を実施する。 swap_src_dst_mac()の実装 swap_src_dst_ipv6()の実装 sw…

xdp-tutorial packet02-rewritingをやってみる

github.com bpf_xdp_adjust_head()はパケットの先頭ポインタをずらすことができる。 つまり、パケット長が長くしたり、パケット長を短くするときに使える。(例えば、encap処理やdecap処理)bpf_xdp_adjust_headのあるパラメータに正の値を与えると、パケッ…

xdp-tutorial packet01-parsingをやってみる

github.com packet01-parsingでは以下を行う。 指定したICMPパケットを許可し、それ以外のICMPパケットはドロップする。 ICMPパケットでないものは許可。 Assignment1 parse_ethhdr()のbouds checkのバグフィックスをする。 テスト環境構築 sudo ../testenv/…

xdp-tutorial basic04-pinning-mapsをやってみる

github.com Assignment1 eBPFプログラムが再ロードされた場合、xdp_statsプログラムでそれを検知して、mapを再取得するというもの。 解いてみる 誤ったファイルディスクリプタを使っていないかbpfマップを検証する関数を実装する 問題文に書いてある通り、新…

xdp-tutorial basic03-map-counterをやってみる

github.com Assignment 1 現状の実装にbyteカウンタの機能を追加するというもの。 解いてみる xdp_stats_mapのエントリの構造体にbyteカウンタのフィールドを追加する eBPFマップは以下のように定義されている。 struct { __uint(type, BPF_MAP_TYPE_ARRAY);…

vim-lsp/clangd/bear/compdb

clangd clangdはclangのLSPサーバ。 例えば、Makefileで-Iオプションとかを使ってて、それによってエディタがincludeパスを正しく見つけられなくて、エラーを出すみたいな問題を解決できる。 vim-lsp LSPクライアントはvim-lspをつかって、その設定はvim-lsp…

perfがうまくいかなかったメモ

xdp_exceptionのイベントを確認したくて、perfを実行したら、以下のようにエラーに遭遇した。 sudo perf record -a -e xdp:xdp_exception sleep 4 event syntax error: 'xdp:xdp_exception' \___ unsupported tracepoint libtraceevent is necessary for tra…

XDPプログラムをCLIでロード/アンロードする方法

iproute2 ロード sudo ip link set dev DEVICE [ { xdp | xdpgeneric | xdpdrv | xdpoffload } { object FILE [ section NAME ] [ verbose ] | pinned FILE } ] アンロード sudo ip link set dev DEVICE xdpgeneric off xdp-loader xdp-loaderはxdp-toolsに…

seccomp

seccompとは Seccompとは、Linuxカーネルが持つセキュリティ機構の一つで、Secure Computing Modeの略です。 簡単に言うと、Seccompはシステムコールの許可・不許可を設定できるようにし、危険なシステムコールを実行できなくするためのものです。 突然の「O…

手元のクラスタ(kind)でgvisorを試す

kindでgvisorを使用できるようにする。 nodeに入る。(自分のケースでは1node構成なので、control-planeになっている。) docker exec -it kind-control kind-control-plane bash gvisorをインストールする。 以下はInstallation - gVisorにあるインストール…

Kubernetesにおけるetcd内のデータの暗号化

問題点:etcdには平文でデータが格納されている。 k8sの各種マニフェストははetcdに平文で保存されている。 secretであっても平文で保存されている。 twoという文字列を隠蔽したくてone-plus-oneというsecretを作成する。 $ k create secret generic one-plu…

etcdv3の探索でetcdctl lsはできない

etcdv3ではもはやetcdctl lsはできない。。。 というより、もはやディレクトリライクな構造になっていないようだ。 似たようなことをやりたければ以下のようにする。 etcdctl get / --keys-only --prefix

NodeRestriction

NodeRestrictionはKuberntesによって提供されるAdmissionPluginでkube-api-serverで--enable-admission-plugins=NodeRestionを指定することで有効化できる。 kubernetes.io 効果1 nodeが他のnodeのラベルを変更することを禁じる。 効果2 nodeにおけるnode-re…

curlでKubernetesAPI

方法 caとclient-certとclient-keyをkubeconfigから抽出する。 k config view --raw | yq .clusters[0].cluster.certificate-authority-data | tr -d '\n' | base64 -d > ca k config view --raw | yq .users[0].user.client-certificate-data | tr -d '\n' …

Kubernetes Authorization

authorization mode kubernetesではauthorizationに関していくつかのモードを提供してくれている。 authorization modeの指定はkube-api-serverで--authorization-modeを使って行う。 よくある、設定は--authorization-mode=Node, RBACになっている。 Kubern…

AppArmor

AppArmor(Application Armor)とは、Linux Security Modulesの一種であり、各プログラムにセキュリティプロファイルを結びつけ、プログラムのできることに制限をかけるプログラムである。プロファイルは、ネットワークアクセス、Raw socket アクセス、ファ…

コンテナのPID namespaceの共有

docker runコマンドの--pidオプションで使用するPID namespaceを指定できる。 このオプションに与える引数は以下の2パターン container:CONTINAER_ID host container:XXXを指定すれば、他のコンテナとPID namespaceを共有できる。 $ docker container run -…

ClusterRoleとRoleBindingの組み合わせ

Namespaced Resource Role Rolebinding Cluster Resource ClusterRole ClusterRolebinding Role系のリソースとBinding系のリソースの組み合わせ 以下は直感的に理解できる。 RoleとRoleBindingの組み合わせ(青線) ClusterRoleとClusterRoleBindingの組み合…

しゃくとり法(two pointer approach)

どういう場合で使えるか こちらの記事を引用させていただくと、以下のような問題を解くのに使える。 長さのn数列 a1, a2, a3, ... , anにおいて - 「条件」を満たす区間 (連続する部分列) のうち、最小の長さを求めよ - 「条件」を満たす区間 (連続する部分…

getopt, getopt_longについて

getopt #include <unistd.h> int getopt(int argc, char * const argv[], const char *optstring); extern char *optarg; extern int optind, opterr, optopt; optstringにはオプションで指定できる文字のリストになっていて、引数を取る場合にはその文字の直後に:を付</unistd.h>…

可変長引数のマクロ

__VA_ARGS__で可変長引数のマクロを実現できる。 example #include <stdio.h> #define DEBUG_PRINT(fmt, ...) fprintf(stderr, fmt, __VA_ARGS__) #define DEBUG_PRINT2(...) fprintf(__VA_ARGS__, 22) int main(int argc, char **argv) { char *name = "Taro"; int i</stdio.h>…

可変長引数の関数

va_listという型があり、これを使って可変長引数リストを操作できる。 va_listは、SYSTEM_DATA_TYPES(7)に説明がある。 example #include <stdio.h> static void myprintf(char *first_arg, ...) { va_list ap; va_start(ap, first_arg); printf("%s\n", va_arg(ap, c</stdio.h>…

GolangのGenericsについてざっくり

any型 any型はinterface{}型のエイリアス 既存コードはgofmtで置換可能。 gofmt -w -r 'interface{} -> any' . comparable型 ==や!=で比較できるもの。 関数定義と一緒に型パラメータを定義 関数定義 func SumIntsOrFloats[K comparable, V int64 | float64]…

ubuntu22のkernel sourceコードの取得

ubuntu22のkernelソースコードの取得 git clone --depth=1 git://git.launchpad.net/~ubuntu-kernel/ubuntu/+source/linux/+git/jammy wiki.ubuntu.com

calico cni pluginのADD処理を追ってみる

calicoのCNIが何をしているのかを理解するために、コードリーディングする。 前提としてk8sで動作させている場合の挙動のみを追うようにする。 calicoの提供するCNIプラグイン calicoの提供するCNIプラグインはcalico-cniとcalico-ipamの2つがある。 本記事…