2014-12-07

2014年のインターネット回線を検討する(主にWiMAX2+とMVNO)

今現在の状況を書き連ねる
  • 独身
  • 独り暮らし(寂しい)
  • 常に家にいるわけではないので、光回線引くのもなぁ

今のインターネット回線
  • シェアリーWiMAX(12ヶ月、WM3800R)
  • HTL22で使っているmineoのSIM
この2つを、主にWiMAXは家回線(*1)として使い、外では基本mineoを使っている状況。

通信量が多そうだな〜と事前にわかっている場合(外でPC使うときなど)はWM3800Rを持っていき、そうでもない場合はmineoだけで済ませる(テザリングもできるし)という使い方をしてます。

今のインターネット回線の評価(シェアリーWiMAX)
WiMAXについては、家で使ってる時の方が安定してスピードが出る(*2)ので、WAN回線としては結構満足しています。大きなファイル(LinuxのISOイメージとかfirefox,chromium系の更新が走る場合)をダウンロードする時以外は遅さは感じないです。
一方でWiMAX自体、来年の春から現行の帯域を1/3に縮め、最大DL速度も13.3Mbpsになる(*3)予定なので、現状よりは遅くなって不便になるかもなぁという気はしています。(既存のWiMAXユーザが2+に移行してくはずなので単純に速度が1/3まで下がるとは思えないのですが)
それと、シェアリーWiMAXの12ヶ月約2000円契約が12月いっぱいまでで、来年1月ぶんからは月3880円になるので、このままで行くのはどだい無理な話。とりあえず動かないといけません。

今のインターネット回線の評価(mineo)
一方でmineoについて。これまでドコモ系のMVNO(*4)を使っていたところ、LTE対応した途端遅くなるわ250kbps出るはずが30kbpsしか出ないわアップロードはスピード測定すらできないわ(*5)でほとほと嫌気がさしたので、手持ちのau回線をそのままMNPでau系のMVNOにしてみました。
難点は行動圏内にauのFDD-LTEが使えない場所もあるものの、段々と圏内に変わっていっているのでエリアもまぁまぁいい具合に広がってると評価してます。
スピードも遅いとは感じないので、データ通信量月間1GB(来年1月いっぱいまでキャンペーンで月2GB)で収まる場合はありかと。余ったぶんは翌月まで繰越可。ポジティブに評価してます。
ただし、利用料は安くはないので将来的には乗り換えも検討していますが当面はいいかなというところ。

今のインターネット回線の総コスト
2014/12まで
  • シェアリーWiMAX(WM3800R) 2036円
  • mineo 1720円
参考:2015/1

  • シェアリーWiMAX(WM3800R) 4191円(たぶん)
  • mineo 1720円
どう変えていくか
ひとまずmineoの方はそのままにするとして、家回線については検討が必要です。
選択肢は以下。
  • RaCoupon WiMAX(旧シェアリーWiMAX)を新しく契約する(NAD11)
  • ぷららの3MbpsのSIMを適当なモバルーに刺して使う
RaCoupon WiMAX
恐怖のラクーポンWiMAXですが、色々安そうに見えてそれでも想定よりも高い運用費にはなります。
現在のNAD11のクーポン内容(*6)は以下の通り
  • 提供開始月~24ヵ月間目:2,299円(税抜)、2,482円(税込)
  • 25ヶ月目以降:4,273円(税抜)、4,614円(税込)
  • 契約事務手数料:3,000円(税抜)、3,240円(税込)
一応ラクーポンWiMAXはクーポン在庫があれば販売、クーポン買えなければ売り切れという形態なので、今のキャンペーンが来年1月時点で続いている保証はないのですが話が進まないのでそこは置いといて。

月額の利用料は以下になるのではないかと考えています。
契約月から24ヶ月間(2015/1〜2016/12)
  • NAD11 2482円
  • 2015/1のみ契約事務手数料 3240円
契約月から25ヶ月目(2017/2) 契約更新月
  • NAD11 4614円
契約月から26ヶ月目(2017/3)
  • NAD11 4614円
トータルで按分すると、
  • (2482*24+3240+4614+4614)/26=2771
毎月のコストは2771円になります(26ヶ月ぶん)

RaCoupon WiMAXの懸念
一応計算はしてみましたが、これがあってるかわからないところが怖い(特に26ヶ月目を計算しないといけないのかどうか)。
なおかつ、25ヶ月目で契約終了の旨を伝えた上で26ヶ月目の料金も払わないといけないと仮定した場合、サービスの以下の文言も気になります。
  • ハイスピードモードの「WiMAX 2+」通信に対し、課金開始月から最大25ケ月間、通信速度制限(月間7GB超)を実施しません。
どう見ても26ヶ月目は料金をフルプライスで払いながら、通信量7GB超えるとWiMAX 2+での通信は7GBを超えると月末まで128kbpsに制限されます(*7)。家回線には到底向きませんね。

RaCoupon WiMAXの結論
うーん。家回線として考えると安いは安いけど、もろもろの状況を鑑みると安く上がらない感が強いです。機器代も含まれてはいるんですが。という訳でNG。

MVNOの通信サービスを家回線にする方向で考える
ぷららの通信速度上限ありSIM(ぷららモバイルLTE*8)+モバイルルーターで考えましょう。
特徴は以下となるかと思います。

  • 通信エリアはドコモのLTE(と使用する機器で決まる)
  • 契約期間なし(短期で解約しても違約金はかからない)
  • 速度上限は3Mbps
  • 利用料金2980円/月 契約事務手数料3240円
  • 機器は自分で準備する必要があるので別途イニシャルコストが必要
家回線にするには3Mbps出ててもちょっと遅いかなーという感じもしますが、2年契約がないこと、つなぎ放題の割りには廉価であることが特徴のサービスと言えると思います。

