Thursday, July 2, 2015

Deep Learning part2

Deep Learning part2

前回のCaffeインストール & 動作確認の続きから。今回は学習済みのモデルを利用してgoogle画像検索で拾ってきた適当な画像を判別するところまでやってみた。

models, net, layer

Caffeによる学習方法を定義する際にmodels, net, layerみたいな用語が出てくる。これらがどういう関係なのかを把握したいのだ。

ソースコード管理上は、こんな感じ。

* models/bvlc_xxxnet/
    - deploy.prototxt
    - solver.prototxt
    - train_val.prototxt
  • ? bvlcってなんぞ?
  • solver.prototxtは学習時のパラメ―タを列挙するようだな
    • 学習で利用するネットの定義
    • 繰り返し回数,ラーニングレートの初期値,テストの実行間隔などのパラメータ。
  • deploy.prototxtとtrain_val.prototxtは、それぞれレイヤのヒエラルキー構造みたいのが書いてるけど、どう使い分けるか不明。→トレーニング時のレイヤネットワークと、判別時のレイヤネットワークってことらしい。

bvlc_alexnetを見てみよう。。

models/bvlc_alexnet/solver.prototxt

net: "models/bvlc_alexnet/train_val.prototxt"
test_iter: 1000
test_interval: 1000
base_lr: 0.01
lr_policy: "step"
gamma: 0.1
stepsize: 100000
display: 20
max_iter: 450000
momentum: 0.9
weight_decay: 0.0005
snapshot: 10000
snapshot_prefix: "models/bvlc_alexnet/caffe_alexnet_train"
solver_mode: GPU

学習で用いるnetにmodels/bvlc_alexnet/train_val.prototxtを参照しているっぽい。solver.prototxtが一番上位の設定なのかな。train_val.prototxtにはレイヤの階層構造が書いてあって結構長い。

What is the purpose of deploy.prototxt?

I know the MATLAB wrapper uses the deploy.prototxt for forward propagation. I think in general it’s used for the deployment of an already trained model.
Also note that you can simply use the deploy.prototxt from the bvlc_reference_caffenet, making sure to change the “name” and “top” of the fc8 layer, as well as the “bottom” of the layer after the fc8 layer, to the name you gave it in train_val.prototxt.

意訳:

Forward propagationのためにMATLABラッパーが使うよ。普通は既に学習済みのモデルをデプロイするために使うねー。それとfc8レイヤ(加えてfc8レイヤ以降のレイヤもだけど)のnameとtopをtrain_val.prototextで設定してやつ変更して使うこともできるよん。


いまいち要領を得ない回答だ…。

うーん。多分だけど、大量のデータを与えて訓練を行うときに利用するのがtrain_val.prototext、訓練済みのモデルを利用して分類を行うときに利用するのがdeploy.prototextなのかなー?→そうらしい。

トレーニング

Brewing ImageNetに書いてあるとおりに、もう少し自分で手を動かして学習とやらをやってみよう…!

まずはデータが必要そうだ。大量の画像データ。ImageNetってとこにILSVRC12 challengeで使われたデータがあるらしい。ILSVRC12 challengeの概要

一部抜粋してきた。

Data

The validation and test data for this competition will consist of 150,000 photographs, collected from flickr and other search engines, hand labeled with the presence or absence of 1000 object categories. The 1000 object categories contain both internal nodes and leaf nodes of ImageNet, but do not overlap with each other. A random subset of 50,000 of the images with labels will be released as validation data included in the development kit along with a list of the 1000 categories. The remaining images will be used for evaluation and will be released without labels at test time.
The training data, the subset of ImageNet containing the 1000 categories and 1.2 million images, will be packaged for easy downloading. The validation and test data for this competition are not contained in the ImageNet training data (we will remove any duplicates).

意訳:

検証及びテストデータ数が150,000。flicker及び他の検索エンジンから集めてきた。手作業で1000カテゴリのラベルを振ってある。この1000カテゴリだが、ImageNetの末端ノードと中間ノードを含んでいる。ただ、重複はしていない。この1000カテゴリに従って、ランダムにピックアップしたラベル付きの50,000枚のイメージが、検証データとしてリリースされる。残りのイメージは、評価、及びテスト時にラベル無しで利用される。トレーニングデータだが、これは1000カテゴリを含んだImageNetのサブセットだ。120万イメージあるからな。パックにしてやったからダウンロードは楽だぜ。この競技での検証データ、テストデータはImageNetのトレーニングデータは含んでないからな。


120万イメージ…データサイズ138GB…こんなの無理に決まってるじゃない!ももも、もう少し小規模なトレーニングデータとそのラベルファイルは無いのか!!

138GBのダウンロードは難しいけど、このダウンロードが終わったとして、次に何をすればいいかは見ておく。このトレーニング用データの他に、データ中の各画像のカテゴリが何であるかを記載した情報が必要になる。この情報を取得するスクリプトがCaffeのリポジトリ中にあったので使う。

./data/ilsvrc12/get_ilsvrc_aux.sh

DIR="$( cd "$(dirname "$0")" ; pwd -P )"
cd $DIR

echo "Downloading..."

wget http://dl.caffe.berkeleyvision.org/caffe_ilsvrc12.tar.gz

echo "Unzipping..."

tar -xf caffe_ilsvrc12.tar.gz && rm -f caffe_ilsvrc12.tar.gz

echo "Done."

tar.gzをダウンロードして展開してるだけだね。こんなファイルが展開される。

$ ls
det_synset_words.txt  imagenet.bet.pickle        synset_words.txt  test.txt   val.txt
get_ilsvrc_aux.sh     imagenet_mean.binaryproto  synsets.txt       train.txt

トレーニングデータの分類はこんな感じにつらつらと書かれている。test.txt, val.txtも同様。それぞれテスト用と検証用なのかな。0ってのがカテゴリ番号だと思われる。999まである。

train.txt

n01440764/n01440764_10026.JPEG 0
n01440764/n01440764_10027.JPEG 0
n01440764/n01440764_10029.JPEG 0
n01440764/n01440764_10040.JPEG 0
n01440764/n01440764_10042.JPEG 0
n01440764/n01440764_10043.JPEG 0

これとは別にカテゴリとカテゴリ名の対応表がこちら。

synset_words.txt

n01440764 tench, Tinca tinca
n01443537 goldfish, Carassius auratus
n01484850 great white shark, white shark, man-eater, man-eating shark, Carcharodon carcharias
n01491361 tiger shark, Galeocerdo cuvieri
n01494475 hammerhead, hammerhead shark
...
n13054560 bolete
n13133613 ear, spike, capitulum
n15075141 toilet tissue, toilet paper, bathroom tissue

