Docker コンテナーに IP アドレスを付ける方法

半分は備忘録ですが、 MACVLAN を使って Docker コンテナーに IP アドレスを付ける方法を記述します。

MACVLAN の設定

/etc/network/interfaces の記述例:

allow-hotplug eth0
iface eth0 inet manual
        up ip link set $IFACE up arp off
        up ifup macvlan0 || true
iface eth0 inet6 auto
        accept_ra 0
        down ifdown macvlan0 || true
        down ip link set $IFACE down

iface macvlan0 inet static
        address 192.0.2.2
        netmask 255.255.255.0
        gateway 192.0.2.1
        pre-up ip link add link eth0 name "$IFACE" type macvlan mode bridge 1
iface macvlan0 inet6 static
        address 2001:DB8::2/64
        accept_ra 2
        autoconf 1
        post-down ip link delete "$IFACE" type macvlan || true

補足: eth0 は IP 通信に使わないので ARP と RA を無効化しておきます。

Docker ネットワークの設定

コマンド例:

docker network create -d macvlan \
    --subnet=192.0.2.0/24 \
    --gateway=192.0.2.1 \
    --ip-range=192.0.2.128/25 \
    -o parent=eth0 \
    network-name

Docker コンテナーの設定

コマンド例:

docker container --network=network-name \
    --ip=192.0.2.3 \
    image 

Docker にマウントしたディレクトリに作られる root 所有ディレクトリ対策

Docker コンテナーにディレクトリをマウントして何か作業をすると、root 所有のディレクトリが作られてしまうことがある。

そのようなディレクトリが作られても簡単に削除できるようにするのに、あらかじめ次のコマンドを実行してディレクトリに ACL を設定しておく方法が使える。

find . -type d -exec setfacl -m d:u:${USER}:rwx {} \;

racoon でらくらく iPhone VPN

BSD 系 OS や GNU/Linux 上の racoon を利用して、iPhone 等から IPSec VPN で接続可能にする設定を試行錯誤の末に発見したので公開してみます。(もしうまく接続できなければコメントで質問してください。)

[訂正] 初出時の内容に誤りもしくは不適切な部分がありましたので該当部分を訂正しました。

サーバー側の設定

まず racoon.conf の remote ノード指定を次のように書きます。(重要部分は太字で強調してあります。またホスト名や IP アドレスは記述例ですのでお使いの環境に合わせて書き換えてください。)

remote "server"anonymous {
    exchange_mode main, aggressive;
    my_identifier fqdn "server.example.com";
    mode_cfg on;
    passive on;
    generate_policy on;
    nat_traversal on;
    proposal {
        encryption_algorithm aes;
        hash_algorithm sha1;
        authentication_method xauth_psk_server;
        dh_group modp1024;
    }
}

次に sainfo 指定を次のように書きます。(pfs_group はお好みで追加してください。筆者は pfs_group modp1024 しか試していません。PFS は iOS では使えませんでした。)

sainfo anonymous {
    encryption_algorithm aes;
    authentication_algorithm hmac_sha1;
    compression_algorithm deflate;
}

最後に mode_cfg を次のように書きます。(auth_source 等はお好みで追加してください。筆者は auth_source pam しか試していません。)

mode_cfg {
    network4 198.51.100.0;
    netmask4 255.255.255.0;
    dns4 198.18.0.1;
    split_network include 198.51.100.0/24;
    default_domain "remote.example.com";
}

そしてもう一つ、psk.txt に次の行を追加してください。

グループ名 秘密鍵

例えば次のような記述になります。

iphone opensesame

iOS 側の設定

iOS の VPN 構成で IPSec を選択して各項目を次のように設定します。

  • 説明: 適当に決めてください。
  • サーバ: racoon を実行しているサーバーのホスト名を指定します。動的 DNS を利用している場合は、そのホスト名でもとりあえず OK です。
  • アカウント: サーバー上の自分のアカウント名を指定します。
  • パスワード: 空欄のままで OK です。(iOS の不具合なのか、ここで指定しても接続ごとに入力を要求されます。)
  • 証明書を試用: オフにします。
  • グループ名: psk.txt に追加した行のグループ名を指定します。
  • シークレット: psk.txt に追加した行の秘密鍵を指定します。