モバイルルータをどれにするかという話にもなりますが、ドコモのLTEで使うことを考えるとBand1(2.1GHz)/Band3(1.8GHz)/Band19(800MHz)/Band21(1.5GHz)全てに対応するNECATのMR03LNが無難かつ唯一の選択肢になりそう。ちなみに、海外でもBand1/Band3でLTEサービスを提供している事業者が多いので、海外に持って行ってもある程度使えるかなーとも思います。(SIMのサイズの問題はおこりそうですが)

*1 BBRのWAN側をクレードルに接続
*2 だいたい10Mbps
*3 http://www.uqwimax.jp/annai/news_release/201410272.html
*4 ワンコインを喧伝してるところ
*5 たぶんコネクション切ってる
*6 http://racoupon.rakuten.co.jp/groupbuy/id/77371
*7 ノーリミットモード(2+じゃないWiMAX)での通信制限はないはずですがその頃帯域幅があることも保証されてないし…
*8 http://www.plala.or.jp/lte/

2014-06-28

DebianのChromiumでFlashを見る

Flashという障壁
いつもセキュリティホールが見つかる対象として諸悪の根源的な扱いも受けることの多いFlashですが、それでもあったほうが便利な状況は未だに多く、特にデスクトップ用途ではその傾向が顕著です。
また、GNU/Linux上での扱い方もコロコロ変わったりするんですが、Debianで扱う[1]上で今の時点で一番筋の良さそうな方法を記載します。前提は以下。

  • ChromiumブラウザでFlashを使う
  • アーキテクチャはi386/amd64

Chromium上でのFlashの扱い
(Chromeではない)Chromiumを使う場合、ブラウザにFlashが同梱されていないため、手動で導入する必要があります。(ChromeにはPPAPI版のFlashが同梱されているので、このエントリの手順は必要ありません)
Flashの導入はパッケージとしてaptからできますが、NPAPI版[2]とPPAPI版[3]のパッケージがあります。詳細な違いは把握してませんが、NPAPIは古いアーキテクチャでメンテナンスが大変らしい、基本的にChromeはNPAPIのサポートをやめる方向、バイナリをadobeからダウンロードしてくる。PPAPIは新しいアーキテクチャで、GoogleがメンテしていてバイナリもGoogleからダウンロードしてくる。という違いはあるようなので、ここではPPAPI版[4]の導入をすることにします。

パッケージのインストール
# apt-get install pepperflashplugin-nonfree
インストールは以上で、パッケージのインストールの場合はバイナリを落としてきてインストールまでやってくれるみたいです。

普段のメンテナンス
pepperflashplugin-nonfreeパッケージ自体はflashのバイナリを含んでいるわけではなく、update-pepperflashplugin-nonfreeコマンドの実行によってバイナリが更新されているかを判断するようです(NPAPI版のflash-plugin-nonfreeと同じ)
# update-pepperflashplugin-nonfree
Usage:
  update-pepperflashplugin-nonfree --install
  update-pepperflashplugin-nonfree --uninstall
  update-pepperflashplugin-nonfree --status
Additional options:
  --verbose
  --quiet
ということなので、--statusを付けてアップデートがあるかチェック、あれば--installで更新ということになります。(更新があるかどうかを自動的に確認する方法は無さそうです。)
ちなみに、現在の状況は
# update-pepperflashplugin-nonfree --status
Flash Player version installed on this system  : 14.0.0.125
Flash Player version available on upstream site: 14.0.0.125

導入されているバージョンは、Chromiumから「chrome://plugins/」を開くことでも確認が可能です。

[1] https://wiki.debian.org/FlashPlayer
[2] https://packages.debian.org/jessie/flashplugin-nonfree
[3] https://packages.debian.org/jessie/pepperflashplugin-nonfree
[4] https://wiki.debian.org/PepperFlashPlayer

2014-06-21

LMDE UP8(MATE)での日本語入力にfcitxを使う

以前のエントリ[1]の内容を新しいPCでやってみるとできないことに気づいたので、LMDE UP8(MATE)を新規インストールした際の設定方法を確認しました。
LMDEでの設定方法ですが、他のdistro(特にDebian系)でも応用できるのではないかと思います。