ちょうど1000行。カテゴリ番号ではなくて、ディレクトリ名が書いてあるのが気になるが…上から順に0,1,2,...,999ってことでいいのかな。


続いてトレーニングデータのリサイズについて。

You may want to resize the images to 256x256 in advance. By default, we do not explicitly do this because in a cluster environment, one may benefit from resizing images in a parallel fashion, using mapreduce. For example, Yangqing used his lightweight mincepie package. If you prefer things to be simpler, you can also use shell commands, something like:

意訳:

+αでimageを256x256にリサイズしたい奴もいるかもな。デフォルトだと、リサイズはしない設定になっているぜ。クラスタ環境があるやつはMAP-REDUCE使った並列処理でリサイズしたほうがマシだろうしな。例えばだが、Yangqingさんは軽量なmincepleパッケージを使ってたぜ。もっと単純にリサイズだけやりたいんだったらシェルコマンドでやってしまうといいぜ!


で、そのシェルコマンドがこちら。

for name in /path/to/imagenet/val/*.JPEG; do
    convert -resize 256x256\! $name $name
done

Take a look at examples/imagenet/create_imagenet.sh. Set the paths to the train and val dirs as needed, and set “RESIZE=true” to resize all images to 256x256 if you haven’t resized the images in advance.

意訳:

ちなみにexamples/imagenet/create_imagenet.shだが、こいつを開いて訓練用データと検証用データのディレクトリパスを設定しておいてくれ。あと、上の方法でイメージをリサイズしてない場合はRESIZE=trueもな! 全ての画像を256 x 256にするから。


訓練用データと検証用データのデータベース(LevelDB)作成。

作成用のスクリプトが提供されている。中身を見てみよう。

examples/imagenet/create_imagenet.sh から一部抜粋。

GLOG_logtostderr=1 $TOOLS/convert_imageset \
    --resize_height=$RESIZE_HEIGHT \
    --resize_width=$RESIZE_WIDTH \
    --shuffle \
    $TRAIN_DATA_ROOT \
    $DATA/train.txt \
    $EXAMPLE/ilsvrc12_train_lmdb

echo "Creating val lmdb..."

GLOG_logtostderr=1 $TOOLS/convert_imageset \
    --resize_height=$RESIZE_HEIGHT \
    --resize_width=$RESIZE_WIDTH \
    --shuffle \
    $VAL_DATA_ROOT \
    $DATA/val.txt \
    $EXAMPLE/ilsvrc12_val_lmdb

convert_imagesetっていう変換用のプログラムを叩いているだけが。引数に訓練/テスト 画像ディレクトリのパスとtrain.txt(画像のパスとカテゴリのペアが入ったファイル)を渡している。出力がそれぞれ、$EXAMPLE/ilsvrc12_train_lmdb$EXAMPLE/ilsvrc12_val_lmdb。実行するリソースも時間も無いが理解はした…!


Image Mean - 平均画像?

学習のためのモデルが各画像の平均をとった?Image Meanというのを必要とするから、これを作れってことらしい。

./examples/imagenet/make_imagenet_mean.sh

EXAMPLE=examples/imagenet
DATA=data/ilsvrc12
TOOLS=build/tools

$TOOLS/compute_image_mean $EXAMPLE/ilsvrc12_train_lmdb \
  $DATA/imagenet_mean.binaryproto

実行するスクリプトの中身はこんなの。さっき作った訓練用データのLevelDBを引数で渡すと、imagenet_mean.binaryprotoというImage Meanを作ってくれるようだ。。

  • TODO 後でこの平均画像とやらを表示する方法が無いか探ってみよう…。

モデルの定義

モデルの定義(Deep Learning Networkの同義と取っていいのかな)は既に提供されているものがある。このインストラクションではmodels/bvlc_reference_caffenet/train_val.prototxtってのを使うらしい。Krizhevsky らが作ったものベースだと書いてある。

他にも以下のようなものがある。色々調べていると、bvlc_alexnetを使っている人が多いような。ILSVRC12とやらでトップを成績を収めたものをベースにレイヤの配置を改良したものだとか。

  • models/bvlc_alexnet/train_val.prototxt
  • models/bvlc_googlenet/train_val.prototxt
  • models/bvlc_reference_rcnn_ilsvrc13/train_val.prototxt

このファイルの中に上で作成したLevelDBやらImage Meanをパスを記述するところがあるので、別のディレクトリに作ってしまったぜって場合は変更する必要がありそう。各パラメータの意味は今のところよく分からぬ。

あとはこのprototxtファイルの中に2つのネットワーク定義が書かれている。それぞれphase: TRAINphase: TEST。どちらのネットワークもだいたい同じなんだけど、どちらかのフェーズでしか使わないものはinclude { phase: TEST }。こんな感じで区別している。この場合は入力レイヤ(複数)と1つの出力レイヤだけが違うよってことらしい。


学習

./build/tools/caffe train --solver=models/bvlc_reference_caffenet/solver.prototxt

すっごい時間かかりそう。学習を再開したくば(途中で止めていいのかなー?)こうらしい。

./build/tools/caffe train --solver=models/bvlc_reference_caffenet/solver.prototxt --snapshot=models/bvlc_reference_caffenet/caffenet_train_10000.solverstate

学習済みモデルの取得

ImageNetのデータ(133G)を学習させるのは諦めた。代わりに学習済みモデルをダウンロードして、識別が上手くいくかを先に試したい。

https://github.com/BVLC/caffe/tree/master/models/bvlc_reference_caffenet に学習済みモデルデータが配布されていた。こいつを使うぞ。

cd models/bvlc_reference_caffenet
wget http://dl.caffe.berkeleyvision.org/bvlc_reference_caffenet.caffemodel

データサイズが233Mあるけどトレーニングデータ(138GB)に比べればマシである。

学習済みモデルを使った分類

こちらの記事を参考にpythonのスクリプトを改修して猫画像の分類をやってみた。

cd ~/caffe
cp models/bvlc_reference_caffenet/deploy.prototxt works/
cp models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel works/
cp python/caffe/imagenet/ilsvrc_2012_mean.npy works/
# 猫画像をworks下にダウンロード

実行するpythonスクリプト。

import numpy as np
import matplotlib.pyplot as plt
import sys
caffe_root = '../'
sys.path.insert(0, caffe_root + 'python')
import caffe

# Set the pathes of model definition, trained model and image file to be predicted
MODEL_FILE = './deploy.prototxt'
PRETRAINED = './bvlc_reference_caffenet.caffemodel'
IMAGE_FILE = './cat.jpg'

# load classifier
net = caffe.Classifier(MODEL_FILE, PRETRAINED,
                       mean=np.load('./ilsvrc_2012_mean.npy').mean(1).mean(1),
                       channel_swap=(2,1,0),
                       raw_scale=255,
                       image_dims=(256, 256))

#net.set_phase_test()
#caffe.set_phase_test()
#net.set_mode_cpu()
caffe.set_mode_cpu()

# load image file to be predicted
input_image = caffe.io.load_image(IMAGE_FILE)

# predict
prediction = net.predict([input_image])
sorted_predict = sorted(range(len(prediction[0])),key=lambda x:prediction[0][x],reverse=True)

# print top5 result
for i in sorted_predict[0:5]:
    print 'class=',i,', score=',prediction[0][i]

# plot image and result
plt.subplot(2,1,1)
plt.imshow(input_image)
plt.subplot(2,1,2)
plt.plot(prediction[0])
plt.show()

実行するよ。

python
execfile('imagenet.py')
...
E0702 18:35:09.714195 12505 upgrade_proto.cpp:618] Attempting to upgrade input file specified using deprecated V1LayerParameter: ./bvlc_reference_caffenet.caffemodel
I0702 18:35:09.836817 12505 upgrade_proto.cpp:626] Successfully upgraded file specified using deprecated V1LayerParameter
class= 285 , score= 0.496321
class= 281 , score= 0.395892
class= 282 , score= 0.081973
class= 287 , score= 0.00814288
class= 284 , score= 0.00703797

deprecatedなパラメータ使ってるぜ!と言われたものの、結果は出てきた。2012年度のモデル?使ってるから古いのかなー。とにかく、class=285なんじゃない?とのこと。285ってなんだろう。対応表を見て確認してみる。

data/ilsvrc12/synset_words.txt

285 n02124075 Egyptian cat
281 n02123045 tabby, tabby cat
282 n02123159 tiger cat
287 n02127052 lynx, catamount
284 n02123597 Siamese cat, Siamese

おぉ…いい線いってるぞ。だとは認識されている。Egyptian catで検索した画像がこちら。確かに特徴がよく似ている気がする…!なんか感動した!!

次は自前の画像データとカテゴリを用意して学習をやってみたい。つづく。

参考リンク

Written with StackEdit.

Wednesday, July 1, 2015

Deep Learning part1

Deep Learning part1

最近周りでよく話を聞くようになったDeep Learningとやらに触ってみるのです。Deep Learningを構成する各技術の細かい話と、実際にDeep Learningを使ってみる話を進めているけど、ここでは実際に使ってみるをやりたい…!

今回はインストールと動作確認までやるぞ。

Caffe

Deep Learningを実装したライブラリはいくつかあるが、中でもpythonで書かれたものが多い印象。今回は画像認識に特化しているというCaffeというものを触ってみる。

環境

Windows 8.1の上にHyperVでubuntu 14.04を用意した。このubuntuの上にCaffeの実行環境を構築する。

  • python 3.3+で動くと公式が書いているから3系を入れるか…保険を兼ねてpyenvを導入しておく。→やっぱり3.3+系は駄目だったでござる。
  • 本当はCUDA使えるnVidiaのGPUが欲しいところだけどそんなものはない。CPUモードで頑張ってみよう。

インストール

# (1)
sudo apt-get install git gcc make openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev
sudo apt-get install gfortran
sudo apt-get install python-numpy
git clone https://github.com/yyuu/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
source ~/.bash_profile
pyenv install 2.7.10
# (2)
git clone https://github.com/BVLC/caffe.git
# (3)
sudo apt-get install libatlas-base-dev
# (4)
sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler
# (5)
cd caffe
cp Makefile.config.example Makefile.config
vim
+ CPU_ONLY := 1
- #  CPU_ONLY := 1
make all
make test
make runtest
(6)
cd python
for req in $(cat requirements.txt); do pip install $req; done
cd ../
make pycaffe
(7)
echo 'export PYTHONPATH=~/projects/caffe/python/:$PYTHONPATH' >> ~/.bashrc
source ~/.bashrc

(1)

Caffeが必要とするパッケージ類をつらつらとインストール。pythonは3.3+系だと動かないかもな(そして実際その通りだった)と思ってpyenvを導入してバージョンを簡単に切り替えできるようにした。2.7.10で多分動いたと思う。


(2)

Caffeのリポジトリをclone。


(3)

BLASのインストール。

The BLAS (Basic Linear Algebra Subprograms) are routines that provide standard building blocks for performing basic vector and matrix operations.

ふむ…ベクトル・行列計算用のライブラリってところか。


(4)

(1)と同じく、必要らしいパッケージのインストール。


(5)

Caffe本体をビルド・インストール。Surface3 ProにNVidiaのGPUがささっているわけないので、CPUモードに変更してあるよ。


(6)

CaffeのPythonクライアントのインストール。ここのpipインストールに結構時間がかかるorz。後、フォートランのコンパイラが無いぞ!とかね。


(7)

PythonのパスにCaffeを追加して、おそらくインストール完了と思われる。

Trouble Shooting

ImportError: No module named 'scipy'

pip installの最中にImportError: No module named 'scipy'って言われる。インストールできてないし、そりゃそうだ。fortranのコンパイラを入れてなかったのかいけなかった。

sudo apt-get install gfortran

python 3.3+だとimport caffeした時にいろいろエラー

python 2.7.10に切り替えてみる。時間かかって面倒だけどpip installもやり直し。

yukaary@yukaary-ubuntu-ein:~/projects/caffe/python$ python
Python 2.7.10 (default, Jul  1 2015, 15:55:03) 
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import caffe
libdc1394 error: Failed to initialize libdc1394
>>> caffe
<module 'caffe' from 'caffe/__init__.py'>

うまくいったなぁ。2015/7/1現在、まだpython 3系は怪しいっぽいね。

CUDAのインストールって必要か?

インストールはこんな感じ。1,2Gくらいダウンロードするから時間がかかる。

wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1404/x86_64/cuda-repo-ubuntu1404_7.0-28_amd64.deb
sudo dpkg -i cuda-repo-ubuntu1404_7.0-28_amd64.deb
sudo apt-get update
sudo apt-get install cuda

NVidiaのグラフィックボードで、かつCUDAサポートしているものが無いと意味ないと思うんだけどな。うん…CPUモードで動かす環境しかない時はこれいらない気がする。

動作確認

cd ~/projects/caffe/data/mnists
./get_mnist.sh
cd ~/projects/caffe
vim 
./examples/mnist/create_mnist.sh
./examples/mnist/train_lenet.sh

mnistの手書き数字のデータかな?よく使われてる。GPUモードの設定になっているからCPUモードに変えておく。

最終的にこんな出力がでてきたらうまくいってるんじゃないかな…!!CPUx2割り当てたゲストマシン(ubuntu 14.04)上で、およそ30分かかった。

$ vim examples/mnist/lenet_solver.prototxt 
yukaary@yukaary-ubuntu-ein:~/projects/caffe$ ./examples/mnist/train_lenet.sh 
libdc1394 error: Failed to initialize libdc1394
I0701 17:00:13.311028 41368 caffe.cpp:117] Use CPU.
I0701 17:00:13.311414 41368 caffe.cpp:121] Starting Optimization
I0701 17:00:13.315642 41368 solver.cpp:32] Initializing solver from parameters: 
test_iter: 100
test_interval: 500
...
I0701 17:33:45.084625 41368 solver.cpp:486] Iteration 9900, lr = 0.00596843
I0701 17:34:00.747910 41368 solver.cpp:361] Snapshotting to examples/mnist/lenet_iter_10000.caffemodel
I0701 17:34:00.758690 41368 solver.cpp:369] Snapshotting solver state to examples/mnist/lenet_iter_10000.solverstate
I0701 17:34:00.814043 41368 solver.cpp:276] Iteration 10000, loss = 0.00441304
I0701 17:34:00.814121 41368 solver.cpp:294] Iteration 10000, Testing net (#0)
I0701 17:34:08.871933 41368 solver.cpp:343]     Test net output #0: accuracy = 0.9904
I0701 17:34:08.872099 41368 solver.cpp:343]     Test net output #1: loss = 0.0295519 (* 1 = 0.0295519 loss)
I0701 17:34:08.872123 41368 solver.cpp:281] Optimization Done.
I0701 17:34:08.872136 41368 caffe.cpp:134] Optimization Done.

出力の最初のほうに、どういうレイヤ構成で実行するか書き出してあるね。。これをカスタマイズできると、場合によってはもっと良い学習ができるんだろうな。

次回以降

自前のデータを用意して学習させたいな。させたいな。少しずつ使い方を覚えていこう。

ああ~~~NVidiaのCUDA使えるGPUが欲しいんじゃ~~~。

参考サイト

よく分からない用語の整理

Pooling

画像処理絡みの用語で、filtering、normalization辺りは分かるけど、Poolingってなんじゃろな?画像を細かく切り出してプールしておくって話なのか?

Max Pooling 法とは、あるウィンドウサイズの中で 最大の値を代表値としてサブサンプリングする方法。ウィンドウの中から最も特徴が大きいと考えられる値を拾うため、多少 位置がずれた複数の入力に対しても同じ / 似た 特徴を拾ってくることが期待できる。

むむむ。あながち外れでもないような…。Max Poolingで16x16の領域から最大値を特徴として採用するのかな。元画像が512x512だとすると1/32に圧縮できるわけだから、学習時の負荷が軽くなるよね。


Ir = 0.XXXXXXXXXX

下記、Caffeの出力…lrってなんぞ?学習レートのことか。lr = 0.01から始まって、イテレーション5000の時点でlr = 0.00737788。学習完了時(イテレーション9900)、lr = 0.00596843

I0701 17:20:05.479260 41368 solver.cpp:229]     Train net output #0: loss = 0.00537964 (* 1 = 0.00537964 loss)
I0701 17:20:05.479288 41368 solver.cpp:486] Iteration 5900, lr = 0.0070624

抜粋

For each training iteration, lr is the learning rate of that iteration, and loss is the training function. For the output of the testing phase, score 0 is the accuracy, and score 1 is the testing loss function.


loss = 0.00537964

せっかくなのでlossについても。以下の記述を読む限りコスト関数なのかな。値が小さいほど、よく学習しているってことだと思う。loss = 2.46122から始まって、イテレーション5000の時点でloss = 0.0245493。学習完了時、loss = 0.00441304

抜粋

In Caffe, as in most of machine learning, learning is driven by a loss function (also known as an error, cost, or objective function).

Written with StackEdit.

Sunday, April 5, 2015

ホスト名からASの情報を引き出したかった

最近ネットワーク絡みの話をすることが多くなった。そんな中、BGPとかの話が面白かったので色々と調べているうちに、ホスト名からAS(Autonomous System)を確認したいな~と思うようになり、今回のお話に至る。

ASの情報をどやって取るのか?

本来ならBGPルーターにアクセスできるような環境に居ないとASの情報にはアクセスできないような気がする。Tier 1 のASが持つBGPルーターだったら間違いなく全情報を格納しているらしいが…。日本絡みだとNTT Communications。

一般人がそんな環境にいるわけないのでどうするかというと、ASの情報を提供してくれるWebServiceを使うのが手っ取り早い。

  • cyclops
  • whoisコマンド
    • ここのwhoisサーバーはAS Numberまで出してくれる…!

とはいえブラウザ開くのも面倒だし、他者任せもなんだかな…と思っていたら、IP-ASのデータベースを公開してくれているサイトを見つけた。

http://dev.maxmind.com/geoip/legacy/geolite/

リアルタイムじゃなくてある時点のスナップショットだけど、別に今の情報じゃなくても構わないで問題なし。上のデータベースを読み込んでくれるnode-maxmindというnode.jsのモジュールがあったので、こいつを使って簡単なスクリプトを書くことにした!

スクリプト

IPではなくホスト名からAS Numberを調べられるようにするぞ。

aslookup.coffee

dns = require('dns')
maxmind = require('maxmind')
maxmind.init('GeoIPASNum.dat')

aslookup = (hostname) ->
    dns.lookup(hostname, (err, addresses, family) ->
        #console.log('err:', err)
        org = maxmind.getOrganization(addresses)
        console.log('hostname:', hostname)
        console.log('addresses:', addresses)
        console.log('orgnization:', org)
        return
    )

module.exports = aslookup

シンプルって素晴らしい!!これをjsに変換して、またもcoffee scriptから呼び出せば完成なり。

# .jsにコンパイル
$ coffee -bc aslookup.coffee

サンプルコード

aslookup = require('./aslookup')
aslookup('stackedit.io')
aslookup('twitter.com')
aslookup('www.niconicovideo.jp')

実行結果

hostname: stackedit.io
addresses: 54.173.194.190
orgnization: AS14618 Amazon.com, Inc.
hostname: twitter.com
addresses: 199.59.148.82
orgnization: AS13414 Twitter Inc.
hostname: www.niconicovideo.jp
addresses: 210.253.127.207
orgnization: AS7506 GMO Internet,Inc

非同期処理だから出力順が変わるのは仕様…!(めんどうくさかったのだ)。

  • stackeditはAWSっぽいね。
  • twitterとニコニコは自分のASを持っているみたいだ。

Written with StackEdit.

Saturday, March 7, 2015

VirtualBoxとHyper-VでL2TPv3/IPSEC

よ、ようやくそれなりの動作ができたぞ…。

tcpdumpしてARP Replyがどこで止まってるか調べてようやく分かった….。プロミスキャスモード、許すまじ。

  • VirtualBox プロミスキャスモード…全て許可
  • Hyper-V MACアドレスのスプーリングを有効にする

ハイパーバイザx2に上の設定をしておかないとホストを跨いだpingが完全に通らなくなる。それ以外は、既存ブログの情報を頼りになんとかなったんだよ….。後日まとめる疲れた。

VyOSの設定

VyOS1 on virtualbox, OSX

interfaces {
    bridge br0 {
        address 172.16.1.1/24
        aging 300
        hello-time 2
        max-age 20
        priority 0
        stp false
    }
    ethernet eth0 {
        address dhcp
        duplex auto
        hw-id 08:00:27:bf:73:20
        smp_affinity auto
        speed auto
    }
    ethernet eth1 {
        bridge-group {
            bridge br0
        }
        duplex auto
        hw-id 08:00:27:53:ca:af
        smp_affinity auto
        speed auto
    }
    l2tpv3 l2tpeth0 {
        bridge-group {
            bridge br0
        }
        destination-port 5000
        encapsulation udp
        local-ip 192.168.100.102
        peer-session-id 2000
        peer-tunnel-id 4000
        remote-ip 192.168.100.103
        session-id 1000
        source-port 5000
        tunnel-id 3000
    }
    loopback lo {
    }
}
service {
    ssh {
        port 22
    }
}
…(省略)…
vpn {
    ipsec {
        esp-group ESP-1W {
            compression disable
            lifetime 3600
            mode transport
            pfs enable
            proposal 1 {
                encryption aes256
                hash sha1
            }
            proposal 2 {
                encryption aes256
                hash sha1
            }
        }
        ike-group IKE-1W {
            ikev2-reauth no
            key-exchange ikev1
            lifetime 28800
            proposal 1 {
                encryption aes256
                hash sha1
            }
            proposal 2 {
                encryption aes256
                hash sha1
            }
        }
        ipsec-interfaces {
            interface eth0
        }
        nat-networks {
            allowed-network 0.0.0.0/0 {
            }
        }
        site-to-site {
            peer 192.168.100.103 {
                authentication {
                    mode pre-shared-secret
                    pre-shared-secret ****************
                }
                connection-type initiate
                ike-group IKE-1W
                ikev2-reauth inherit
                local-address 192.168.100.102
                tunnel 1 {
                    allow-nat-networks disable
                    allow-public-networks disable
                    esp-group ESP-1W
                    local {
                        port 5000
                    }
                    remote {
                        port 5000
                    }
                }
            }
        }
    }
}

VyOS2 on Hyper-V, Windows 8.1 Pro

interfaces {
    bridge br0 {
        address 172.16.1.10/24
    }
    ethernet eth2 {
        bridge-group {
            bridge br0
        }
        hw-id 00:15:5d:64:65:20
    }
    ethernet eth3 {
        address dhcp
        hw-id 00:15:5d:64:65:1f
    }
    l2tpv3 l2tpeth0 {
        bridge-group {
            bridge br0
        }
        destination-port 5000
        encapsulation udp
        local-ip 192.168.100.103
        peer-session-id 1000
        peer-tunnel-id 3000
        remote-ip 192.168.100.102
        session-id 2000
        source-port 5000
        tunnel-id 4000
    }
    loopback lo {
    }
}
service {
    ssh {
        port 22
    }
}
...(省略)...
vpn {
    ipsec {
        esp-group ESP-1W {
            compression disable
            lifetime 3600
            mode transport
            pfs enable
            proposal 1 {
                encryption aes256
                hash sha1
            }
        }
        ike-group IKE-1W {
            key-exchange ikev1
            lifetime 28800
            proposal 1 {
                dh-group 5
                encryption aes256
                hash sha1
            }
        }
        ipsec-interfaces {
            interface eth3
        }
        nat-networks {
            allowed-network 0.0.0.0/0 {
            }
        }
        site-to-site {
            peer 192.168.100.102 {
                authentication {
                    mode pre-shared-secret
                    pre-shared-secret ****************
                }
                ike-group IKE-1W
                local-address 192.168.100.103
                tunnel 1 {
                    esp-group ESP-1W
                    local {
                        port 5000
                    }
                    remote {
                        port 5000
                    }
                }
            }
        }
    }
}

Friday, March 6, 2015

逆ポートフォワードを使ったprivate net上マシンへの接続

前回はL2TP/IPsecでVPN接続したけど、今回はあらかじめprivate network内のマシンからpublic network内のマシンにssh逆ポートフォワードしておけば、public network側のマシンのポートからprivate network内のマシンに入れるよねってのを実際にやってみたのだ。

ネットワーク構成

 [Surface3]    [ubuntu 14.04]
     | .102          | .104
----------------------- public:192.168.100.0/24
  | .101    | .103
[iMac]    [VyOS]
  | .200    | .1
---------------------- private:172.16.1.0/24
       | .201
     [RPi]

[XXX]...マシンの名前
  • ubuntu 14.04はSurface3上の仮想マシン(HyperV ブリッジ接続)
  • VyOSはiMac上の仮想マシン(Virtualbox ブリッジ接続 x 2)
  • private -> public はNATで出ていく
  • public側のルータはWiMaxルータだよ

と、構成上はともかく、実際のネットワーク接続は物理/仮想マシンが入り乱れたカオスな状態。

逆ポートフォワード

で、どういうssh接続をしたいかというと、あらかじめRPi(172.17.6.201:22)からubuntu 14.04(192.168.100.104:10022)に逆ポートフォワードしておき、Surface3(192.168.100.102)からubutntu 14.04の10022番にssh接続すると、RPiに接続するという感じ。

[RPi]--------[ubuntu 14.04]-----[surface3]
  |_______________↑ ↑______________|
    22 -> 10022          ssh -p 10022 pi@192.168.100.104

デフォルトのsshdの設定だと、逆ポートフォワードした時にIPを127.0.0.1(localhost)にバインドしちゃうから、これを0.0.0.0(任意のIP)にバインドするよう設定変更する。

ubuntuの/etc/ssh/sshd_config:

...
# 追加
Match User yukaary
    GatewayPorts yes

そんで設定を反映。

$ sudo service reload ssh

RPiにiMacからsshログインして以下のコマンドを実行。

ssh -f -N -R 10022:127.0.0.1:22 yukaary@192.168.100.104
yukaary@192.168.100.104's password: <ubuntu 14.04のパスワード>

これで完了。ubuntu 14.04側でTCPポートの状態を見てみる。

yukaary@yukaary-ubuntu-ein:~$ sudo netstat -tapn
[sudo] password for yukaary: 
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:10022           0.0.0.0:*               LISTEN
...(省略)...   

よしよし。ちゃんと待ち受けているね。ssh接続するとどうなるのか!!

$ ssh -p 10022 pi@192.168.100.104
Linux raspberrypi 3.18.7-v7+ #755 SMP PREEMPT Thu Feb 12 17:20:48 GMT 2015 armv7l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Fri Mar  6 13:43:33 2015 from localhost
pi@raspberrypi ~ $ 

192.168.100.104:10022 --> 172.17.6.201:22という感じに繋がったのです。L2TP/IPsecに比べると、10022番しか空いてないから自由度は落ちるわけですがー。単に別ホスト(組織)の内部ネットワークに入りたかったら、こういう方法もあるということだったので試してみた。

Sunday, March 1, 2015

VyOSを使ってvpn(l2tp/ipsec)を設定

前記事の続き。VyOSを使って2台のホストマシン(iMac, Surface3)のprivate networkを連結させ、あわよくばその上にvxlanを複数定義するのが最終目的。

まずは前座?としてL2TP over IPSECをやってみる。参考記事

vyos@vyos# configure
vyos@vyos# edit vpn ipsec
vyos@vyos# set ipsec-interface interface eth0
vyos@vyos# set nat-traversal enable
vyos@vyos# set nat-networks allowed-network 0.0.0.0/0
vyos@vyos# commit
VPN Warning: IPSec configured but no site-to-site peers or l2tp remote-users configured

IPSecは設定したけどsite-to-siteのピアを設定していないか、l2tpのリモートユーザを設定していないよって警告が。これだけだと特に意味ないよってことかな。

続きましてl2tpの設定。

一度馬鹿な設定をしてl2tpの設定をクリアするはめにorz delete vpn l2tpという形でshow configurationで表示される階層に従って消したい要素を指定すれば消してくれるみたい。

vyos@vyos:~$ configure
vyos@vyos# edit vpn l2tp remote-access
vyos@vyos# set ipsec-settings authentication mode pre-shared-secret
vyos@vyos# set ipsec-settings authentication pre-shared-secret makimaki
vyos@vyos# set authentication mode local
vyos@vyos# set authentication local-users username yukaary password craft
vyos@vyos# set outside-address 192.168.100.103   
vyos@vyos# set client-ip-pool start 172.16.1.100
vyos@vyos# set client-ip-pool stop 172.16.1.110
vyos@vyos# commit
vyos@vyos# save

これで設定できたはず。L2スイッチで繋がっていないSurface3から、前回iMacを中心に構成したprivate-net上のraspberry pi(172.17.6.201)に繋がれば、VPNに接続できたと思っていいかな。

この時点でホストマシンのOSXからはVPN接続設定を作れば、接続することができた。ネットワークデバイスを表示するとこんな感じになる。

yukaarybox:~ yukaary$ ifconfig
...
p2p0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 2304
    ether 0a:30:62:53:0e:c5 
    media: autoselect
    status: active
...
ppp0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1280
    inet 172.16.1.101 --> 10.255.255.0 netmask 0xffffff00 

Surfacre 3 (windows 8.1)のほうは、なんでか繋がらない。VyOSのログを見ると、繋ごうと努力はしているみたいだが…。

ログ:

Mar  1 11:07:20 vyos pluto[4240]: "remote-access-mac-zzz"[11] 192.168.100.101 #23: responding to Main Mode from unknown peer 192.168.100.101
Mar  1 11:07:20 vyos pluto[4240]: "remote-access-mac-zzz"[11] 192.168.100.101 #23: Oakley Transform [AES_CBC (256), HMAC_SHA1, ECP_384] refused due to strict flag
Mar  1 11:07:20 vyos pluto[4240]: "remote-access-mac-zzz"[11] 192.168.100.101 #23: Oakley Transform [AES_CBC (128), HMAC_SHA1, ECP_256] refused due to strict flag
Mar  1 11:07:20 vyos pluto[4240]: "remote-access-mac-zzz"[11] 192.168.100.101 #23: Oakley Transform [AES_CBC (256), HMAC_SHA1, MODP_2048] refused due to strict flag
Mar  1 11:07:20 vyos pluto[4240]: "remote-access-mac-zzz"[11] 192.168.100.101 #23: Oakley Transform [3DES_CBC (192), HMAC_SHA1, MODP_2048] refused due to strict flag
Mar  1 11:07:20 vyos pluto[4240]: "remote-access-mac-zzz"[11] 192.168.100.101 #23: NAT-Traversal: Result using RFC 3947: no NAT detected
Mar  1 11:07:20 vyos pluto[4240]: "remote-access-mac-zzz"[11] 192.168.100.101 #23: Peer ID is ID_IPV4_ADDR: '192.168.100.101'
Mar  1 11:07:20 vyos pluto[4240]: "remote-access-mac-zzz"[11] 192.168.100.101 #23: sent MR3, ISAKMP SA established
Mar  1 11:07:20 vyos pluto[4240]: "remote-access-mac-zzz"[11] 192.168.100.101 #24: responding to Quick Mode
Mar  1 11:07:20 vyos pluto[4240]: "remote-access-mac-zzz"[11] 192.168.100.101 #24: IPsec SA established {ESP=>0x232363ae <0xc03d70aa}
Mar  1 11:07:22 vyos pluto[4240]: "remote-access-mac-zzz"[11] 192.168.100.101 #23: received Delete SA(0x232363ae) payload: deleting IPSEC State #24
Mar  1 11:07:22 vyos pluto[4240]: "remote-access-mac-zzz"[11] 192.168.100.101 #23: received Delete SA payload: deleting ISAKMP State #23
Mar  1 11:07:22 vyos pluto[4240]: "remote-access-mac-zzz"[11] 192.168.100.101: deleting connection "remote-access-mac-zzz" instance with peer 192.168.100.101 {isakmp=#0/ipsec=#0}

192.168.100.101がSurface 3のIP。refused due to ...ってメッセージと、その時に記載されている暗号化方式っぽいのが気になる木…。

色々原因を探っていたら、それIPSECの設定が足りてないよって記事を見つけた。これ

You should provide the standard that you would like to the encryption proposals (aes128, aes256 or 3des), and the hashing function preferred (md5, sha1, sha256, sha384 and the newest sha512).
You should use what you would like as the encryption standard, now VyOS

「利用可能な暗号化方式を提供しないといけないよ!あとお好みのハッシュ関数もね!」みたいな感じ? IPSECを使った通信をするときに、利用可能な暗号化方式をVyOSが接続側に教えてあげないといけないとか、そういう事だろうか。この辺は、まだ知識無いからあとでゆっくり調べるとして、まずは書いてある通りにIPSECの設定を追加してみるよ。

vyos@vyos:~$ configure
vyos@vyos# set vpn ipsec esp-group ESP-1W compression disable         
vyos@vyos# set vpn ipsec esp-group ESP-1W lifetime 3600      
vyos@vyos# set vpn ipsec esp-group ESP-1W mode tunnel  
vyos@vyos# set vpn ipsec esp-group ESP-1W pfs enable 
vyos@vyos# set vpn ipsec esp-group ESP-1W proposal 1 encryption aes256
vyos@vyos# set vpn ipsec esp-group ESP-1W proposal 1 hash sha1
vyos@vyos# set vpn ipsec esp-group ESP-1W proposal 2 encryption aes256
vyos@vyos# set vpn ipsec esp-group ESP-1W proposal 2 hash sha1
vyos@vyos# set vpn ipsec ike-group IKE-1W proposal 1 encryption aes256
vyos@vyos# set vpn ipsec ike-group IKE-1W proposal 1 hash sha1
vyos@vyos# set vpn ipsec ike-group IKE-1W proposal 2 encryption aes256
vyos@vyos# set vpn ipsec ike-group IKE-1W proposal 2 hash sha1
vyos@vyos# set vpn ipsec ike-group IKE-1W key-exchange ikev1
vyos@vyos# set vpn ipsec ike-group IKE-1W lifetime 28800    
vyos@vyos# commit
vyos@vyos# save
vyos@vyos# exit

続いてWindows 8.1側。(なんでこんな面倒くさいんだ!)

コントロールパネル:ネットワークと共有センター:新しい接続またはネットワークのセットアップを開いて、「職場に接続します」を選択、次の画面で「インターネット接続(VPN)を利用します」を選ぶ。VPNへの接続先gatewayにIP(今回の場合、192.168.100.103)を打ち込むと、なんかデフォルト設定で接続しようと試みる…が上手くいかない。

このあと、「ネットワーク接続」を開くと「VPN接続」というアイテムが追加されているので、そいつのプロパティを開く。

「セキュリティ」タブの以下の項目を変更する。

  • VPNの種類:IPSecを利用したレイヤー2トンネリングプロトコル(L2TP/IPSec)
  • 上の詳細設定を開いて「認証に事前共有キーを使う」に変更
    • パスワードは今回の場合は「makimaki」
  • データの暗号化:暗号化が必要(サーバーが拒否する場合は切断します)
  • 認証:「次のプロトコルを許可する」に変更
    • その下の項目をとりあえず全チェック

ここまでやった後に、ネットワーク(画面右端に出現する現在の接続情報と接続先候補のメニュー)を開いて、「接続:VPN接続」を選択、最初はアカウントとパスワードを聞かれる。VyOS上に登録したやつを入力して接続をリクエストすると…繋がった!

2回目以降はアカウントとパスワードを記憶してくれている模様

ipconfigすると「PPPアダプター VPN接続」って名前でIPをもらえていた。やったぜ。

最終確認

VPN接続状態で、iMACと物理L2スイッチ(ハブ)で繋がっているRaspberryPi(private-net)に接続できるか確認。

$ ssh pi@172.16.1.201
<このあと、普通に接続できましたー!>

Sunday, February 22, 2015

Private network for Raspberry Pi with VyOS on virtual box under WiMax internet connection

妙ちくりんなタイトルだけど、必要に迫られてやった。

必要に迫られた悲しい背景

  • 自宅のネット環境はWi-Maxのルータのみ。
  • Raspberry PiにWiFiドングル挿して上のルータからIPもらえるけど通信が凄まじく不安定
    • sshログインするも、反応が悪くて使い物にならない

ほんだい

というわけで、こんなことを考えたのだ。

                        en1^eth0:192.168.100.103
                          /
                         /---- en0^eth1:172.16.1.1/24
                       [vyos] 
                          |
                       <bridge>...(virtualbox)
                          |
~-[WiMax Router]--<無線>--[iMac]--<有線>--[L2スイッチ]--<有線>--[RPi]
   /                      /-- en0:172.16.1.200/24             /
 192.168.100.1          en1:192.168.100.100                 eth0:172.16.1.201
  • [WiMax Router]の左先はインターネット行き。

iMacは無線用のNIC(en1)と有線用のNIC(en0)を2つ持っている。で、無線用のen1はWiMaxルーターに接続していて、これがインターネットに繋がっている。普通は無線がインターネットの環境って外出先か、固定回線引くのをケチって自宅でも使っている残念な人(わたくしめです)しかいない。

で、当然ながら有線用のen0が余っているので、こいつをプライベートネット用に使う。OSXにルーターやらせるのも変(そもそも出来るかも調べてない)なので、virtualbox上でルーター専門のOS?であるVyOSを動かして、こいつにプライベートネットを管理(主にdhcpサーバー)してもらおうと考えた!

  • Rpiのeth0とiMacのen0はiMacのVirtualbox上で動いているVyOS君が提供しているdhcpサービスからIPアドレスを貰うよ。
  • VyOSにNAT(IPマスカレード)を設定してRpiからインターネットに疎通できるようにするよ。

と、やりたい事は至ってシンプル…!では、さっそくやっていく。

L2スイッチは、ヨドバシで適当なものを買ってきてiMacとRpiを繋いである。

VyOSの設定

スイッチ類の接続が終わったら、基本VyOS上でがちゃがちゃコマンドを打つだけ。

ここからvyos-1.1.3-amd64.isoをダウンロード。
virtual boxの仮想マシンを作成。

仮想マシンのスペック

  • Linux (Debian 64bit)
  • プロセッサ x1
  • Memory 1G
  • Disk 10G
  • ブリッジアダプタ en1 - インターネット接続
  • ブリッジアダプタ en0 - プライベートネット接続

インストール

isoファイルをvirtualbox上でマウントして起動。vyos/vyosでログインしてインストールコマンドを叩く。

vyos@vyos:~$ install system

色々と聞かれるけども、基本的にデフォルトのままでいい。Yes/Noで聞かれるところはYesと打っておかないと先に進まない所が一箇所。

インストール完了後、念のため再起動をかけた。もちろんマウントしたisoは抜いておく。

sshログインの設定とか

# WiMaxルーターからIPアドレスをモラウノデス
$ configure
$ set interfaces ethernet eth0 address dhcp
$ set interfaces ethernet eth0 description 'external'
# sshサービスを起動. 22番ポートで待ち受け
$ set service ssh port '22'
$ commit
$ save
$ exit

この時点でshow interfacesでNICの状態を確認すると、WiMaxルーターからIPアドレス貰えてるはず。このIPでもsshログインできるけど、eth1に静的IPアサインしてから、そのIPでホストマシンからsshログインしたほうがマシかな。

初期設定

利用可能なプライベート用IPアドレスは172.16.1.0/24にした。VyOSに静的にIPアドレス(172.16.1.1)を振る。

vyos@vyos:~$ configure
vyos@vyos# set interfaces ethernet eth1 address 172.16.1.1/24     
vyos@vyos# commit
# ただの確認. IPアドレスが設定された!
vyos@vyos# show interfaces
 ethernet eth0 {
     address dhcp
     description external
     duplex auto
     hw-id 08:00:27:bf:73:20
     smp_affinity auto
     speed auto
 }
 ethernet eth1 {
     address 172.16.1.1/24
     duplex auto
     hw-id 08:00:27:53:ca:af
     smp_affinity auto
     speed auto
 }
 loopback lo {
 }
# 設定反映
vyos@vyos# save
vyos@vyos# exit

続いてdhcpサービスを起動させる。

vyos@vyos:~$ configure
# DHCPの割り当てレンジは200〜250。51台も使うと思えないが!
vyos@vyos# set service dhcp-server shared-network-name yukayatta subnet 172.16.1.0/24 start 172.16.1.200 stop 172.16.1.250
vyos@vyos# set service dhcp-server shared-network-name yukayatta subnet 172.16.1.0/24 default-router 172.16.1.1
# DNSはとりあえずgoogle先生のところでいいか...(8.8.8.8)
set service dhcp-server shared-network-name yukayatta subnet 172.16.1.0/24 dns-server 8.8.8.8
vyos@vyos# commit
vyos@vyos# save
Saving configuration to '/config/config.boot'...
Done
vyos@vyos# exit
  • yukayattaは適当に付けただけ。

続いてNATの設定。RPiに割り振られる予定のプライベートIPアドレス(172.16.1.2XX)だとインターネットに出れないので、WiMaxルーター側のIPアドレス(192.168.100.10X - VyOSのeth0に割り当たったIPアドレス)に変換するよ。更にWiMaxルーター側でこれを本当のグローバルIPに変換しているんだろうけど、その辺はいいや。

vyos@vyos:~$ configure
vyos@vyos# set nat source rule 1 source address 172.16.1.0/24
vyos@vyos# set nat source rule 1 outbound-interface eth0     
vyos@vyos# set nat source rule 1 translation address masquerade
vyos@vyos# commit
vyos@vyos# save
vyos@vyos# exit

これで設定完了。ソースNAT。172.16.1.0/24のレンジのIPアドレスをマスカレード方式でeth0側のIPアドレスに変換する…で合ってるかな。

以上、ここまででVyOS上でdhcpサービスが稼働し、プライベートアドレスをRPiとiMacのen0に対して割り当ててくれるはず…!更にNATでRPiはインターネットに繋がるんじゃないかな!

接続の確認

iMac

まずはiMac側から、最初、en0に謎のIPアドレス(167.xxx.xxx.xxx うろ覚え)が割り振られていて?状態。ネットワークの設定画面を開く。

[システム環境設定] -> [ネットワーク]
  • Ethernetを選択
  • IPv4の設定 … DHCPサーバーを使用
    *「詳細」ボタンを押して、最初のタブ「TCP/IP」
  • 「DHCPリースを更新」ボタンをぽちっと

IPアドレス(172.16.1.200)をVyOS(172.16.1.1)から貰えた。やったぜ。

ついでにここで、ネットワークの優先度で「Wi-Fi」を「Ethernet」より高くしておく。こうしとかないとiMacがインターネットに繋がらなくなる。Ethernet側(プライベートネット)をデフォルトルートとして見ようとするのかな。残念、そっちじゃないんだ。

Raspberry Pi 2 Model B

最近届いたばかりの新しいやつ。スイッチを介してiMac(上のVyOS)に繋がっている。

  • おもむろに電源を繋ぐ。
  • iMacが172.16.1.200を貰ってたから、こいつは172.16.1.201かな?
yukaarybox:~ yukaary$ ssh pi@172.16.1.201
Linux raspberrypi 3.18.7-v7+ #755 SMP PREEMPT Thu Feb 12 17:20:48 GMT 2015 armv7l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sun Feb 22 06:54:10 2015 from 172.16.1.200
pi@raspberrypi ~ $ 

やったぜ。ちゃんとインターネットにも繋がるんだよ。

pi@raspberrypi ~ $ traceroute 8.8.8.8
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
 1  172.16.1.1 (172.16.1.1)  2.330 ms  2.079 ms  1.961 ms
 2  192.168.100.1 (192.168.100.1)  6.115 ms  6.021 ms  6.550 ms
 3  * * *
 4  * * *
 5  172.23.113.114 (172.23.113.114)  83.143 ms  83.268 ms  86.616 ms
 6  tm4BBAC04.bb.kddi.ne.jp (27.93.199.133)  86.978 ms  27.442 ms  51.828 ms
 7  otejbb206.bb.kddi.ne.jp (106.162.175.253)  52.459 ms otejbb206.bb.kddi.ne.jp (106.162.175.133)  34.010 ms otejbb206.int-gw.kddi.ne.jp (59.128.99.157)  46.505 ms
 8  ix-ote213.int-gw.kddi.ne.jp (59.128.5.90)  46.071 ms ix-ote213.int-gw.kddi.ne.jp (59.128.5.110)  48.596 ms  49.541 ms
 9  72.14.204.58 (72.14.204.58)  120.051 ms  120.324 ms  120.032 ms
10  72.14.237.70 (72.14.237.70)  58.954 ms 209.85.240.216 (209.85.240.216)  60.565 ms 72.14.236.185 (72.14.236.185)  43.049 ms
11  209.85.255.141 (209.85.255.141)  51.124 ms 209.85.254.177 (209.85.254.177)  51.268 ms 209.85.254.185 (209.85.254.185)  48.890 ms
12  google-public-dns-a.google.com (8.8.8.8)  62.058 ms  52.852 ms  51.117 ms

tracerouteで確認。ちゃんとVyOSルーターを介して外に出ていっているね。ここここれで、Rasberry Piを安定して利用する環境が整ったんじゃないかなっ。今まで突発的に接続切れる現象が多発して使いものにならなかったから…。