TenForward

技術ブログ。はてなダイアリーから移転しました

af-graft を LXC コンテナで試してみた

Twitter でコンテナ用の面白い仕組みを見つけたので試してみました。中身ほぼゼロです。

論文も公開されているようですね。

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 との比較も含めて(論文で何と比較してるのかは見てない)。