af-graft を LXC コンテナで試してみた
Twitter でコンテナ用の面白い仕組みを見つけたので試してみました。中身ほぼゼロです。
コンテナの中で開いたsocketがhost stackに生えるという不思議socketです。論文はこちら https://t.co/YyP67mDPt2 実装はこちら https://t.co/IaKO5RFfkG
— upa (@upaa) 24 July 2018
論文も公開されているようですね。
README を見る限りは普通に LXC で使えそうなのでロクにドキュメント読まず(コラ)やってみました。
とりあえず Ubuntu 16.04 ホストを準備します(AWS 上に準備しました)。そして LXC をインストールします。こういうときは LXD でなく設定ファイルちょいちょいといじって起動させられる LXC 便利。
host:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04.5 LTS
Release: 16.04
Codename: xenial
host:~$ sudo apt install lxc
コンテナを作ります。
host:~$ lxc-create -t download -n c1 -- -d ubuntu -r xenial -a amd64 host:~$ sudo egrep '(lxc.net*|mount)' /var/lib/lxc/c1/config lxc.network.type = empty lxc.mount.entry = /home/ubuntu/af-graft home/ubuntu/af-graft none bind,relative,create=dir 0 0
lxc.network.type
(LXC 3.0ではlxc.net.0.type
)はempty
でループバックのみlxc.mount.entry
はホスト側でコンパイルしたバイナリをコンテナ内でもそのまま使いかかったので書いてるだけで特に重要ではありませんCAP_NET_ADMIN
が必要ですが、LXC コンテナではデフォルト許可なので capability はいじらず
ってところです。
ここでコンテナを起動します。コンテナには Apache がインストールされていて、コンテンツとして簡単な index.html
を準備しました。
host:~$ sudo lxc-start -n c1 host:~$ sudo lxc-attach -n c1 root@c1:~# root@c1:~# cat /var/www/html/index.html <h1>c1</h1>
ここからが本番。エンドポイントを作成します。
root@c1:~# af-graft/iproute2-4.10.0/ip/ip graft add nx4 type ipv4 addr 0.0.0.0 port 80 root@c1:~# af-graft/iproute2-4.10.0/ip/ip graft add nx6 type ipv6 addr :: port 80 root@c1:~# af-graft/iproute2-4.10.0/ip/ip graft show nx4 type ipv4 addr 0.0.0.0 port 80 nx6 type ipv6 addr :: port 80
はい、できましたね。apache 起動してみましょう。
root@c1:~# LD_PRELOAD=af-graft/tools/libgraft-hijack.so GRAFT_CONV_PAIRS="0.0.0.0:80=nx4 :::80=nx6" apachectl start libgraft-hijack.so:466:socket(): overwrite family 10 with AF_GRAFT (4) libgraft-hijack.so:597:setsockopt(): wrap setsockopt() level=1, optname=15 libgraft-hijack.so:466:socket(): overwrite family 2 with AF_GRAFT (4) libgraft-hijack.so:466:socket(): overwrite family 10 with AF_GRAFT (4) libgraft-hijack.so:597:setsockopt(): wrap setsockopt() level=1, optname=2 libgraft-hijack.so:597:setsockopt(): wrap setsockopt() level=1, optname=9 libgraft-hijack.so:597:setsockopt(): wrap setsockopt() level=1, optname=15 libgraft-hijack.so:540:bind(): convert bind :::80 to nx6
起動しました。試しに netstat してみると
root@c1:~# netstat -napt Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
何もありません。
では、アクセスしてみましょう。
- ホストから
host:~$ curl http://localhost/ <h1>c1</h1>
- Internet 経由で
$ curl http://afgrafttest.ten-forward.ws/ <h1>c1</h1>
ま、動いて当たり前なのでしょうが、試してみましたってことでご報告。論文なんかにパフォーマンス比較してありますが、手元でも時間があればやってみたいですね。macvlan とか ipvlan との比較も含めて(論文で何と比較してるのかは見てない)。