関連パッケージのインストール
パッケージをインストールします。
# apt-get install im-config fcitx fcitx-mozc fcitx-frontend-gtk2 fcitx-frontend-gtk3 fcitx-frontend-qt4 fcitx-frontend-qt5 fcitx-ui-classic fcitx-config-gtk mozc-utils-gui
im-configコマンドでfcitxを指定します。(以前の手順ではコンソールから選びましたが、-nオプションでinput method nameを指定するとコマンドだけで変えれるみたいです。
$ im-config -n fcitx
Xをログアウトしてもう一度ログインし、「設定」→「Fcitx設定」を開きます(メニュー開いて右上の「すべてのアプリケーション」を選択しておいてください。)

「入力メソッド」タブにmozcが追加されてるのを確認して、「全体の設定」で入力メソッドのオンオフを変えたりします。



今度はメニューから「設定」→「Mozcの設定」。


「一般」タブでキー設定の選択をATOKに。


「辞書」タブに「Unicode6絵文字変換」というのがあったので選んでみました。


以上。

余談
パッケージを大量にインストールしてますが、こんなにちまちま指定しなくてもLinux Mint Japanが提供する「mint-gnome-ja」パッケージをインストールすると色々ひっくるめてインストールできます。
ですが、とにかく以下の点があり(個人的に)お勧めできません。

  • ibus入れてくる[2]
  • takaoフォント入れてくる[3]
  • 他にも使うかどうかわからないパッケージ色々入れてくる

これでもいいという方はmint-gnome-jaを入れるほうが楽なので、入れ方をググってもいいと思います。

[1] http://utimukat55.blogspot.jp/2013/10/ibusfcitx.html
[2] ibus使い続けて問題なければfcitxユーザーこんなに増えてないよね
[3] 画面表示はVLゴシックの方が見やすいし、改まったゴシックならモトヤLシーダ(fonts-motoya-l-cedar)/モトヤLマルベリ(fonts-motoya-l-maruberi)使えばいいかなというのと、takaoフォントの優先度がむちゃくちゃ高いのが嫌なので

2014-06-04

aptでパッケージを更新しないようにさせる

こんな時
パッケージを固定したい!(Debian系またはaptをパッケージ管理に使っているディストロで)
pinでもいいのだけど
もっと別のレイヤーで、aptのpinningではなく、dpkgの機能(dpkg --set-selections)を使って更新対象から外す方法です。
例えばisc-dhcp-commonとisc-dhcp-serverを更新したくない場合。
# apt-mark hold isc-dhcp-common isc-dhcp-server
isc-dhcp-common は保留に設定されました。
isc-dhcp-server は保留に設定されました。
現在更新が保留されているパッケージの一覧。
# apt-mark showhold
isc-dhcp-common
isc-dhcp-server
更新の保留を解除する場合。
# apt-mark unhold isc-dhcp-server isc-dhcp-common
isc-dhcp-server の保留を解除しました。
isc-dhcp-common の保留を解除しました。

2014-05-30

Linuxでswap用のファイルを作って使う(swapパーティションではなく)

かつてのLinuxの常識
実メモリ(RAM)の2倍のswapパーティションを作って、仮想メモリとして使う。

今陥っている状況
RAMが2GB積んでるからswapパーティション要らないと思って作らなかったけどChrome/Chromiumがやたらメモリ食うしヽ(`Д´)ノもう来ねえよ!ウワァァン

残された手段
Windowsのpagefile.sysみたいに、既存のパーティション上にスワップファイルを作って、メモリ逼迫してきたら仮想メモリとして使えるようにする。

というわけで、/mnt/swap.pagefileという4GBのファイルを作って、そこをスワップファイルにします。

まず、今のスワップの確認。
$ cat /proc/swaps
Filename Type Size Used Priority
何もない!

スワップファイル作成からデフラグ[1]、スワップ有効化。
# dd if=/dev/zero of=/mnt/swap.pagefile bs=1M count=4096
4096+0 レコード入力
4096+0 レコード出力
4294967296 バイト (4.3 GB) コピーされました、 84.8117 秒、 50.6 MB/秒
# e4defrag /mnt/swap.pagefile
ext4 defragmentation for /mnt/swap.pagefile
[1/1]/mnt/swap.pagefile: 100% [ OK ]
 Success: [1/1]
# mkswap /mnt/swap.pagefile
# swapon /mnt/swap.pagefile
これが問題なく終わってれば、スワップ確認した時に変わる。
$ cat /proc/swaps
Filename Type Size Used Priority
/mnt/swap.pagefile                      file 4194300 519140 -1
問題なさそうなら、/etc/fstabに行を追加。これでswapon -aでマウントしてくれるし、起動時にもマウントしてくれる。
/mnt/swap.pagefile swap swap defaults 0 0

[1] Windowsのデフォルトみたいにスワップファイルが断片化してると、目も当てられない状況になってしまうので(XPまでの話。Vista以降はよく知りません)

2014-02-27

docker exportとdocker importでdockerイメージのサイズを小さくする

Dockerって何かやってくとどんどんディスク圧迫するよね・・・
Dockerは素晴らしいソリューションだし、失敗しても削除すればいいという側面から手軽に使えるのが特に今までの仮想化ソリューションになかったという点が素晴らしいと思う。
でも。でもね。ファイルシステムのレイヤーをどんどん積み上げていくから、ディスクをどんどん圧迫する。

AUFSの仕組みをざっと解説する
幸か不幸か、ずーっと前に仕事でUnionFSを使ったことがあって、一方でDockerで使ってるAUFSは「Another UnionFS」。UnionFSを改良することを目的としたプロダクト。ということで、仕組みは同じだろう。ということで、色々すっ飛ばして実際間違ってる可能性もありますが、UnionFSで使われるオーバーレイと言われる仕組みを説明してみたいと思います。

図内ではベースになるファイルのレイヤーに対して、3つオーバーレイ[1]しているイメージ。一番下のレイヤーは普通にマウントできるファイルシステムで、そこに対して重ねていくような感じでマウントしていくと、ユーザが参照する時には積み重なったところからファイルシステムが見える。これが大雑把なUnionFS(AUFSも同じはず。。)の仕組みです。

実際Dockerのイメージはどうなっているか
AUFSを使っているという触れ込みのDockerですが、作業をしてくとどうなるか。
拙作のDockerイメージを使って確認しようと思います。
Dockerが使える環境で
# docker pull  utimukat55/jessie_20140213
2/13時点のDebian GNU/Linux jessieのDockerイメージです。これは単純に作ったイメージなので、
# docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
utimukat55/jessie_20140213   latest              f17806c7b448        12 days ago         464.5 MB
utimukat55/docker_jessie     latest              e07ab3ea414f        4 weeks ago         267.8 MB
464MB!でかい!
んでもって、積み上げられているはずの差分はどこにあるか。
# docker info
Containers: 0
Images: 5
Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Dirs: 5
WARNING: No memory limit support
WARNING: No swap limit support
Root Dirの下のdiff、/var/lib/docker/aufs/diff/に格納されています。
/var/lib/docker/aufs/diff/
├── 583d969ed337b16b3db6f2e5f7a6583df32ed25d5b03dc0de25e636897b51f15
│   ├── bin
│   ├── boot
│   ├── dev
│   ├── etc
│   ├── home
│   ├── lib
│   ├── lib64
│   ├── media
│   ├── mnt
│   ├── opt
│   ├── proc
│   ├── root
│   ├── run
│   ├── sbin
│   ├── srv
│   ├── sys
│   ├── tmp
│   ├── usr
│   └── var
├── e07ab3ea414f60ee7a8405289e27fa9caa6a5322f2bd4866c28d319b67c9f7de
├── f17806c7b4480783b9c0ddfe08d6c3521f373a93c352657b3903db418adac42d
│   ├── bin
│   ├── dev
│   ├── etc
│   ├── lib
│   ├── sbin
│   ├── usr
│   └── var
├── f4396103dc987caeef469f759dd147cb1bd4761786aa9672108b189a2b19e02e
│   ├── dev
│   ├── tmp
│   └── var
└── f86c3830f454c1ed1e217b86f09c47df41e2ed1bed22038813b478d1514283cc
    ├── bin
    ├── etc
    ├── lib
    ├── run
    ├── sbin
    ├── tmp
    ├── usr
    └── var
でも、元のイメージとか途中のイメージとかは要らないことありますよね。という訳で

docker exportを使ってみる
dockerのリポジトリを他の場所に移動するためのコマンドとして、
  • docker export/import
  • docker save/load
が用意されているみたいです。exportを使ってみる[2]。引数はCONTAINERなので適当に1回コマンドを実行[3]してから
# docker export df293a377639 > shrink.tar
importで戻す。
# cat shrink.tar | docker import - jessie:shrinked
# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
jessie              shrinked            b309e7a044ee        46 seconds ago      189.4 MB
189MBまで縮んだよ!
ちなみに、save/loadは差分を差分として持ったまま持ち運ぶ時に使うみたいです。

今回のエントリは、一番上のレイヤーだけほしいなぁと思ってググっていた時に見つけた以下の書き込みがきっかけでした。


[1] 組み込みプロダクトで使う場合、不揮発性のファイルシステムの上にtmpfsみたいな揮発性のファイルシステムを重ねあわせて、電源切ると元に戻る感じにするのが多いですね。
[2] http://docs.docker.io/en/v0.5.3/commandline/command/export/
[3] docker run -t -i f17806c7b448 /bin/echo "hello" とか

2014-02-10

特定のMACアドレスに対してIPv6アドレスを設定するDHCPv6サーバを構築した(4)-DHCPv6サーバの設定再び

前回までのあらすじ

  • DHCPv6サーバはISCのものにパッチを当てたものをパッケージとして作ってインストール
  • DHCPv6クライアントはISCのものを使って、クライアントを手動実行
  • クライアントから送るDHCPv6 soliciteが期待通りにならない(DUIDが)
サーバ側の設定を変更
/etc/dhcp/dhclient.confに記載したDUIDは例のwide_mkduid.plで生成したもので、Hardware typeが6(IEEE802)となっていたのだけど、ISCのdhclientは1(Ethernet)としてDUIDを作るので、こっちに寄せることにしてファイルの内容を変更[1]。最終的には以下。

default-lease-time 2592000;
preferred-lifetime 604800;
option dhcp-renewal-time 3600;
option dhcp-rebinding-time 7200;
allow leasequery;
option dhcp6.info-refresh-time 21600;
dhcpv6-lease-file-name "/var/lib/dhcp/dhcpd6.leases";
# RAとか範囲とか(うちの場合はRTX1100で配っているRA)
subnet6 fd00:dead:beef::/64 {
 # 1000からffffまでをDHCPで配る対象にする
 range6 fd00:dead:beef::1000 fd00:dead:beef::ffff;
 # 固定IPアドレス
 host kurobox-t4 {
  host-identifier option dhcp6.client-id 00:03:00:01:00:16:01:xx:yy:zz;
  # 固定で振るIPv6アドレス
  fixed-address6 fd00:dead:beef::100;
 }
}
DHCPサーバを再起動。
# /etc/init.d/isc-dhcp-server restart
DHCPv6クライアント側はDUIDタイプはdhclientのmanを注意深く読んだ結果、引数「-D LL」を指定することでLLを強制的に指定できそうだったので、/var/lib/dhcp/dhclient6.leasesの中身を空にして[2]、起動方法を以下の引数へ変更して実行。
# dhclient -6 -D LL -cf /etc/dhcp/dhclient.conf eth0 -v
一応これで当初望んでいた「fd00:dead:beef::100」は設定されるようになったので「特定のMACアドレスに対して固定IPv6アドレスをDHCPv6で設定する」は達成できたと思いますが、いくつか条件付きなのはここまで記載したとおり。
  • DHCPv6サーバがデフォルトだと扱いづらい
  • dhclientの起動方法が手動
  • DUIDがLLのみ(LL+Tだと対応できない)
サーバ側もクライアント側も結局一筋縄でいかないのは間違いないと思うので、できるだけ早いとここの辺が解決するといいなぁと思っています。

[1] 00:03:00:06から00:03:00:01へ
[2] 空にしないと、取得済みのアドレスを載せたDHCPv6 confirmを送り続けます

特定のMACアドレスに対してIPv6アドレスを設定するDHCPv6サーバを構築した(3)-DHCPv6クライアントの設定

DHCPv6クライアントの設定
クライアント側パッケージはisc-dhcp-clientを使います。サーバ側をisc-dhcp-serverにしたからというだけですが、一応バージョンはdebianの4.2.4-7[1]を使いました。これより前のバージョンでも動くかもしれません。
で、いろんなサイトを見ながら設定を探しつつ…とりあえず[2]の設定がよさげかなぁと思ってこれをベースに。
以下の2行を/etc/dhcp/dhclient.confに書き足して。
send dhcp6.oro 3,23,24,31;
send dhcp6.rapid-commit;
NIC再起動すりゃこの設定したdhclientがDHCPv6 solicite投げるだろjk…
# /etc/init.d/networking restart
……パケット取ってるwiresharkに一向にDHCPv6パケットが流れてこない……

DHCPv6クライアントを手動で実行する
まさかの手動実行ですよ。何か設定が間違ってるのかもしれませんが小職のスキルでは悪いところが見つけられませんでした。

で、とりあえずman dhclientしてみて、dhclient --helpしてみて、それっぽい引数を探します。
# dhclient --help
Internet Systems Consortium DHCP Client 4.2.4
Copyright 2004-2012 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Usage: dhclient [-4|-6] [-SNTP1dvrx] [-nw] [-p <port>] [-D LL|LLT]
                [-s server-addr] [-cf config-file] [-lf lease-file]
                [-pf pid-file] [--no-pid] [-e VAR=val]
                [-sf script-file] [interface]
ふむ。とりあえずDHCPv6クライアントとして実行する場合は-6と、最後のinterfaceは指定したほうがよさそう。ついでに一応設定ファイルを-cfで明示的に指定してみよう。あとは動きを確認するために-v(よくあるverbose)。

# dhclient -6 -cf /etc/dhcp/dhclient.conf eth0 -v
実行結果。
Internet Systems Consortium DHCP Client 4.2.4
Copyright 2004-2012 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Bound to *:546
Listening on Socket/eth0
Sending on   Socket/eth0
PRC: Soliciting for leases (INIT).
XMT: Forming Solicit, 0 ms elapsed.
'send dhcp6.oro' syntax is deprecated, please use the 'request' syntax ("man dhclient.conf").
XMT:  X-- IA_NA 01:96:49:2b
XMT:  | X-- Request renew in  +3600
XMT:  | X-- Request rebind in +5400
XMT: Solicit on eth0, interval 1060ms.
RCV: Advertise message on eth0 from fe80::213:e8ff:fexx:yyzz.
RCV:  X-- IA_NA 01:96:49:2b
RCV:  | X-- starts 1391264700
RCV:  | X-- t1 - renew  +3600
RCV:  | X-- t2 - rebind +7200
RCV:  | X-- [Options]
RCV:  | | X-- IAADDR fd00:dead:beef::c7e5
RCV:  | | | X-- Preferred lifetime 604800.
RCV:  | | | X-- Max lifetime 2592000.
RCV:  X-- Server ID: 00:01:00:01:1a:7f:8d:59:00:13:e8:xx:yy:zz
RCV:  Advertisement recorded.
PRC: Selecting best advertised lease.
PRC: Considering best lease.
PRC:  X-- Initial candidate 00:01:00:01:1a:7f:8d:59:00:13:e8:xx:yy:zz (s: 153, p: 0).
XMT: Forming Request, 0 ms elapsed.
'send dhcp6.oro' syntax is deprecated, please use the 'request' syntax ("man dhclient.conf").
XMT:  X-- IA_NA 01:xx:yy:zz
XMT:  | X-- Requested renew  +3600
XMT:  | X-- Requested rebind +5400
XMT:  | | X-- IAADDR fd00:dead:beef::c7e5
XMT:  | | | X-- Preferred lifetime +7200
XMT:  | | | X-- Max lifetime +7500
XMT:  V IA_NA appended.
XMT: Request on eth0, interval 960ms.
RCV: Reply message on eth0 from fe80::213:e8ff:fexx:yyzz.
RCV:  X-- IA_NA 01:xx:yy:zz
RCV:  | X-- starts 1391264702
RCV:  | X-- t1 - renew  +3600
RCV:  | X-- t2 - rebind +7200
RCV:  | X-- [Options]
RCV:  | | X-- IAADDR fd00:dead:beef::c7e5
RCV:  | | | X-- Preferred lifetime 604800.
RCV:  | | | X-- Max lifetime 2592000.
RCV:  X-- Server ID: 00:01:00:01:1a:7f:8d:59:00:13:e8:xx:yy:zz
PRC: Bound to lease 00:01:00:01:1a:7f:8d:59:00:13:e8:xx:yy:zz.
お。動いてる[3]。動いているが。DHCPv6サーバから振られているアドレスが「fd00:dead:beef::c7e5」である。前に書いたとおり動いていれば振られるアドレスは「fd00:dead:beef::100」になるはずなのであるが。一応ifconfigでも確認。
# ifconfig
eth0      Link encap:イーサネット  ハードウェアアドレス 00:16:01:xx:yy:zz
          inetアドレス:192.168.1.33 ブロードキャスト:192.168.1.255  マスク:255.255.255.0
          inet6アドレス: fd00:dead:beef:0:216:1ff:fexx:yyzz/64 範囲:グローバル
          inet6アドレス: fe80::216:1ff:fexx:yyzz/64 範囲:リンク
          inet6アドレス: fd00:dead:beef::c7e5/64 範囲:グローバル
うむやはり。c7e5はDHCPv6サーバからリースする範囲(1000からffff)の範囲には入っているので、DHCPv6サーバ自体は機能してそう。
サーバ側のログを見てみると。
Feb  1 23:25:36 lmdecfy7 dhcpd: Solicit message from fe80::216:1ff:fexx:yyzz port 546, transaction ID 0x792D6600
Feb  1 23:25:36 lmdecfy7 dhcpd: Picking pool address fd00:dead:beef::c7e5
Feb  1 23:25:36 lmdecfy7 dhcpd: Sending Advertise to fe80::216:1ff:fexx:yyzz port 546
Feb  1 23:25:37 lmdecfy7 dhcpd: Request message from fe80::216:1ff:fexx:yyzz port 546, transaction ID 0xA4A60600
Feb  1 23:25:37 lmdecfy7 dhcpd: Wrote 0 deleted host decls to leases file.
Feb  1 23:25:37 lmdecfy7 dhcpd: Wrote 0 new dynamic host decls to leases file.
Feb  1 23:25:37 lmdecfy7 dhcpd: Wrote 0 leases to leases file.
Feb  1 23:25:37 lmdecfy7 dhcpd: Sending Reply to fe80::216:1ff:fexx:yyzz port 546
ということで、どうも適当に在庫からアドレスを拾ってきていてそれがc7e5ということらしい。うーむ。色々がんばったつもりなんだが。
パケットを見てみると、どうやらDHCPv6 soliciteの中にクライアントから送られるDUIDが含まれているらしいということを知る。
DUID type: link-layer address plus time (1)
Hardware type: Ethernet (1)
Time: Feb  1, 2014 23:25:00 JST
Link-layer address: 00:16:01:xx:yy:zz
マジかよ。とりあえず2つおかしい。
  1. DUIDタイプがLL+T(MACアドレスと時刻)になっている
  2. Hardware typeがEthernetになっている
DUIDタイプは時刻がいつになるかわからない時点で知ったこっちゃないので、LLになるといいなぁと思っていたので、正直参る。

このエントリはここまで。

[1] http://packages.debian.org/ja/jessie/isc-dhcp-client
[2] https://wikispaces.psu.edu/display/ipv6/DHCPv6#DHCPv6-ISCdhclient4.1.0
[3] MACアドレス該当部はぼかしています

2014-02-05

特定のMACアドレスに対してIPv6アドレスを設定するDHCPv6サーバを構築した(2)-DHCPv6サーバの設定(1)

(今のところ)isc-dhcp-serverはdaemonとしてハンドリングしづらい
いきなりブチ切れに近い感じで。

  • 今回DHCPv6サーバにするのはLinux(Debian GNU/Linux)
  • ざっと持ち合わせてる知識だとwide-dhcpv6-server[1]かisc-dhcp-server[2]が良さそうなのだけど、wideの方はupstreamを見ても最後の更新が2009年なので使うのに気が引けてしまう(今はdibblerなのかな?)
  • かと言ってisc-dhcp-serverがDHCPv6サーバとしてハンドリングしやすいかと言えばそんな事は全くなく、パッチをあてる[3]のが一番てっとり早そうという泥沼
という事で、普通のDHCP(v4)サーバみたくハンドリングできるようにソースパッケージにパッチをあててビルドしますorz。

isc-dhcp-serverをビルド、インストール
まず、当てたいパッチが4.2.4向けなので、現状4.2.4なtesting/jessieまたはsidをapt-get sourceできるように以下の行をapt-lineに追加します。

deb-src http://ftp.jp.debian.org/debian/ jessie main non-free contrib
# apt-get update
# apt-get build-dep isc-dhcp=4.2.4-7
# apt-get install devscripts

# exit
$ mkdir build_isc
$ cd build_isc/
$ apt-get source isc-dhcp=4.2.4-7
で、[3]のMessage142のisc-dhcp-server-ipv6.patchをダウンロードしてきます。ここでは~/Downloadsに保存したものとして、
$ patch -u -p0 < ~/Downloads/isc-dhcp-server-ipv6.patch
(patching file・・・がずらずらーっと出ればOK)

$ cd isc-dhcp-4.2.4/
$ debuild -uc -us
$ su
$ cd ..
# dpkg -i isc-dhcp-server_4.2.4-7_amd64.deb isc-dhcp-common_4.2.4-7_amd64.deb
でビルドしたパッケージのインストールは完了。

isc-dhcp-serverの設定項目
今回はDHCP(v4)サーバは設定せず、DHCPv6サーバだけ動かすので、そのように書き換えます。/etc/default/isc-dhcp-serverの以下の場所を書き換え。
  • V4_ENABLED="true"を"false"へ
  • V6_ENABLED="false"を"true"へ
  • INTERFACES_V6=の行を"wlan0"へ(今回はwlan0でDHCPv6dを動かすので)
# touch /var/lib/dhcp/dhcpd6.leases

/etc/dhcp/dhcpd6.confを必要に応じて書き換える。
default-lease-time 2592000;
preferred-lifetime 604800;
option dhcp-renewal-time 3600;
option dhcp-rebinding-time 7200;
allow leasequery;
option dhcp6.info-refresh-time 21600;
dhcpv6-lease-file-name "/var/lib/dhcp/dhcpd6.leases";
# RAとか範囲とか(うちの場合はRTX1100で配っているRA)
subnet6 fd00:dead:beef::/64 {
 # 1000からffffまでをDHCPで配る対象にする
 range6 fd00:dead:beef::1000 fd00:dead:beef::ffff;
 # 固定IPアドレス
 host kurobox-t4 {
  host-identifier option dhcp6.client-id 00:03:00:06:00:16:01:xx:yy:zz;
  # 固定で振るIPv6アドレス
  fixed-address6 fd00:dead:beef::100;
 }
}
ここで固定アドレスを振る対象の行の最後のパラメータですが(最後3オクテットをぼかしてますが)、これが弊ブログの別エントリで触れているDUIDになります。
この時点では生成をミスるとまずいと思ったので、wide_mkduid.plというスクリプトを使って生成しました。端的に書くと、MACアドレスの前に「00:03:00:06:」を付与したDUID-LL(hardware typeは6(IEEE 802 Networks))です。まぁ後々これでも不味かったことを思い知るわけですが。
なお、dhcpd6.confの書き方は[4]を参考にさせていただきました。

このエントリはここまで。


[1] http://packages.qa.debian.org/w/wide-dhcpv6.html
[2] http://packages.qa.debian.org/i/isc-dhcp.html
[3] http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=592539

特定のMACアドレスに対してIPv6アドレスを設定するDHCPv6サーバを構築した(1)-序章

やる前は1エントリで済むと思ってたんですが実際やってみるとすげー大変だったのでいくつかに分けます。
現状&やりたいこと
我が家では部分的にIPv6を導入していて、VPN(L2TP)ルータとしてヤマハのRTX1100を使っています。また、RAもRTX1100からLAN側に流していて、ステートレスなIPv6アドレス設定はできている状態です。


ですが、ご存知の通りIPv6アドレスは長い事、ステートレスに生成するIPv6アドレスは128bitぶんのアドレスを使い切る(0ではない)ので、LAN内のサーバにも頻繁にアクセスするには辛いアドレス(手入力したくない)が設定されます。[1]
そこで、IPv4では家庭用のブロードバンドルータでもできるような「特定のMACアドレスに特定のMACアドレスを配布する」をIPv6で実現しようと思いました。よく言うDHCPv6によるステートフルなIPv6アドレス割り振り(しかも固定アドレス)です[2]。

せっかくヤマハルータあるんだからコマンドいくつか流しこめば出来るんじゃないかと思ったんですが、現状のヤマハルータではRTX1100に限らずこの機能が提供されていません。


なので、LAN内のPCをDHCPv6サーバにしてみようというのが今回のスタート地点です。

今回の記事の全容は以下になります。

  1. 序章←今ここ
  2. DHCPv6サーバの設定(1)
  3. DHCPv6クライアントの設定
  4. DHCPv6サーバの設定(2)
RTX1100の設定はこんな感じです。

  • LAN1がLAN
  • 配布するRAのprefixはfd00:dead:beef::/64
  • DHCPv6使うのでRAのMフラグは立てる

具体的には

  • # ipv6 prefix 1 fd00:dead:beef::/64
  • # ipv6 lan1 prefix fd00:dead:beef::/64
  • # ipv6 lan1 rtadv send 1 m_flag=on
このエントリはここまで。


[1] AAAAレコードを返すDNSサーバを置いても解決できる問題ではありますが
[2] ステートフルの定義を理解できてないかもしれないので間違っていたら教えてください

2014-02-01

DHCPv6について(DUID)

DHCPv6で(各ホスト上の手動設定ではなく)静的にアドレスを振る方法について調べていて、DUIDというものに辿り着いた。忘れないように書きだす。

DUIDとは
色々世の中にはIDを振る方法があるのだけど、DHCPの仕組みで使われる(と思われる)IDの振り方。DHCP Unique Identifierの略。

RFC3315で定義されているDUID
RFC3315(DHCP for IPv6)[1]のSection-9で定義されているDUIDは3つ。

  • DUID-LLT(DUID Based on Link-layer Address Plus Time)
  • DUID-EN(DUID Assigned by Vendor Based on Enterprise Number)
  • DUID-LL(DUID Based on Link-layer Address)

DUID-LLTとDUID-LLに書かれている「Link-layer Address」は日本語でいう物理アドレス、いわゆるMACアドレスのことで、LLTの方はMACアドレスと時刻から導出、LLはMACアドレスから導出という事らしい。
一方でDUID-ENはIANAがメンテしているPrivate Enterprise Numberに各ベンダが持っているIDを振っていく形式のようだ。
これら3つのIDのオフセットはRFC3315を参照。

RFC6355で定義されているDUID
それでいて、RFC6355(DUID-UUID)[2]でもDUIDが定義されている。
DUID-UUIDはRFC4122で定義されているUUIDをそのまま使う(正確にはDUID-Typeである4の後ろにDUID128bitを繋げる144bit)ということ。UUIDはあんまり重複しないのでこれの方が手軽という事なんだろうか。

もうちょっとだけ続くんじゃ(2014/02/04追記)
元々あるDUID-LLTとDUID-LLについて、dhclientがデフォルトで投げるDUIDがDUID-LLTになっているので、何で似たようなものが2つあるのかdhclientのデフォルト設定について調べていたらバグとして報告されていた[3]。
その中でComment21に
> So it seems like we all agree that DUID-LL is the way to go...
AFAIK even the RFC agrees :).
と書いてあり、それならと思って改めてRFC3315を読んでみると、まずDUID-LLTがある理由は

  • DHCPv6クライアントとDHCPv6サーバとの間で重複しないIDが必要
  • NICを機器の間で付け替えたとしても、別々のIDになるようにする
ために、MACアドレスと時刻を複合キーのように扱ってIDとして使う。との事。
ではDUID-LLが定義されている理由は。

This type of DUID consists of two octets containing the DUID type 3,
a two octet network hardware type code, followed by the link-layer
address of any one network interface that is permanently connected to
the client or server device.  For example, a host that has a network
interface implemented in a chip that is unlikely to be removed and
used elsewhere could use a DUID-LL.
要は、「NICを取り外し不可能なプロダクトに限ってDUID-LLを使ってもいいよー」的なノリで書かれているので、デフォルトはDUID-LLみたいな事になっているようだ(RFC3315を書いた時のノリでは)。

それと、DUID-LLTとDUID-LLの3〜4オクテット目に使われるhardware typeはIANAでメンテされていて[4]、どういう風に識別されているかはDUIDを生成するDHCPv6クライアント次第であることにも注意が必要である。(DHCPv6サーバ側でDUIDを元にした処理をする場合があるので。)
具体的には、6(IEEE 802 Networks)かと思ったら1(Ethernet (10Mb))だったりするので。

[1] http://tools.ietf.org/html/rfc3315#section-9
[2] http://tools.ietf.org/html/rfc6355
[3] https://bugzilla.redhat.com/show_bug.cgi?id=560361
[4] http://www.iana.org/assignments/arp-parameters/arp-parameters.xhtml#arp-parameters-2

2014-01-26

Dockerを使ってみる(2)-操作ひと通り

前回のエントリでDebian GNU Linux/jessieのDockerコンテナが出来上がってるので、それをいじりまわす感じで。
# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
utimukat55/debian   jessie              583d969ed337        4 minutes ago       153.3 MB
dockerのインストールが終わっていると、ホスト側にdocker0というNICが追加されますが、どうもここをルーティングする形でゲストから外に通信をするようです。
ルーティング設定と反映のコマンドを実行します。
/etc/sysctlの以下の行をアンコメント。
net.ipv4.ip_forward=1
以下のコマンドを実行して即時有効化
# sysctl -p
net.ipv4.ip_forward = 1

とりあえず起動する
docker images実行結果のIMAGE IDをイメージに指定、シェルを起動するよう引数に指定してコマンドを実行。
# docker run -t -i 583d969ed337 /bin/bash
root@ed7307934a79:/#
 今の状態だとifconfigもないなど色々扱いづらい(個人的に)なので、必要なパッケージを入れます。
# apt-get install net-tools openssh-server vim
vimを入れたので、/etc/apt/sources.listを必要であれば書き換えてミラーを変更します(USになっているので)

commitする!
起動しているbashを抜けると保存されずに終了してしまうので、別のターミナルを開いて、以下のコマンドを実行します。
# docker ps -a
CONTAINER ID        IMAGE                      COMMAND             CREATED             STATUS              PORTS               NAMES
ed7307934a79        utimukat55/debian:jessie   /bin/bash           23 minutes ago      Up 23 minutes                           lonely_euclid
 CONTAINER IDを引数に指定してcommitします。-mでコミットログも付けれるみたいですが未確認。
# docker commit ed7307934a79 utimukat55/debian:jessie
f86c3830f454c1ed1e217b86f09c47df41e2ed1bed22038813b478d1514283cc
commitが終わったら実行してた方を閉じます。exitでいいみたいです(Ctrl-dでも抜けれますがステータスが130になって正常終了じゃないみたいです。詳細不明)

色々と未整理なこと
コンテナを起動して終了すると、状態を記録した?ファイルが増えていきます。確認は以下のコマンドで可能です。
# docker ps -a
CONTAINER ID        IMAGE                      COMMAND             CREATED             STATUS              PORTS               NAMES
b12d2c3979c6        utimukat55/debian:jessie   /bin/bash           19 seconds ago      Exit 130                                boring_albattani  
84883288b0e9        utimukat55/debian:jessie   /bin/bash           About an hour ago   Exit 0                                  insane_shockley  
449810a25bd0        utimukat55/debian:jessie   /bin/bash           About an hour ago   Exit 0                                  grave_darwin        
この中から必要のないものがある場合、docker rmコマンドで削除可能です。引数はCONTAINER IDを指定します。
# docker rm b12d2c3979c6
いろんなコンテナを使っている場合、コンテナの一覧は以下のコマンドで確認できます。(既に出てきていますが)
# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
utimukat55/debian   jessie              583d969ed337        23 minutes ago      153.3 MB
base                latest              b750fe79269d        10 months ago       175.3 MB
base                ubuntu-12.10        b750fe79269d        10 months ago       175.3 MB
base                ubuntu-quantal      b750fe79269d        10 months ago       175.3 MB
base                ubuntu-quantl       b750fe79269d        10 months ago       175.3 MB
必要のないコンテナを削除する場合、docker rmiコマンドを使います。引数はIMAGE IDを指定します。
# docker rmi b750fe79269d
まだまだわかってない事のほうが遥かに多いですがとりあえずここまで。

ここまでやったイメージ
セントラルリポジトリ?にアップロードしました。
使う場合は以下のコマンドでどうぞ。
# docker pull  utimukat55/docker_jessie

Dockerを使ってみる(1)-導入

Dockerとは
いわゆる仮想化ソリューションですが、OSごと仮想化するような感じではなく、カーネル等は共通のものを使いながらユーザーランドを分離するSolarisコンテナみたいなもののようです。今回はいつもどおりDebian GNU/Linux(amd64)で導入します。今のところamd64でしか動作しないようです(Raspberry PIに移植してる人はいるみたいなので将来的にはアーキテクチャ非依存になるかもしれません)。

パッケージの導入
公式サイト[1]を参考にしつつ例によってsudo使わないのでこんな感じ。パッケージ自体はUbuntu用のものがそのまま使えています。
# wget -qO- https://get.docker.io/gpg | apt-key add -  
OK
# echo deb http://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list
# apt-get update
# apt-get install lxc-docker
よくわからなかったのでとりあえずデフォルトのまま。パッケージのインストールはこれで完了。

自前でイメージを作成
Dockerのイメージとして公式のもの[2]もありますが、今回はtesting(今はjessie)のイメージを作りたかったので、自分で作ることにします。Debianの場合はシェルが用意されています。docker searchコマンドで所望のイメージが見つかる場合はこの手順は必要ありません。

https://github.com/dotcloud/docker-debian/blob/master/contrib/mkimage-debian.sh

Rawを右クリックしてリンク先保存。ターミナルでダウンロードしてきた場所に移動して
$ chmod +x mkimage-debian.sh
$ su
# ./mkimage-debian.sh utimukat55/debian jessie
問題なく終われば、
# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
utimukat55/debian   jessie              583d969ed337        4 minutes ago       153.3 MB
みたいな感じでイメージができているはず。このエントリはここまで。

[1] http://docs.docker.io/en/latest/installation/ubuntulinux/
[2] https://index.docker.io/popular Officialと書かれているものは多分安全

2014-01-08

Rictyフォントを生成する

元にしているフォントのライセンス都合上導入に手間のかかるRictyフォント[1]ですが手元のDebian環境で生成してみました。
というのも、Rictyフォントの生成にはfontforgeと2つのフォントが必要ですが、Debianだとパッケージで用意されてるみたいなので手間削減できるかなぁと思い・・・
Rictyフォントの生成
まずはfontforgeとベースとなるフォント(InconsolataとMigu 1M)のDebianパッケージをインストール
# apt-get install fonts-inconsolata fonts-migmix fontforge
次いで生成シェルをダウンロード。githubからgit cloneでもいいんでしょうが、ちょっと手間を惜しんで。
ブラウザで https://github.com/yascentur/Ricty/blob/3.2.2/ricty_generator.sh へ移動
「raw」を右クリック→保存
ターミナル開いてダウンロードしたディレクトリに移動
$ chmod +x ricty_generator.sh
$ ./ricty_generator.sh auto
で、問題がなければシェルが正常終了します。
Ricty-Bold.ttfとRicty-Regular.ttfが実行した場所に生成されるので、フォント追加します。[2]

$ mkdir ~/.fonts
$ cp -f Ricty-{Bold,Regular}.ttf ~/.fonts/
システムワイドに追加したい場合は/usr/local/share/fonts/にコピーすると良いでしょう。
$ fc-cache -vf
追加されたことを確認したい場合は $ fc-list | grep Ricty で確認するといいでしょう。
と思ったものの!!
生成に必要なフォントのうち、Migu 1Mが古いです(Debianのパッケージが)。
単にパッケージングしてないだけかぁと思いつつBTS見てみたら、どうもライセンスが変わったけどどうするのこれ的なの[3]が見つかりうーん。
なお、フォントが古い事が明らかになってしまったので上記手順自体あまりおすすめできなくなってしまいましたが補足。
Rictyの生成手順で書かれている「(MigMixではありません)」をぶっちぎってfonts-migmix[4]をインストールしていますが、migu-1m-regular.ttfとmigu-1m-bold.ttfが20120411版と同じことは確認済みです。

[1] http://save.sys.t.u-tokyo.ac.jp/~yusa/fonts/ricty.html
[2] https://wiki.debian.org/Fonts#Adding_fonts
[3] http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=680036
[4] http://packages.qa.debian.org/f/fonts-migmix.html