以上を設定したら保存して設定完了です。

GlassFish 構成の紹介

せっかく Jenkins が復旧したことなので、このサイトで使っている GlassFish の構成を紹介してみようと思います。

まず GlassFish の「ドメイン」には管理サーバーがあるわけですが、これは表に出していません。管理サーバーとは別にクラスター インスタンスと今回新たに追加したスタンドアローン インスタンスがそれぞれ別の java プロセスで動作していています。それぞれのインスタンスには AJP (mod_jk) 対応のリスナーが追加してあり、フロントエンドの Web サーバーから間接的にアクセスするように設定しています。

結局 3 個の Java プロセスが動いているということになるわけですが、運用の勉強のつもりで動かしているクラスターは、実際にクラスターを組めるほどのインスタンス数がないので、将来的にはスタンドアローン インスタンスに一元化してしまうかもしれません。

QNAP Turbo NAS に xllmnrd を載せる話

QNAPxllmnrd のパッケージを作ろうと考えて安い Turbo NAS を一つ調達してあるんだが、QDK でビルドするのにホスト側の GNU/Linux 環境 (arm) が必要になるらしくて一向に作業が進んでない。こんなものホスト側でクロスコンパイルしてパッケージ生成までするようになっていれば簡単に終わるのに、NAS にログインしてからリモートでコンパイルするとかよくわからん構造になってて現状棚上げ。

C++Builder の不具合分析

コマンドラインから MSBuild で Win64 向けにプロジェクトをビルドすると、いつもプリコンパイル ヘッダーで参照したファイルが更新されたというエラーになる件について調べてみた。

まず Win64 向けの BCC64 は CLang ベースであるのはわかっているので、CLang のプリコンパイル済みヘッダーのフォーマットを調査して、llvm-bcanalyzer というツールで内容のダンプができることを確認した。

次に正常にビルドできる IDE で生成したプリコンパイル済みヘッダーと MSBuild で生成したものを GNU/Linux にコピーして llvm-bcanalyzer で内容を比較した。ファイルが更新されたというエラーが出ることから、そのファイル名を手がかりにタイムスタンプを探したところでビンゴ。MSBuild で生成したものは 1970 年 1 月 1 日 00:00 UTC からの秒数で正しく記録されているのに対し、IDE で生成したものは 1970 年 1 月 1 日 00:00 JST からの秒数になっていることが判明した。BCC64 は後者を期待していて、前者だと数値が大きくなるのでファイル更新と誤認する模様である。これが原因なら米国では (タイムスタンプの大小が逆転するので) 再現しないのも説明できる。

以上のように調査したので修正してほしいなあ。

Debian で LXC コンテナーを作ってみた

やったことを記録しておく。

  1. debootstrap でコンテナー用のファイルシステムを用意する。
  2. chroot でそのファイルシステム内でシェルを起動して、
    1. apt-get install makedev を実行して MAKEDEV が使えるようにする。
    2. MAKEDEV std を実行して基本的なデバイス ファイルを作成する。
    3. /etc/inittab を編集して tty3 以降のログインを無効にする。
  3. /var/lib/lxc/container/config ファイル (内容は後記) を用意する。
  4. ln -s /var/lib/lxc/container/config /etc/lxc/auto/container を実行して自動的にコンテナーが起動するようにする。
  5. lxc start container -d を実行してコンテナーを手動で起動する。

続きを読む →

rtnetlinkでインターフェースアドレス取得

rtnetlinkにRTM_GETADDRという機能があって,ネットワークインターフェースのアドレス情報を取得できることになっているんだが,調べてみると,インターフェースを指定するにはそのアドレスを正確に渡す必要があるらしい…

馬鹿じゃないのか,この仕様。アドレスを知りたいのにそのためにアドレスが必要とか

結局全てのアドレスを列挙するしか使い道がないぞ